与「**耦合性 (計算機科學)**」標題相近或相同的条目，請見「**耦合**」。

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

而内聚性（英語：）是一個和耦合性相對的概念，一般而言低耦合性代表高内聚性，反之亦然。耦合性和内聚性都是由提出結構化設計概念的賴瑞·康斯坦丁（英语：）所提出。低耦合性是結構良好程式的特性，低耦合性程式的可讀性及可維護性會比較好。

耦合性的分類
------

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

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

子類別耦合（subclass coupling）描述子類別和父類別之間的關係，子類別連結到父類別，但父類別沒有連結到子類別。
時空耦合（temporal coupling）二個動作只因為同時間發生，就被包裝在一個模組中。
後來的研究提出了許多不同層面的耦合性，並且用來評估實務上各種的模組化法則的實施程度。

缺點
--

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

1. 一個模組的修改會產生漣漪效應，其他模組也需隨之修改。
2. 由於模組之間的相依性，模組的組合會需要更多的精力及時間。
3. 由於一個模組有許多的相依模組，模組的可復用性（英语：）低。

改善方法
----

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

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

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

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

耦合性和內聚性
-------

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

模組的耦合性
------

以下是一種計算模組耦合性的方法：

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

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

全域耦合：

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

環境耦合：

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

{\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-{\frac {1}{1+0+1+0+0+0+1+0}}=1-{\frac {1}{3}}=0.67

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

C=1-{\frac {1}{5+2\times 5+5+2\times 5+10+0+3+4}}=0.98

相關條目
----

* 相依性地狱
* 傳出耦合（英语：）
* 内聚力 (計算機科學)
* 物件導向程式設計用語列表（英语：）
* make
* 靜態程序分析
* 控制反转
* 鬆散耦合
* 死碼刪除

參考資料
----

1. ↑  W. Stevens, G. Myers, L. Constantine, "Structured Design", IBM Systems Journal, 13 (2), 115-139, 1974.
2. ↑  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
3. ↑  Pressman, Roger S. Ph.D (1982). Software Engineering - A Practitioner's Approach - Fourth Edition. ISBN 0-07-052182-4

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
統一建模語言（UML） |
| --- |
|  |
| 背景 | 

|  |  |
| --- | --- |
| 機構 | 对象管理组织（OMG） · UML Partners（英语：） |
|  |
| 個人 | 葛來迪·布區 · 伊瓦爾·雅各布森 · 詹姆士·蘭寶 |

 |
|  |
| 概念 | 

|  |  |
| --- | --- |
| 面向对象 | 面向对象的程序设计 |
|  |
| 结构 | 執行者（英语：） · 屬性（英语：） · 類 · 元件 · 接口 · 對象 · 包 |
|  |
| 行为 | 活動（英语：） · 事件（英语：） · 訊息 · 方法 · 操作 · 狀態（英语：） · 用例 |
|  |
| 关系 | 聚合 · 關聯 · 組合 · 相依 · 泛化（繼承) |
|  |
| 其他概念 | 構造型 · 多重性 · 角色 |

 |
|  |
| 图 | 

|  |  |
| --- | --- |
| 结构图 | 類別圖 · 元件圖 · 组合结构图 · 部署圖 · 物件圖 · 包圖 · 面图 |
|  |
| 行为图 | 活動圖 · 状态图 · 用例图 · 通信圖 · 交互概述圖 · 时序图 · 時間圖 |

 |
|  |
| 主题 | 關聯式資料庫模型（ERD）比較 · 統一建模語言術語彙表（英语：） · 系統建模語言（SysML） |
|  |
| 工具 | UML工具 · 统一软件开发过程 |

 |