耦合的定義#

從一個抽象的定義出發:

耦合是兩個軟體元素之間的一種關係,它代表「一個元素以某種方式影響另一個元素」的能力。

我們希望元素之間是鬆耦合的——一個元素對另一個元素幾乎沒有影響。緊耦合則是其反面,一個元素對另一個元素有顯著影響,通常是各種開發與營運問題的根源,應盡量避免。

但「能影響另一個元素」「鬆耦合」「緊耦合」實際上是什麼意思?要回答這個問題,需要先區分四種不同類型的耦合

四種耦合類型#

耦合類型定義主要影響
設計期耦合(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)」管理在合適的層級內,而不必硬要切開。