高內聚、低耦合的定義:
內聚:每個模塊盡可能獨立完成自己的功能,不依賴於模塊外部的代碼。
耦合:模塊與模塊之間接口的復雜程度,模塊之間聯系越復雜耦合度越高,牽一發而動全身。
目的:使得模塊的“可重用性”、“移植性”大大增強
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
內聚
內聚是從功能角度來度量模塊內的聯系,一個好的內聚模塊應當恰好做一件事,它描述的是模塊內部的功能聯系。
內聚性:
稱塊內聯系,指模塊的功能強度的度量,系一個模塊內部各個元素彼此間結合的緊密程度的度量。
若一個模塊內各個元素聯系的越緊密,它的內聚性就越高。
高內聚:
指一個軟件模塊是由相關性很強的代碼組成,只負責一項任務,也就是常說的單一職責原則。內聚分類:↓
①偶然內聚
一個模塊內的各處理元素之間沒有任何聯系,只是偶然地被湊到一起。這種模塊也稱為巧合內聚,內聚程度最低。
②邏輯內聚
把幾種相關的功能組合在一起, 每次被調用時,由傳送給模塊參數來確定該模塊應完成哪一種功能 。
③時間內聚
把需要同時執行的動作組合在一起形成的模塊稱為時間內聚模塊。
④過程內聚
簡單的說就是如果一個模塊內的處理元素是相關的,而且必須以特定次序執行則稱為過程內聚。
⑤通信內聚
即指模塊內各個組成部分都使用相同的數據據結構或產生相同的數據結構。有時稱之為信息內聚。
⑥順序內聚
一個模塊中各個處理元素和同一個功能密切相關,而且這些處理必須順序執行,通常前一個處理元素的輸出時后一個處理元素的輸入。
⑦功能內聚
即模塊僅包括為完成某個功能所必須的所有成分,這些成分緊密聯系、缺一不可。
最強的內聚。
內聚總結:
在模塊划分時,要遵循“一個模塊,一個功能”的原則,盡可能使模塊達到功能內聚。
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
耦合
耦合是軟件結構中各個模塊之間相互連接的一種度量,耦合強弱取決於模塊間接口的復雜程度、進入或訪問一個模塊的點以及通過接口的數據。
耦合性:
稱塊間聯系,指軟件系統結構中各個模塊間相互聯系機密程度的一種度量。
模塊間的聯系越緊密耦合度就越高,模塊的獨立性也就越差。
模塊間耦合度的高低取決於模塊間接口的復雜性、調用的方式、傳遞的信息。
低耦合:
簡單理解,一個完整的系統,模塊與模塊之間,盡可能的使其獨立存在。
讓每一個模塊盡可能獨立完成某個特定的子功能。
模塊之間的接口應該盡量少而簡單。
耦合分類:↑
①內容耦合
一個模塊直接訪問另一模塊的內容,則稱這兩個模塊為內容耦合。
②公共耦合
一組模塊都訪問同一個全局數據結構,則稱之為公共耦合。
③外部耦合
一組模塊都訪問同一全局簡單變量,而且不通過參數表傳遞該全局變量的信息,則稱之為外部耦合。
④控制耦合
模塊之間傳遞的不是數據信息,而是控制信息例如標志、開關量等,一個模塊控制了另一個模塊的功能。
⑤標記耦合
調用模塊和被調用模塊之間傳遞數據結構而不是簡單數據,同時也稱作特征耦合。
⑥數據耦合
調用模塊和被調用模塊之間只傳遞簡單的數據項參數。相當於高級語言中的值傳遞。
⑦非直接耦合
兩個模塊之間沒有直接關系,它們之間的聯系完全是通過主模塊的控制和調用來實現的。耦合度最弱,模塊獨立性最強。
耦合總結,模塊間不可避免會出現耦合,但應該遵循:
①盡量使用數據耦合;
②減少控制耦合;
③慎用或有控制的使用公共耦合,並限制公共耦合的范圍;
④盡量避免內容耦合。
通常程序結構中各模塊的內聚程度越高,模塊間的耦合程度就越低
對於函數來說:
高內聚:盡可能類的每個成員方法只完成一件事(最大限度的聚合)
低耦合:減少類內部,一個成員方法調用另一個成員方法
對於類來說:
高內聚低耦合:減少類內部,對其他類的調用
對於功能塊來說:
高內聚低耦合:減少模塊之間的交互復雜度(接口數量,參數數據)
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
耦合的划分,它們之間的耦合度由高到低排列如下:
(1) 內容耦合:一個模塊直接訪問另一模塊的內容,則稱這兩個模塊為內容耦合。
若在程序中出現下列情況之一,則說明兩個模塊之間發生了內容耦合:
-
一個模塊直接訪問另一個模塊的內部數據。
-
一個模塊不通過正常入口而直接轉入到另一個模塊的內部。
-
兩個模塊有一部分代碼重疊(該部分代碼具有一定的獨立功能)。
-
一個模塊有多個入口。
內容耦合可能在匯編語言中出現。大多數高級語言都已設計成不允許出現內容耦合。這種耦合的耦合性最強,模塊獨立性最弱。
(2) 公共耦合:一組模塊都訪問同一個全局數據結構,則稱之為公共耦合。公共數據環境可以是全局數據結構、共享的通信區、內存的公共覆蓋區等。如果模塊只是向公共數據環境輸入數據,或是只從公共數據環境取出數據,這屬於比較松散的公共耦合;如果模塊既向公共數據環境輸入數據又從公共數據環境取出數據,這屬於較緊密的公共耦合。
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
耦合帶來的問題:
代碼可維護性差、理解性差、新增功能模塊繁瑣。
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
高內聚低耦合的優勢:
事實上,短期來看,並沒有很明顯的好處,甚至短期內會影響系統的開發進度,因為高內聚,低耦合的系統對開發設計人員提出了更高的要求。高內聚,低耦合的好處體現在系統持續發展的過程中,高內聚,低耦合的系統具有更好的重用性,維護性,擴展性,可以更高效的完成系統的維護開發,持續的支持業務的發展,而不會成為業務發展的障礙。