軟件架構中的九種耦合形式
沒有任何軟件系統(tǒng)可以擺脫依賴關系,或者保證即使依賴組件發(fā)生變化也不會產生任何影響。軟件架構師總是要處理相互連接的組件之間的依賴程度,并盡量減少甚至消除這種影響。如果軟件組件 A 在如下情況下需要軟件組件 B,那么軟件組件 A 就依賴于軟件組件 B:
- 運行時編譯
- 安裝
- 測試
- 正常運行
耦合是任意架構構件之間的依賴程度。
在不同抽象層次上,存在著不同類型的耦合。耦合不僅發(fā)生在源代碼層面,還發(fā)生在基礎架構以及其他方面。軟件架構師需要了解這些類型,以便在設計這些組件時做出正確決定。我們將根據 ISAQB 軟件架構認證課程來了解這些耦合類型。
通過使用/委托耦合
這種耦合是經典耦合之一?;旧希绻?A 調用類 B 的公有變量,它們就會通過使用/委托耦合在一起。最好的解決方法是將這些公有變量私有化,并通過 getter 調用它們。
通過組合耦合
在組合關系中,正如面向對象編程中所定義的,類 A 包含類 B。在某些情況下,類 B 可以是類 A 的內部部分,并不獨立存在。因此,這些類通過組合關系耦合在一起。
通過構建耦合
這類耦合出現(xiàn)在工廠、抽象工廠等構建設計模式中。在這些設計模式中,類 A 或 B 的構建被委托給工廠類。也就是說,類 A 或 B 是通過構建與工廠類耦合的。
通過繼承耦合
子類繼承超類的屬性和方法的一種依賴關系。通過繼承產生的耦合非常嚴格,因為父類做什么,子類就做什么。
通過信息或事件耦合
消息傳遞中間件和事件存儲廣泛用于組件之間的松散耦合。在消息傳遞中,通信是異步的,發(fā)送方的請求被發(fā)送到消息隊列中,接收方從隊列中獲取請求。發(fā)送方可能知道也可能不知道哪個接收方收到了請求,也不會立即回復。在事件處理中,想法與消息傳遞類似,但這里的狀態(tài)變化是按時間順序傳遞給監(jiān)聽者的。由于這種通信也是異步的,耦合非常松散,因此非常受歡迎。
時序耦合
在這種耦合中,如果 A 組件在 B 組件提供某些輸出之前無法執(zhí)行其工作,那么 A 組件就會暫時依賴于 B 組件。在這種耦合中,組件 A 和組件 B 不需要使用相同的編程語言或基礎設施。例如,要在電商網站中購買一些商品,首先需要選擇并將商品添加到購物車中。
通過數(shù)據類型耦合
根據業(yè)務需要,開發(fā)者會創(chuàng)建一些自定義數(shù)據類型以供進一步使用。例如,在 JPA 中創(chuàng)建的 UserEntity 與數(shù)據庫中的 User 表相對應。因此,UserEntity 將成為軟件系統(tǒng)中的核心數(shù)據類型,在任何需要處理用戶數(shù)據的地方都可以使用。如果 UserEntity 有微小的變化,所有依賴類都會受到影響。這就是通過數(shù)據類型實現(xiàn)的耦合。
通過數(shù)據耦合
當組件 A 在數(shù)據庫、配置文件或環(huán)境變量中持久化保存信息,而組件 B 也與之通信時,就會出現(xiàn)數(shù)據耦合。如果一個組件的變化通過這些耦合數(shù)據影響到另一個組件,那么很可能需要松開這些耦合。
通過硬件耦合
設想有一個物理硬件或服務器,組件 A 在內存位置寫入了一些內容,組件 B 在讀取這些內容時也會受到影響。這種耦合是通過硬件實現(xiàn)的,經常發(fā)生在底層編程中。