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