發(fā)布于:2021-01-25 15:32:59
0
410
0
內(nèi)聚和耦合是非常容易被誤解的話題。
我們都聽(tīng)說(shuō)我們的代碼應(yīng)該以這樣一種方式來(lái)設(shè)計(jì),以增加內(nèi)聚性和松散耦合。是這樣嗎??jī)烧叨加锌赡軐?shí)現(xiàn)嗎?
讓我們看一下什么是內(nèi)聚和耦合,以便更好地理解它們與代碼的關(guān)系。
什么是凝聚力?
內(nèi)聚性僅僅是一個(gè)事物很好地結(jié)合在一起的性質(zhì)。
如果某個(gè)事物有一個(gè)清晰的邊界,并且所有的事物都包含在一個(gè)地方,那么我們可以說(shuō)它是高度內(nèi)聚的。
例如,棒球是非常有凝聚力的,組成棒球的所有東西都在一個(gè)小圓球里。
互聯(lián)網(wǎng)沒(méi)有凝聚力,很難界定,而且分散在各地。
在研究軟件時(shí),如果一個(gè)類或模塊有明確的職責(zé),并且該職責(zé)的所有實(shí)現(xiàn)緊密相連或在一個(gè)地方,那么我們認(rèn)為它是高度內(nèi)聚的。
軟件中的一個(gè)很好的例子是將所有寫入數(shù)據(jù)庫(kù)的邏輯放在一個(gè)模塊的一個(gè)類或幾個(gè)類中,而不是讓需要寫入數(shù)據(jù)庫(kù)的應(yīng)用程序的每個(gè)部分在自己的類中實(shí)現(xiàn)該邏輯。
我們認(rèn)為內(nèi)聚是一件好事,因?yàn)樗管浖子诶斫?,減少了對(duì)系統(tǒng)某個(gè)部分的更改對(duì)系統(tǒng)其他部分的影響,并且允許我們?cè)趹?yīng)用程序中重用代碼。
什么是解耦?
解耦是一個(gè)事物不依賴于其他事物的性質(zhì)。
我們可以說(shuō),如果某個(gè)事物只依賴于它自己,那么它是解耦的;如果某個(gè)事物有許多不同的依賴,那么它就是高度耦合的。
以iPod為例,它是高度解耦的,是一個(gè)非常獨(dú)立的硬件,它有自己的電池,可以在不依賴任何其他東西的情況下運(yùn)輸。
現(xiàn)在考慮一下計(jì)算機(jī)中的主板。它沒(méi)有解耦。它包含用于RAM、CPU、顯卡等的特定插槽。如果這些組件的形狀或種類發(fā)生變化,它們可能無(wú)法與主板一起工作。
在軟件方面,如果一個(gè)模塊或類對(duì)其他類或模塊沒(méi)有太多依賴性,我們可以考慮將其解耦。
考慮為鏈表數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)一個(gè)類。這個(gè)類很可能是解耦的,因?yàn)樗鼘?shí)際上不應(yīng)該依賴于任何其他東西(除非你當(dāng)然改變了你所認(rèn)為的事物的粒度;后面會(huì)有更多的討論)。
我們喜歡松散耦合的軟件,因?yàn)樗鼫p少了一個(gè)模塊中的更改對(duì)其他模塊的影響,松散耦合的軟件也更容易重用,因?yàn)樗鼪](méi)有很多其他依賴項(xiàng)。
聽(tīng)起來(lái)他們?cè)谂?shí)現(xiàn)非常相似的目標(biāo)
在大多數(shù)情況下,高內(nèi)聚力和松耦合是相輔相成的。
如果您的類對(duì)位于該類中的那些職責(zé)的實(shí)現(xiàn)有明確定義的職責(zé),那么很可能它將與系統(tǒng)的其余部分相當(dāng)解耦。
在非常普遍的意義上,當(dāng)你減少耦合時(shí),你增加了內(nèi)聚,反之亦然。
但是現(xiàn)在,我將在這里陷入泥濘,并質(zhì)疑我們所說(shuō)的“事物”或“模塊”是什么意思。
在我的下一篇文章中,我將更深入地研究該主題,并探討粒度如何影響內(nèi)聚和耦合,并討論它們實(shí)際上如何成反比。
作者介紹
熱門博客推薦