耦合的定義#
從一個抽象的定義出發:
耦合是兩個軟體元素之間的一種關係,它代表「一個元素以某種方式影響另一個元素」的能力。
我們希望元素之間是鬆耦合的——一個元素對另一個元素幾乎沒有影響。緊耦合則是其反面,一個元素對另一個元素有顯著影響,通常是各種開發與營運問題的根源,應盡量避免。
但「能影響另一個元素」「鬆耦合」「緊耦合」實際上是什麼意思?要回答這個問題,需要先區分四種不同類型的耦合。
四種耦合類型#
| 耦合類型 | 定義 | 主要影響 |
|---|---|---|
| 設計期耦合(design-time coupling) | 一個元素的變更多大機率會要求另一個元素也跟著改 | 開發期 |
| 建置期耦合(build-time coupling) | 一個元素變更時,另一個元素是否要重新編譯與重新測試 | 開發期 |
| 執行期耦合(runtime coupling) | 一個元素失敗會不會導致另一個元素失敗 | 執行期 |
| 基礎建設耦合(infrastructure coupling) | 兩個元素是否共用基礎設施(資料庫、叢集等),導致彼此影響 | 執行期 |

Figure 4.1: Four different types of coupling — design-time, build-time, runtime, infrastructure
設計期與建置期耦合主要影響開發特性;執行期與基礎建設耦合則影響執行期行為——尤其是可用性與延遲。
為何鬆耦合重要#
不同類型的鬆耦合,對應不同的價值:
鬆設計期耦合與鬆建置期耦合 → 流暢交付#
- 鬆設計期耦合讓變更被「局部化」,團隊能獨立、平行工作,個別開發者也更容易做修改。
- 鬆建置期耦合特別重要於大型程式碼庫——它讓部署管線只需重新建置與測試受影響的子專案,加速回饋。
鬆執行期耦合 → 高可用、低延遲#
- 若服務 A 緊執行期耦合於服務 B,B 故障會讓 A 跟著失敗,可用性下降。
- 緊執行期耦合也會增加延遲,因為多了網路 hop。
鬆基礎建設耦合 → 高可用#
- 兩個服務共用基礎設施時,一方搶走資源(CPU、頻寬、資料庫連線、鎖)會直接影響另一方。
- 一方的配置變更也可能波及另一方。
「鬆耦合」並非教條式追求極端——一定程度的耦合是不可避免的,完全消除耦合反而會付出大量成本。本章後續會說明:有些耦合可以利用「內聚(cohesion)」管理在合適的層級內,而不必硬要切開。