為什么要解耦
如果說重構(gòu)是保證代碼質(zhì)量不至于腐化到無可救藥地步的有效手段传睹,那么利用解耦的方法對(duì)代碼重構(gòu)耳幢,就是保證代碼不至于復(fù)雜到無法控制的有效手段。
“高內(nèi)聚欧啤、松耦合”的特性可以讓我們聚焦在某一模塊或類中睛藻,不需要了解太多其他模塊或類的代碼,讓我們的焦點(diǎn)不至于過于發(fā)散邢隧,降低了閱讀和修改代碼的難度店印。而且,因?yàn)橐蕾囮P(guān)系簡(jiǎn)單倒慧,耦合小按摘,修改代碼不至于牽一發(fā)而動(dòng)全身,代碼改動(dòng)比較集中纫谅,引入 bug 的風(fēng)險(xiǎn)也就減少了很多炫贤。同時(shí),“高內(nèi)聚付秕、松耦合”的代碼可測(cè)試性也更加好兰珍,容易 mock 或者很少需要 mock 外部依賴的模塊或者類。
如何判斷代碼是否解耦
把模塊與模塊之間询吴、類與類之間的依賴關(guān)系畫出來掠河,根據(jù)依賴關(guān)系圖的復(fù)雜性來判斷是否需要解耦重構(gòu)。
如果依賴關(guān)系復(fù)雜猛计、混亂唠摹,那從代碼結(jié)構(gòu)上來講,可讀性和可維護(hù)性肯定不是太好奉瘤,那我們就需要考慮是否可以通過解耦的方法勾拉,讓依賴關(guān)系變得清晰、簡(jiǎn)單毛好。當(dāng)然望艺,這種判斷還是有比較強(qiáng)的主觀色彩苛秕,但是可以作為一種參考和梳理依賴的手段肌访,配合間接的衡量標(biāo)準(zhǔn)一塊來使用。
如何實(shí)現(xiàn)解耦
封裝與抽象
中間層
模塊化
合理地劃分模塊能有效地解耦代碼艇劫,每個(gè)模塊之間的耦合很小吼驶,提高代碼的可讀性和可維護(hù)性。
模塊化思想更加本質(zhì)的東西就是分而治之。其他設(shè)計(jì)思想和原則
“高內(nèi)聚蟹演、松耦合”是一個(gè)非常重要的設(shè)計(jì)思想风钻,能夠有效提高代碼的可讀性和可維護(hù)性,縮小功能改動(dòng)導(dǎo)致的代碼改動(dòng)范圍酒请。
- 單一職責(zé)原則
- 基于接口而非實(shí)現(xiàn)編程
- 依賴注入
- 多用組合少用繼承
- 迪米特法則
迪米特法則的英文翻譯是:Law of Demeter骡技,縮寫是 LOD。
單從這個(gè)名字上來看羞反,我們完全猜不出這個(gè)原則講的是什么布朦。不過,它還有另外一個(gè)更加達(dá)意的名字昼窗,叫作最小知識(shí)原則是趴,英文翻譯為:The Least Knowledge Principle。
關(guān)于這個(gè)設(shè)計(jì)原則澄惊,我們先來看一下它最原汁原味的英文定義:
Each unit should have only limited knowledge about other units: only units “closely” related to the current unit. Or: Each unit should only talk to its friends; Don’t talk to strangers.
翻譯過來就是:
每個(gè)模塊(unit)只應(yīng)該了解那些與它關(guān)系密切的模塊(units: only units “closely” related to the current unit)的有限知識(shí)(knowledge)唆途。或者說掸驱,每個(gè)模塊只和自己的朋友“說話”(talk)肛搬,不和陌生人“說話”(talk)。
不該有直接依賴關(guān)系的類之間毕贼,不要有依賴滚婉;有依賴關(guān)系的類之間,盡量只依賴必要的接口(也就是定義中的“有限知識(shí)”)帅刀。
- 一些常用的解耦的手段
Spring AOP让腹,實(shí)現(xiàn)業(yè)務(wù)代碼與非業(yè)務(wù)代碼的解耦
IoC, 實(shí)現(xiàn)對(duì)象使用者與對(duì)象創(chuàng)建者解耦
Spring中的事件監(jiān)聽機(jī)制
消息隊(duì)列,實(shí)現(xiàn)了觀察者和被觀察者的解耦
《極客時(shí)間 - 設(shè)計(jì)模式之美》