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