低耦合,高内聚的详解(绝对全面)
轉載請注意出處:
這幾天又回顧了下java基礎,突然看見松耦合這個字眼,很是疑惑,于是通過上網閱讀多篇博客并結合翻閱的資料寫下了這篇博客。希望大家可以從中有所收獲。
一、耦合,內聚的了解(看懂就行,不用強背)
那么什么是耦合,什么是內聚呢?我來做個解釋。
內聚性:又稱塊內聯系。指模塊的功能強度的度量,即一個模塊內元素彼此之間結合的緊密程度的度量。若一個程序之間各元素之間(程序段之間)聯系緊密,則內聚性就高(高內聚)。
耦合性:又稱塊間聯系。指軟件系統各模塊之間相互緊密聯系程度的一種度量。模塊之間聯系越緊密,其耦合性就越強,模塊的獨立性就越差。相反其耦合性就越弱(低耦合)。
那么對于耦合,內聚的解釋網上都有(我也是拷貝了百度,看懂就好,不需要強背)
內聚:內聚有如下的種類,它們之間的內聚度由弱到強排列如下:
一、偶然內聚:一個模塊內的各處理元素之間沒有任何聯系,只是偶然地被湊到一起。這種模塊也稱為巧合內聚,內聚程度最低。
二、邏輯內聚:這種模塊把幾種相關的功能組合在一起, 每次被調用時,由傳送給模塊參數來確定該模塊應完成哪一種功能 。
三、時間內聚:把需要同時執行的動作組合在一起形成的模塊稱為時間內聚模塊。
四、過程內聚:構件或者操作的組合方式是,允許在調用前面的構件或操作之后,馬上調用后面的構件或操作,即使兩者之間沒有數據進行傳遞。簡單的說就是如果一個模塊內的處理元素是相關的,而且必須以特定次序執行則稱為過程內聚。
例如某要完成登錄的功能,前一個功能判斷網絡狀態,后一個執行登錄操作,顯然是按照特定次序執行的。
五、通信內聚:指模塊內所有處理元素都在同一個數據結構上操作或所有處理功能都通過公用數據而發生關聯(有時稱之為信息內聚)。即指模塊內各個組成部分都使用相同的數據結構或產生相同的數據結構。
六、順序內聚:一個模塊中各個處理元素和同一個功能密切相關,而且這些處理必須順序執行,通常前一個處理元素的輸出時后一個處理元素的輸入。
例如某要完成獲取訂單信息的功能,前一個功能獲取用戶信息,后一個執行計算均價操作,顯然該模塊內兩部分緊密關聯。?
順序內聚的內聚度比較高,但缺點是不如功能內聚易于維護。
七、功能內聚:模塊內所有元素的各個組成部分全部都為完成同一個功能而存在,共同完成一個單一的功能,模塊已不可再分。即模塊僅包括為完成某個功能所必須的所有成分,這些成分緊密聯系、缺一不可。
功能內聚是最強的內聚,其優點是它的功能明確。判斷一個模塊是否功能內聚,一般從模塊名稱就能看出。如果模塊名稱只有一個動詞和一個特定的目標(單數名詞),一般來說就是功能內聚,如:“計算水費”、“計算產值”等模塊。功能內聚一般出現在軟件結構圖的較低層次上。?
功能內聚模塊的一個重要特點是:他是一個“暗盒”,對于該模塊的調用者來說,只需要知道這個模塊能做什么,而不需要知道這個模塊是如何做的。
耦合:耦合可以分為以下幾種,它們之間的耦合度由高到低排列如下:
一、 內容耦合:一個模塊直接訪問另一模塊的內容,則稱這兩個模塊為內容耦合。?
若在程序中出現下列情況之一,則說明兩個模塊之間發生了內容耦合:?
1. 一個模塊直接訪問另一個模塊的內部數據。?
2. 一個模塊不通過正常入口而直接轉入到另一個模塊的內部。?
3. 兩個模塊有一部分代碼重疊(該部分代碼具有一定的獨立功能)。?
4. 一個模塊有多個入口。?
內容耦合可能在匯編語言中出現。大多數高級語言都已設計成不允許出現內容耦合。這種耦合的耦合性最強,模塊獨立性最弱。
二、公共耦合:一組模塊都訪問同一個全局數據結構,則稱之為公共耦合。公共數據環境可以是全局數據結構、共享的通信區、內存的公共覆蓋區等。如果模塊只是向公共數據環境輸入數據,或是只從公共數據環境取出數據,這屬于比較松散的公共耦合;如果模塊既向公共數據環境輸入數據又從公共數據環境取出數據,這屬于較緊密的公共耦合。?
公共耦合會引起以下問題:?
1. 無法控制各個模塊對公共數據的存取,嚴重影響了軟件模塊的可靠性和適應性。?
2. 使軟件的可維護性變差。若一個模塊修改了公共數據,則會影響相關模塊。?
3. 降低了軟件的可理解性。不容易清楚知道哪些數據被哪些模塊所共享,排錯困難。?
一般地,僅當模塊間共享的數據很多且通過參數傳遞很不方便時,才使用公共耦合。
三、外部耦合:一組模塊都訪問同一全局簡單變量,而且不通過參數表傳遞該全局變量的信息,則稱之為外部耦合。
四、控制耦合:模塊之間傳遞的不是數據信息,而是控制信息例如標志、開關量等,一個模塊控制了另一個模塊的功能。
五、標記耦合:調用模塊和被調用模塊之間傳遞數據結構而不是簡單數據,同時也稱作特征耦合。表就和的模塊間傳遞的不是簡單變量,而是像高級語言中的數據名、記錄名和文件名等數據結果,這些名字即為標記,其實傳遞的是地址。
六、數據耦合:調用模塊和被調用模塊之間只傳遞簡單的數據項參數。相當于高級語言中的值傳遞。
七、非直接耦合:兩個模塊之間沒有直接關系,它們之間的聯系完全是通過主模塊的控制和調用來實現的。耦合度最弱,模塊獨立性最強。
推薦博客:http://blog.csdn.net/walid1992/article/details/73278304
二、低耦合(也叫提高松耦合),高內聚
言歸正傳,那咱們就直入話題吧。
低耦合,高內聚的意思上面都有講到?,F在我們來看看為什么要設計這樣的軟件設計標準。
為什么要低耦合,高內聚
軟件設計當中經常使用耦合度和內聚度作為衡量模塊獨立的標準。
道理很簡單,耦合度很高的情況下,維護代碼時修改一個地方會牽連到很多地方,如果修改時沒有理清這些耦合關系,那么帶來的后果可能會是災難性的,特別是對于需求變化較多以及多人協作開發維護的項目,修改一個地方會引起本來已經運行穩定的模塊錯誤,嚴重時會導致惡性循環,問題永遠改不完,開發和測試都在各種問題之間奔波勞累,最后導致項目延期,用戶滿意度降低,成本也增加了,這對用戶和開發商影響都是很惡劣的,各種風險也就不言而喻了。
為了預防這些問題的發生,其中一個重要手段就是降低代碼的耦合度。但也不可能有絕對的零耦合,比如基于J2EE編程那就必須和JDK耦合,而且高耦合也不是一無是處,如果在設計前期預料到某功能后期基本不用修改,那么即使高耦合了也關系不大。
但是,在還沒有能力設計出基本不用修改的代碼前,還得要求以低耦合為標準。那么怎樣才能最大限度地降低耦合度呢?下面介紹降低耦合度的幾種方法。
低耦合的方法
1、一般情況下,下層的包內代碼依賴上層的包內代碼(例如:com.example.text.demo下的代碼依賴com.example.text的代碼),好處是把下層代碼移除,而上層代碼不受影響。但是部分上層代碼也是可以依賴下層代碼,具體詳情。
2、接口是提高系統之間松耦合的有力手段。例如電視機像遙控器公開了紅外線接收器接口,使得電視機和遙控器之間相互獨立,當電視機的內部實現發生變化時,比如由電子顯示器改為液晶顯示器,只要它的紅外線接收器接口不變,就不會影響遙控器的實現。
3、封裝有助于建立各個系統之間的松耦合關系,提高系統的獨立性。當某一個系統的實現發生變化時,只要它的接口不變,就不會影響到其他的系統。
4、抽象機制和動態綁定能公共提高系統之間的松耦合性。
5、模塊功能盡量單一。功能單一的模塊供其他模塊調用的機會就少。
6、遵循一個定義只在一個地方出現。
7、少使用全局變量
8、類屬性和方法的聲明少用public,多用private關鍵字。
9、多用設計模式,比如采用MVC的設計模式就可以降低界面與業務邏輯的耦合性
10、盡量不用“硬代碼”的方式寫程序,同時也避免直接用SQL語句操作數據庫。
11、最后避免直接操作或調用其他模板或類(內容耦合);如果模塊之間必須存在耦合,原則上盡量使用數據耦合,少用控制耦合。
推薦博客:http://blog.csdn.net/csh624366188/article/details/7183726
推薦書籍:《Java面向對象編程》-孫衛琴編著
菜鳥一只,如有不對之處請指出。您的鼓勵是我寫作的最大動力!
總結
以上是生活随笔為你收集整理的低耦合,高内聚的详解(绝对全面)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 理解Semaphore及其用法详解
- 下一篇: 搭建msys2基础开发平台