?解耦
? ? ? ? ????對(duì)于大型重構(gòu), 最有效的手段就是 解耦, 解耦的目的使實(shí)現(xiàn)代碼高聚合、松耦合。
? ? ? ? 解耦為何如此重要?
? ???????那如何來(lái)控制代碼的復(fù)雜性呢?手段有很多,我個(gè)人認(rèn)為,最關(guān)鍵的就是解耦,保證代碼松耦合、高內(nèi)聚。如果說(shuō)重構(gòu)是保證代碼質(zhì)量不至于腐化到無(wú)可救藥地步的有效手段,那么利用解耦的方法對(duì)代碼重構(gòu),就是保證代碼不至于復(fù)雜到無(wú)法控制的有效手段。
? ???????“高內(nèi)聚、松耦合”是一個(gè)比較通用的設(shè)計(jì)思想,不僅可以指導(dǎo)細(xì)粒度的類和類之間關(guān)系的設(shè)計(jì),還能指導(dǎo)粗粒度的系統(tǒng)、架構(gòu)、模塊的設(shè)計(jì)。相對(duì)于編碼規(guī)范,它能夠在更高層次上提高代碼的可讀性和可維護(hù)性。
? ??????不管是閱讀代碼還是修改代碼,“高內(nèi)聚、松耦合”的特性可以讓我們聚焦在某一模塊或類中,不需要了解太多其他模塊或類的代碼,讓我們的焦點(diǎn)不至于過(guò)于發(fā)散,降低了閱讀和修改代碼的難度。而且,因?yàn)橐蕾囮P(guān)系簡(jiǎn)單,耦合小,修改代碼不至于牽一發(fā)而動(dòng)全身,代碼改動(dòng)比較集中,引入 bug 的風(fēng)險(xiǎn)也就減少了很多。同時(shí),“高內(nèi)聚、松耦合”的代碼可測(cè)試性也更加好,容易 mock 或者很少需要 mock 外部依賴的模塊或者類。
? ??????除此之外,代碼“高內(nèi)聚、松耦合”,也就意味著,代碼結(jié)構(gòu)清晰、分層和模塊化合理、依賴關(guān)系簡(jiǎn)單、模塊或類之間的耦合小,那代碼整體的質(zhì)量就不會(huì)差。即便某個(gè)具體的類或者模塊設(shè)計(jì)得不怎么合理,代碼質(zhì)量不怎么高,影響的范圍是非常有限的。我們可以聚焦于這個(gè)模塊或者類,做相應(yīng)的小型重構(gòu)。而相對(duì)于代碼結(jié)構(gòu)的調(diào)整,這種改動(dòng)范圍比較集中的小型重構(gòu)的難度就容易多了。
? ? ? ? 代碼是否需要 解耦 ?
? ??????????間接的衡量標(biāo)準(zhǔn)有很多,,比如,看修改代碼會(huì)不會(huì)牽一發(fā)而動(dòng)全身。除此之外,還有一個(gè)直接的衡量標(biāo)準(zhǔn),也是我在閱讀源碼的時(shí)候經(jīng)常會(huì)用到的,那就是把模塊與模塊之間、類與類之間的依賴關(guān)系畫(huà)出來(lái),根據(jù)依賴關(guān)系圖的復(fù)雜性來(lái)判斷是否需要解耦重構(gòu)。
? ??????????如果依賴關(guān)系復(fù)雜、混亂,那從代碼結(jié)構(gòu)上來(lái)講,可讀性和可維護(hù)性肯定不是太好,那我們就需要考慮是否可以通過(guò)解耦的方法,讓依賴關(guān)系變得清晰、簡(jiǎn)單。當(dāng)然,這種判斷還是有比較強(qiáng)的主觀色彩,但是可以作為一種參考和梳理依賴的手段,配合間接的衡量標(biāo)準(zhǔn)一塊來(lái)使用。