徹底弄懂高內(nèi)聚與低耦合!

作者:大道方圓
來源:https://www.cnblogs.com/xdecode/p/9393885.html

模塊

模塊就是從邏輯上將系統(tǒng)分解為更細(xì)微的部分, 分而治之, 復(fù)雜問題拆解為若干簡(jiǎn)單問題, 逐個(gè)解決.

耦合主要描述模塊之間的關(guān)系, 內(nèi)聚主要描述模塊內(nèi)部. 模塊的粒度可大可小, 可以是函數(shù), 類, 功能塊等等.

耦合

模塊之間存在依賴, 導(dǎo)致改動(dòng)可能會(huì)互相影響, 關(guān)系越緊密, 耦合越強(qiáng), 模塊獨(dú)立性越差.

比如模塊A直接操作了模塊B中數(shù)據(jù), 則視為強(qiáng)耦合, 若A只是通過數(shù)據(jù)與模塊B交互, 則視為弱耦合.

獨(dú)立的模塊便于擴(kuò)展, 維護(hù), 寫單元測(cè)試, 如果模塊之間重重依賴, 會(huì)極大降低開發(fā)效率.

image

內(nèi)聚

模塊內(nèi)部的元素, 關(guān)聯(lián)性越強(qiáng), 則內(nèi)聚越高, 模塊單一性更強(qiáng). 一個(gè)模塊應(yīng)當(dāng)盡可能獨(dú)立完成某個(gè)功能,

如果有各種場(chǎng)景需要被引入到當(dāng)前模塊, 代碼質(zhì)量將變得非常脆弱, 這種情況建議拆分為多個(gè)模塊.

低內(nèi)聚的模塊代碼, 不管是維護(hù), 擴(kuò)展還是重構(gòu)都相當(dāng)麻煩, 難以下手.

image

接口設(shè)計(jì)原則

好的接口應(yīng)當(dāng)滿足設(shè)計(jì)模式六大原則, 很多設(shè)計(jì)模式, 框架都是基于高內(nèi)聚低耦合這個(gè)出發(fā)點(diǎn)的.

  1. 單一職責(zé)原則: 一個(gè)類只負(fù)責(zé)一個(gè)功能領(lǐng)域中的相應(yīng)職責(zé).

  2. 開閉原則: 一個(gè)軟件實(shí)體應(yīng)當(dāng)對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉.

  3. 里氏代換原則: 所有引用基類(父類)的地方必須能透明地使用其子類的對(duì)象.

  4. 依賴倒轉(zhuǎn)原則: 抽象不應(yīng)該依賴于細(xì)節(jié), 細(xì)節(jié)應(yīng)當(dāng)依賴于抽象. 換言之, 要針對(duì)接口編程, 而不是針對(duì)實(shí)現(xiàn)編程.

  5. 接口隔離原則: 使用多個(gè)專門的接口, 而不使用單一的總接口, 即客戶端不應(yīng)該依賴那些它不需要的接口.

  6. 迪米特法則: 一個(gè)軟件實(shí)體應(yīng)當(dāng)盡可能少地與其他實(shí)體發(fā)生相互作用, 例如外觀模式, 對(duì)外暴露統(tǒng)一接口.

舉幾個(gè)栗子

image

外觀模式

為系統(tǒng)中多個(gè)子系統(tǒng)提供一致的對(duì)外調(diào)用, 對(duì)客戶端隱藏子系統(tǒng)細(xì)節(jié), 降低其與子系統(tǒng)的耦合.

image

橋接模式

JDBC中的把面向廠商的接口(Driver)和面向使用者的API(DriverManager)做了拆分隔離.

 1         // 開發(fā)者只需要關(guān)注JDBC API, 無需關(guān)注不同數(shù)據(jù)庫Driver接口實(shí)現(xiàn)
    2         Class.forName("com.mysql.jdbc.Driver");
    3         Connection conn = DriverManager.getConnection(url, username, password);
image

適配器模式

引入第三方庫(hibernate, log4j), 不應(yīng)該直接在代碼中繼承或者使用其實(shí)體類.

需要抽出上層統(tǒng)一接口, 然后增加實(shí)現(xiàn)類, 對(duì)外暴露接口.

    1         // 代碼與log4j強(qiáng)耦合, 不推薦
    2         org.apache.log4j.Logger.getRootLogger().info("info");
    3         // 底層可以隨意更換log框架
    4         FRLoggerFactory.getLogger().info("info");
image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容