天天看點

面向對象中的聚合與耦合

寫的程式多了,慢慢感覺子產品之間的耦合和聚合是那麼的重要,一個項目肯定會有不同的功能和子產品,這樣的話肯定要做到“高内聚,低耦合”,那麼到底什麼是“高内聚,低耦合”,下面就以自己的淺薄的認識來為大家講解下,又不足的地方還望指點。

因為聚合與耦合這兩個概念一直都是以"高聚合、低耦合"的形式出現的,剛剛開始接觸面向對象設計時,我一直認為聚合和耦合是一對相反的概念,也就是說:隻要做到了高聚合,那麼自然而然就做到了低耦合。雖然這樣的了解并不是錯誤的,但我并沒有思考過原因。

先來看看聚合的定義:聚合(Cohesion)是一個子產品内部各成分之間相關聯程度的度量。

這裡有多個含義值得考慮。首先,聚合是對一個子產品内部的度量,這也是許多情況下我們把聚合稱之為内聚的原因。第二,這裡出現的子產品是廣義的子產品,它可能是子系統,可能是功能子產品,也可能是功能子產品中的某一個類。從不同的層次看,聚合的程度也會有所不同。至于為什麼不同,後面會有解釋。第三,子產品的成分包括子產品的行為和狀态。要做到高聚合,那麼子產品内部的行為必須要與子產品的内部狀态緊密關聯。通俗來講,一個子產品僅完成一個獨立的功能,子產品内部不存在與該功能無關的操作或狀态。

再來看看耦合的定義:耦合(Couping)是子產品之間相關聯程度的度量。相對于聚合的内向性,耦合關注的是某一子產品和其他子產品之間的關聯性。也就是說子產品之間的關聯盡量越少越好。

耦合主要指不同對象之間互相關聯的程度。如果一個對象過多地依賴于其它對象來完成自己的工作,則不僅使該對象的可了解性下降,而且還會增加測試、修改的難度,同時降低了類的可重用性和可移植性。對象不可能是完全孤立的,當兩個對象必須互相聯系時,應該通過類的公共接口實作耦合,不應該依賴于類的具體實作細節。

互動耦合——如果對象之間的耦合是通過消息連接配接來實作的,則這種耦合就是互動耦合。在設計時應該盡量減少對象之間發送的消息數和消息中的參數個數,降低消息連接配接的複雜程度。 繼承耦合——繼承耦合是一般化類與特殊化類之間的一種關聯形式,設計時應該适當使用這種耦合。在設計時要特别認真分析一般化類與特殊化類之間繼承關系,如果抽象層次不合理,可能會造成對特殊化類的修改影響到一般化類,使得系統的穩定性降低。另外,在設計時特殊化類應該盡可能多地繼承和使用一般化類的屬性和服務,充分利用繼承的優勢。

繼續閱讀