關(guān)于依賴和耦合:從小國寡民到和諧社會

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

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

 。1)什么是依賴和耦合

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

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

  ● 無依賴,代表沒有發(fā)生任何聯(lián)系,所以二者相互獨立,互不影響,沒有耦合關(guān)系。

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

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

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

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

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

  ● 抽象耦合,發(fā)生在具體類和抽象類的依賴,其大的作用是通過對抽象的依賴,應(yīng)用面向?qū)ο蟮亩鄳B(tài)機制,實現(xiàn)了靈活的擴展性和穩(wěn)定性。

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

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

 。2)耦合是如何產(chǎn)生的

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

  隨著軟件世界的革命,業(yè)務(wù)邏輯的復(fù)雜,以上的簡單化處理已經(jīng)不足以實現(xiàn)更復(fù)雜的軟件產(chǎn)品,當(dāng)系統(tǒng)內(nèi)部的復(fù)雜度超越人腦可識別的程度時,需要通過更科學(xué)的方法或者方式來梳理,

  因此,人類開始發(fā)揮重組和簡單化處理的優(yōu)勢,開發(fā)者不得不在軟件設(shè)計上做出平衡。平衡的結(jié)果是通過對復(fù)雜的系統(tǒng)模塊化,把復(fù)雜問題簡單處理,從而達(dá)到能夠被人腦識別的目的;谶@種指導(dǎo)原則,隨著復(fù)雜度的增加模塊的劃分更加朝著精細(xì)化發(fā)展,尤其是面向?qū)ο蟪绦蛟O(shè)計理論的出現(xiàn),使得對復(fù)雜的處理實現(xiàn)了更科學(xué)的理論基礎(chǔ)。然而,復(fù)雜的問題可以通過劃分實現(xiàn)簡單的功能模塊或者技術(shù)單元,但由此應(yīng)運而生的子單元會越來越多,而且越來越多的子單元必須發(fā)生數(shù)據(jù)的通信才能完成統(tǒng)一的業(yè)務(wù)處理,所以產(chǎn)生的數(shù)據(jù)通信管理也越來越多。對于子單元的管理,也是本文關(guān)注的核心概念??依賴,成為新的軟件設(shè)計問題,那么總結(jié)前人的經(jīng)驗,提煉今人的智慧,對耦合的產(chǎn)生做如下歸納: