內聚與耦合的實例分析
一:內聚的分類與實例分析:
1.偶然性內聚:模塊內的各個任務在功能上沒有實質性聯系,純屬“偶然”因素組合了塊內各個互不相關的任務。
例如:一個處理正方形的模塊有兩個功能:計算面積,畫出這個正方形。
如何改進?
兩個模塊分別計算面積和畫圖。
常見錯誤:A模塊中有三條語句(一條賦值,一條求和,一條傳參),表面上看不出任何聯系,但是B、C模塊中都用到了這三條語句,於是將這三條語句獨立出來合並成了模塊A。模塊A中就是偶然內聚。
2.邏輯性內聚:模塊通常由若幹個邏輯功能相似的任務組成,通過模塊外引入的一個開關量選擇其一執行。這種內聚增大了模塊間的耦合。
舉例:一個模塊負責打印季度開支報告、月份開支報告和日開支報告,具體打印哪一個報告由傳入的控制標誌決定,這個模塊具有邏輯性內聚。
如何改進?
建立三個模塊,分別負責打印季度開支報告、月份開支報告和日開支報告。改進原來的模塊,讓它根據傳入的控制標誌來調用這三個模塊之一。
3.過程性內聚:模塊內的各個任務必須按照某一特定次序執行。
過程內聚與順序內聚的區別主要在於:順序內聚中是
數據流從一個處理單元流到另一個處理單元,而過程
內聚 中是控制流從一個動作流向另一個動作。
4.時間性內聚:模塊內的各個任務由相同的執行時間聯系在一起。例如,初始化模塊,緊急故障處理模塊。
5. 功能性內聚:模塊各個成分結合在一起,完成一個特定的功能。功能性模塊具有內聚性最強、與其他模塊聯系少的特點。
一個模塊根據員工出生日期計算員工年齡,該模塊具有功能性內聚。
6.順序性內聚:模塊內的各個任務是順序執行的。通常,上一個任務的輸出是下一個任務的輸入。
一個模塊根據員工出生日期計算員工年齡、退休時間,
如果是根據員工出生日期計算員工年齡,再由員工年齡計算其退休時間,該模塊就具有順序性內聚;
7. 通信性內聚:模塊內部的各個任務靠公用數據聯系在一起,即都使用同一個輸入數據,或者產生同一個輸出數據。
如果是根據員工出生日期分別計算員工年齡和退休時間,該模塊就具有通信性內聚。
如何改進?
改為兩個模塊,一個模塊根據員工出生日期計算年齡,一個模塊根據員工出生日期計算退休時間
二.耦合的分類及實例分析
耦合性是對一個軟件結構內不同模塊之間互連程度的度量。
耦合性的強弱取決於模塊間接口的復雜程度,以及通過接口的數據類型和數目。
1. 非直接耦合:同級模塊相互之間沒有信息傳遞,屬於非直接耦合。
一個是處理正方形面積的模塊,一個是處理訂單打印的模塊;
2. 數據耦合:調用下屬模塊時,如果交換的都是簡單變量,便構成數據耦合。
sum(int a,int b)
{int c;
c=a+b;
return(c);
}
main()
{int x,y;
.
.
.printf("x+y=%d",sum(x,y));
}
主函數與sum函數之間即為數據耦合關系
3.特征耦合:調用下屬模塊時,如果交換的是數據結構,便構成特征耦合。由於傳遞的是數據結構,不僅數據量增加,而且會使模塊的相關性增加。
sum(int a[],int b)
{int c=0;
for(int i=0;i<=b;i++)
{
c=c+a[i];
}
return(c);
}
main()
{int x;
int y[10];
.
.
.printf("%d",sum(x,y));
}
主函數與sum函數之間即為特征耦合關系
4.控制耦合:模塊間傳遞的信息不是一般的數據,而是作為控制信息的開關值或標誌量。
例如,邏輯性內聚的模塊調用就是典型的控制耦合。
void output(flag)
{
if(flag)printf("OK!");
else printf("NO!");
}
main()
{int flag;
..
..
..
output(flag);
}
主函數與output函數之間即為控制耦合關系.
5.外部耦合:若允許一組模塊訪問同一個全局變量,可稱它們為外部耦合。
static int i;
int main(){
sum(i);
add(i);
return 0;
}
sum()和add()為兩個模塊
6.公共耦合:若允許一組模塊訪問同一個全局性的數據結構,則稱它們為公共耦合。全局性的數據結構可以是共享的通信區、公共的內存區域、任何存儲介質文件、物理設備等。
松散的公共耦合 緊密的公共耦合
7.內容耦合:若一個模塊可以直接訪問另一個模塊中的內部數據,或者一個模塊直接轉到另一個模塊的內部,或者一個模塊有多個入口,則稱為內容耦合。如:goto語句
class A {
public int m;
}
class B{
A a = new A();
a. m += 1;
}
應改為
class A {
private int m;
}
function a(){
return ‘kk‘;
}
function b(){
alert(a());
}
b();
應改為:
重構成
a 不變
function b(p1){
alert(p1);
}
b(a());
後續有待更改......
內聚與耦合的實例分析