关于与「
耦合性 (計算機科學) 」標題相近或相同的条目,請見「
耦合 」。
耦合性 (英語:Coupling )或稱耦合力 或耦合度 ,是一種軟體度量 ,是指一程式中,模組 及模組之間資訊或參數依赖的程度。
而内聚性 (英語:Cohesion )是一個和耦合性相對的概念,一般而言低耦合性代表高内聚性,反之亦然。耦合性和内聚性都是由提出結構化設計概念的賴瑞·康斯坦丁 所提出[ 1] 。低耦合性是結構良好程式 的特性,低耦合性程式的可讀性及可維護性會比較好。
耦合性的分類
耦合性的概念模型
耦合性可以是低耦合性(或稱為鬆散耦合),也可以是高耦合性(或稱為緊密耦合)。以下列出一些耦合性的分類,從高到低依序排列:
內容耦合(content coupling,耦合度最高)
也稱為病态耦合(pathological coupling)当一个模块直接使用另一个模块的内部数据,或通过非正常入口而转入另一个模块内部。
共用耦合/公共耦合(common coupling)
也稱為全局耦合(global coupling.)指通过一个公共数据环境相互作用的那些模块间的耦合。公共耦合的复杂程度随耦合模块的个数增加而增加。
外部耦合(external coupling)
發生在二個模組共用一個外加的資料格式、通訊協定或是設備界面,基本上和模組和外部工具及設備的溝通有關。
控制耦合(control coupling)
指一个模块调用另一个模块时,传递的是控制变量(如开关、标志等),被调模块通过该控制变量的值有选择地执行块内某一功能;
特徵耦合/标记耦合(stamp coupling)
也稱為資料結構耦合,是指幾個模組共享一個複雜的資料結構,如高级语言中的数组名、记录名、文件名等这些名字即标记,其实传递的是这个数据结构的地址;
資料耦合/数据耦合(data coupling)
是指模組藉由傳入值共享資料,每一個資料都是最基本的資料,而且只分享這些資料(例如傳遞一個整數給計算平方根的函數)。
訊息耦合(message coupling,是無耦合之外,耦合度最低的耦合)
可以藉由以下二個方式達成:狀態的去中心化(例如在物件中),組件間利用傳入值或訊息傳遞 來通訊。
無耦合:模組完全不和其他模組交換資訊。
物件導向程式設計
子類別耦合(subclass coupling)
描述子類別和父類別之間的關係,子類別連結到父類別,但父類別沒有連結到子類別。
時空耦合(temporal coupling)
二個動作只因為同時間發生,就被包裝在一個模組中。
後來的研究提出了許多不同層面的耦合性,並且用來評估實務上各種的模組化法則的實施程度[ 2] 。
缺點
緊密耦合的系統在開發階段有以下的缺點:
一個模組的修改會產生漣漪效應 ,其他模組也需隨之修改。
由於模組之間的相依性,模組的組合會需要更多的精力及時間。
由於一個模組有許多的相依模組,模組的可復用性 低。
改善方法
機能設計 是一種可以降低耦合性的方法,此方法以機能性的角度設法限制各模組需負責的事務。在類別A 及B 之間,若有以下任何一種情形,會提高二者的耦合性:
A 有一個屬性是參考類別B (此屬性的形態為類別B )
A 呼叫物件B 提供的服務
A 有一個方法會參考類別B (此方式會傳回一形態為類別B 的物件)
A 是類別B 的子類別。
鬆散耦合是指二個彼此相關的模組,其中的介面是一個簡單而穩定的介面,且其介面和任一模組內部的實現方式無關(參考信息隐藏 )。
像CORBA 或组件对象模型 等系統,允許一物件在不知道另一物件實現方式的情形下和另一物件互動。這類系統甚至允許一物件和用其他語言撰寫的物件進行互動。
耦合性和內聚性
耦合性和內聚性 二個名詞常一起出現,用來表示一個理想模組需要有的特點,也就是低耦合性及高內聚性。耦合性著重於不同模組之間的相依性,而內聚性著重於一模組中不同功能之間的關聯性。低內聚性表示一個模組中的各機能之間沒什麼關聯,當模組擴充時常常會出現問題。
模組的耦合性
以下是一種計算模組耦合性的方法[ 3] :
對於資料和控制流的耦合:
di :輸入資料參數的個數
ci :輸入控制參數的個數
do :輸出資料參數的個數
co :輸出控制參數的個數
全域耦合:
gd :用來儲存資料的全域變數
gc :用來控制的全域變數
環境耦合:
w :此模組呼叫的模組個數(扇出 )
r :呼叫此模組的模組個數(扇入 )
C
o
u
p
l
i
n
g
(
C
)
=
1
−
1
d
i
+
2
×
c
i
+
d
o
+
2
×
c
o
+
g
d
+
2
×
g
c
+
r
+
w
{\displaystyle \mathrm {Coupling} (C)=1-{\frac {1}{d_{i}+2\times c_{i}+d_{o}+2\times c_{o}+g_{d}+2\times g_{c}+r+w}}}
若Coupling(C)
數值越大,表示模組耦合的情形越嚴重,數值一般會界於0.67(低度耦合)到1.0(高度耦合)之間。
舉例,若一模組只有一個輸入資料參數,一個輸出資料參數:
C
=
1
−
1
1
+
0
+
1
+
0
+
0
+
0
+
1
+
0
=
1
−
1
3
=
0.67
{\displaystyle C=1-{\frac {1}{1+0+1+0+0+0+1+0}}=1-{\frac {1}{3}}=0.67}
若一模組的輸入資料參數、輸入控制參數、輸出資料參數及輸出控制參數都是5個,存取10個全域變數,扇出和扇入的模組個數別是3個及4個:
C
=
1
−
1
5
+
2
×
5
+
5
+
2
×
5
+
10
+
0
+
3
+
4
=
0.98
{\displaystyle C=1-{\frac {1}{5+2\times 5+5+2\times 5+10+0+3+4}}=0.98}
相關條目
參考資料
^ W. Stevens, G. Myers, L. Constantine, "Structured Design", IBM Systems Journal, 13 (2), 115-139, 1974.
^ F. Beck, S. Diehl. On the Congruence of Modularity and Code Coupling. In Proceedings of the 19th ACM SIGSOFT Symposium and the 13th European Conference on Foundations of Software Engineering (SIGSOFT/FSE '11), Szeged, Hungary, September 2011. doi:10.1145/2025113.2025162
^ Pressman, Roger S. Ph.D (1982). Software Engineering - A Practitioner's Approach - Fourth Edition. ISBN 0-07-052182-4