關于依賴和耦合:從小國寡民到和諧社會

  在老子的“小國寡民”論中,提出了一種理想的社會狀態:鄰國相望,雞犬之聲相聞,民至老死,不相往來。這是他老人家的一種社會理想,老死不相往來的人群呈現了一片和諧景象。因為不發生瓜葛,也無所謂關聯,進而無法導致沖突。這是先祖哲學中的至純哲理,但理想的大同總是和現實的生態有著或多或少的差距,人類社會無法避免聯系的發生,所以小國寡民的理想成為一種美麗的夢想,不可實現。同樣的道理,映射到軟件“社會”中,也是軟件系統結構中,也預示著不同的層次、模塊、類型之間也必然存在著或多或少的聯系,這種聯系不可避免但可管理。正如人類社會雖然無法實現小國寡民,但是理想的狀態下我們推崇和諧社會,把人群的聯系由復雜變為簡單,由曲折變為統一,同樣可以使得這種關聯很和諧。所以,軟件系統的使命也應該朝著和諧社會的目標前進,對于不同的關系處理,使用一套行之有效的哲學,把復雜問題簡單化,把僵化問題柔性化,這種哲學或者說方法,在我看來是:依賴的哲學,也是本文所要闡釋的中心思想。

  因為“耦合是不可避免的”,所以首先從認識依賴和耦合的概念開始,來一步步闡釋依賴的哲學思想。

  (1)什么是依賴和耦合

  依賴,是關系,代表了軟件實體之間的聯系。軟件的實體可能是模塊,可能是層次,也可能是具體的類型,不同的實體直接發生依賴,也意味著發生了耦合。所以,依賴和耦合在我看來是對一個問題的兩種表達,依賴闡釋了耦合本質,而耦合量化了依賴程度。因此,對于關系的描述方式,可以從兩個方面的觀點來分析。

  從依賴的角度而言,可以分類為:

  ● 無依賴,代表沒有發生任何聯系,所以二者相互獨立,互不影響,沒有耦合關系。

  ● 單向依賴,關系雙方的依賴是單向的,代表了影響的方向也是單向的,其中一個實體發生改變,會對另外的實體產生影響,反之則不然,耦合度不高。

  ● 雙向依賴,關系雙方的依賴是相互的,影響也是相互的,耦合度較高。

  從耦合的角度而言,可以分類為(此處回歸到具體的代碼級耦合概念,以方便概念的闡釋):

  ● 零耦合,表示兩個類沒有依賴。

  ● 具體耦合,如果一個類持有另一個具體類的引用,那么這兩個類發生了具體耦合關系。所以,具體耦合發生在具體類之間的依賴,因此具體類的變更將引起對其關聯類的影響。

  ● 抽象耦合,發生在具體類和抽象類的依賴,其大的作用是通過對抽象的依賴,應用面向對象的多態機制,實現了靈活的擴展性和穩定性。

  不同的耦合,代表了依賴程度的差別,以“粒度”為概念來分析其耦合的程度。引用中間層來分離耦合,可以使設計更加優雅,架構更加富有柔性,但直接的依賴也存在其市場,過度的設計也并非可取之道。因為,效率與性能同樣是設計需要考量的因素,過多的不必要分離會增加調用的次數,造成效率浪費。

  后文分析依賴倒置原則的弊端之一正是對此問題的進一步闡述。

  (2)耦合是如何產生的

  那么,軟件實體之間的耦合是如何產生呢?回歸每天揮灑的代碼片段,其實是在重復的創造著耦合,并且得益于對這種耦合帶來的數據通信。如果將歷史的目光回歸到軟件設計之初,人類以簡單的機器語言來實現簡單的邏輯,給一個輸入,實現一個輸出,可以表達為如圖3-1所示的形式。

  隨著軟件世界的革命,業務邏輯的復雜,以上的簡單化處理已經不足以實現更復雜的軟件產品,當系統內部的復雜度超越人腦可識別的程度時,需要通過更科學的方法或者方式來梳理,

  因此,人類開始發揮重組和簡單化處理的優勢,開發者不得不在軟件設計上做出平衡。平衡的結果是通過對復雜的系統模塊化,把復雜問題簡單處理,從而達到能夠被人腦識別的目的。基于這種指導原則,隨著復雜度的增加模塊的劃分更加朝著精細化發展,尤其是面向對象程序設計理論的出現,使得對復雜的處理實現了更科學的理論基礎。然而,復雜的問題可以通過劃分實現簡單的功能模塊或者技術單元,但由此應運而生的子單元會越來越多,而且越來越多的子單元必須發生數據的通信才能完成統一的業務處理,所以產生的數據通信管理也越來越多。對于子單元的管理,也是本文關注的核心概念??依賴,成為新的軟件設計問題,那么總結前人的經驗,提煉今人的智慧,對耦合的產生做如下歸納: