耦合性 (計算機科學)

耦合性（）或稱耦合力或耦合度，是一種軟體度量，是指一程式中，模組及模組之間資訊或參數依赖的程度。

而内聚性（）是一個和耦合性相對的概念，一般而言低耦合性代表高内聚性，反之亦然。耦合性和内聚性都是由提出結構化設計概念的所提出W. Stevens, G. Myers, L. Constantine, "Structured Design", IBM Systems Journal, 13 (2), 115-139, 1974.。低耦合性是結構良好程式的特性，低耦合性程式的可讀性及可維護性會比較好。

耦合性的分類
耦合性可以是低耦合性（或稱為鬆散耦合），也可以是高耦合性（或稱為緊密耦合）。以下列出一些耦合性的分類，從高到低依序排列：

內容耦合（content coupling，耦合度最高）也稱為病态耦合（pathological coupling）当一个模块直接使用另一个模块的内部数据，或通过非正常入口而转入另一个模块内部。
共用耦合/公共耦合（common coupling）也稱為全局耦合（global coupling.）指通过一个公共数据环境相互作用的那些模块间的耦合。公共耦合的复杂程度随耦合模块的个数增加而增加。
外部耦合（external coupling）發生在二個模組共用一個外加的資料格式、通訊協定或是設備界面，基本上和模組和外部工具及設備的溝通有關。
控制耦合（control coupling）指一个模块调用另一个模块时，传递的是控制变量（如开关、标志等），被调模块通过该控制变量的值有选择地执行块内某一功能;
特徵耦合/标记耦合（stamp coupling）也稱為資料結構耦合，是指幾個模組共享一個複雜的資料結構，如高级语言中的数组名、记录名、文件名等这些名字即标记，其实传递的是这个数据结构的地址;
資料耦合/数据耦合（data coupling）是指模組藉由傳入值共享資料，每一個資料都是最基本的資料，而且只分享這些資料（例如傳遞一個整數給計算平方根的函數）。
訊息耦合（message coupling，是無耦合之外，耦合度最低的耦合）可以藉由以下二個方式達成：狀態的去中心化（例如在物件中），組件間利用傳入值或訊息傳遞來通訊。
無耦合：模組完全不和其他模組交換資訊。

物件導向程式設計
子類別耦合（subclass coupling）描述子類別和父類別之間的關係，子類別連結到父類別，但父類別沒有連結到子類別。
時空耦合（temporal coupling）二個動作只因為同時間發生，就被包裝在一個模組中。

後來的研究提出了許多不同層面的耦合性，並且用來評估實務上各種的模組化法則的實施程度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。

 缺點 
緊密耦合的系統在開發階段有以下的缺點：

 一個模組的修改會產生漣漪效應，其他模組也需隨之修改。
 由於模組之間的相依性，模組的組合會需要更多的精力及時間。
 由於一個模組有許多的相依模組，模組的低。

 改善方法 
是一種可以降低耦合性的方法，此方法以機能性的角度設法限制各模組需負責的事務。在類別A及B之間，若有以下任何一種情形，會提高二者的耦合性：

A有一個屬性是參考類別B（此屬性的形態為類別B）
A呼叫物件B提供的服務
A有一個方法會參考類別B（此方式會傳回一形態為類別B的物件）
A是類別B的子類別。

鬆散耦合是指二個彼此相關的模組，其中的介面是一個簡單而穩定的介面，且其介面和任一模組內部的實現方式無關（參考信息隐藏）。

像CORBA或组件对象模型等系統，允許一物件在不知道另一物件實現方式的情形下和另一物件互動。這類系統甚至允許一物件和用其他語言撰寫的物件進行互動。

 耦合性和內聚性 
耦合性和內聚性二個名詞常一起出現，用來表示一個理想模組需要有的特點，也就是低耦合性及高內聚性。耦合性著重於不同模組之間的相依性，而內聚性著重於一模組中不同功能之間的關聯性。低內聚性表示一個模組中的各機能之間沒什麼關聯，當模組擴充時常常會出現問題。

 模組的耦合性 
以下是一種計算模組耦合性的方法Pressman, Roger S. Ph.D (1982).  Software Engineering - A Practitioner's Approach - Fourth Edition.  ISBN 0-07-052182-4：

對於資料和控制流的耦合：

 di：輸入資料參數的個數
 ci：輸入控制參數的個數
 do：輸出資料參數的個數
 co：輸出控制參數的個數

全域耦合：

 gd：用來儲存資料的全域變數
 gc：用來控制的全域變數

環境耦合：

 w：此模組呼叫的模組個數（扇出）
 r：呼叫此模組的模組個數（扇入）

若Coupling(C)數值越大，表示模組耦合的情形越嚴重，數值一般會界於0.67（低度耦合）到1.0（高度耦合）之間。

舉例，若一模組只有一個輸入資料參數，一個輸出資料參數：

若一模組的輸入資料參數、輸入控制參數、輸出資料參數及輸出控制參數都是5個，存取10個全域變數，扇出和扇入的模組個數別是3個及4個：

相關條目
相依性地狱

内聚力 (計算機科學)

make
靜態程序分析
控制反转
鬆散耦合
死碼刪除

參考資料

Category:面向对象的程序设计
Category:软件架构
Category:軟體度量

fr:Dépendance logicielle