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

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

  因?yàn)椤榜詈鲜遣豢杀苊獾摹,所以首先從認(rèn)識(shí)依賴和耦合的概念開始,來一步步闡釋依賴的哲學(xué)思想。

 。1)什么是依賴和耦合

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

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

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

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

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

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

  ● 零耦合,表示兩個(gè)類沒有依賴。

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

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

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

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

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

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

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

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