模塊獨立性由兩個定性標準度量
- 模塊自身的內聚
- 模塊之間的耦合
內聚性分類:
- 偶然性內聚(最很差的一種內聚):模塊內的各個任務在功能上沒有實質性聯繫,純屬「偶然」因素組合了塊內各個互不相關的任務。
一個處理正方形的模塊有兩個功能:計算面積,畫出這個正方形。數據結構
改進:分紅兩個模塊,計算面積和畫出正方形spa
- 邏輯性內聚:模塊一般由若干個邏輯功能類似的任務組成,經過模塊外引入的一個開關量選擇其一執行。這種內聚增大了模塊間的耦合。
一個模塊負責打印季度開支報告、月份開支報告和日開支報告,具體打印哪個報告由傳入的控 制標誌決定,這個模塊具備邏輯性內聚。3d
改進:創建三個模塊分別負責打印季度開支報告、月份開支報告和日開支報告。改進原來的模 塊,根據傳入的控制標誌來調用這三個模塊中的一個。blog
- 時間性內聚:模塊內的各個任務由相同的執行時間聯繫在一塊兒。
特色:同時進行,並不是順序執行。內存
初始化模塊,緊急故障處理模塊。class
-
過程性內聚:模塊內的各個任務必須按照某一特定次序執行。變量
特色:控制流從一個動做 —> 另外一個動做im
- 通訊性內聚:模塊內部的各個任務靠公用數據聯繫在一塊兒,即都使用同一個輸入數據,或者產生同一個輸出數據。
若是是根據員工出生日期分別計算員工年齡和退休時間,該模塊就具備通訊性內聚(同一個輸入數據)。d3
改進:改爲兩個模塊:根據員工出生日期算員工年齡從一個處理單元流到另外一個和根據員工出生日期算退休時間。通信
-
順序性內聚:模塊內的各個任務是順序執行的。一般,上一個任務的輸出是下一個任務的輸入。
特色:數據流從一個處理單元流到另外一個處理單元。
模塊根據員工出生日期計算員工年齡,再由員工年齡計算其退休時間,該模塊就具備順序性內聚
改進:改爲兩個模塊,把功能分解。
- 功能性內聚:模塊各個成分結合在一塊兒,完成一個特定的功能。功能性模塊具備內聚性最強、與其餘模塊聯繫少的特色。
一個模塊根據員工出生日期計算員工年齡,該模塊具備功能性內聚。
耦合性分類
- 非直接耦合:同級模塊相互之間沒有信息傳遞,屬於非直接耦合。
- 數據耦合:調用下屬模塊時,若是交換的都是簡單變量,便構成數據耦合。
- 特徵耦合:調用下屬模塊時,若是交換的是數據結構,便構成特徵耦合。
因爲傳遞的是數據結構,不只數據量增長,並且會使模塊的相關性增長。
- 控制耦合:模塊間傳遞的信息不是通常的數據,而是做爲控制信息的開關值或標誌量。 邏輯性內聚的模塊的調用就是控制耦合。
- 外部耦合:若容許一組模塊訪問同一個全局變量,可稱它們爲外部耦合。
鬆散的公共耦合 緊密的公共耦合
- 公共耦合:若容許一組模塊訪問同一個全局性的數據結構,則稱它們爲公共耦合。
全局性的數據結構能夠是共享的通訊區、公共的內存區域、任何存儲介質文件、物理設備等。
- 內容耦合:若一個模塊能夠直接訪問另外一個模塊中的內部數據,或者一個模塊直接轉到另外一個模塊的內部,或者一個模塊有多個入口,則稱爲內容耦合。
是最強的耦合,每每是被稱爲「病態」的塊間聯繫。
例: class A {
public int m;
}
class B{
A a = new A();
a. m += 1;
}
應改成
class A {
private int m;
}