1. 程式人生 > >內聚與耦合的實例分析

內聚與耦合的實例分析

text lists 更改 分享圖片 動作 new 似的 其他 png

一:內聚的分類與實例分析:

技術分享圖片

1.偶然性內聚:模塊內的各個任務在功能上沒有實質性聯系,純屬“偶然”因素組合了塊內各個互不相關的任務。

例如:一個處理正方形的模塊有兩個功能:計算面積,畫出這個正方形。

如何改進?

兩個模塊分別計算面積和畫圖。

常見錯誤:A模塊中有三條語句(一條賦值,一條求和,一條傳參),表面上看不出任何聯系,但是BC模塊中都用到了這三條語句,於是將這三條語句獨立出來合並成了模塊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());

後續有待更改......

內聚與耦合的實例分析