模塊
模塊就是從邏輯上將系統(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ā)效率.
內(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)麻煩, 難以下手.
接口設(shè)計(jì)原則
好的接口應(yīng)當(dāng)滿足設(shè)計(jì)模式六大原則, 很多設(shè)計(jì)模式, 框架都是基于高內(nèi)聚低耦合這個(gè)出發(fā)點(diǎn)的.
單一職責(zé)原則: 一個(gè)類只負(fù)責(zé)一個(gè)功能領(lǐng)域中的相應(yīng)職責(zé).
開閉原則: 一個(gè)軟件實(shí)體應(yīng)當(dāng)對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉.
里氏代換原則: 所有引用基類(父類)的地方必須能透明地使用其子類的對(duì)象.
依賴倒轉(zhuǎn)原則: 抽象不應(yīng)該依賴于細(xì)節(jié), 細(xì)節(jié)應(yīng)當(dāng)依賴于抽象. 換言之, 要針對(duì)接口編程, 而不是針對(duì)實(shí)現(xiàn)編程.
接口隔離原則: 使用多個(gè)專門的接口, 而不使用單一的總接口, 即客戶端不應(yīng)該依賴那些它不需要的接口.
迪米特法則: 一個(gè)軟件實(shí)體應(yīng)當(dāng)盡可能少地與其他實(shí)體發(fā)生相互作用, 例如外觀模式, 對(duì)外暴露統(tǒng)一接口.
舉幾個(gè)栗子
外觀模式
為系統(tǒng)中多個(gè)子系統(tǒng)提供一致的對(duì)外調(diào)用, 對(duì)客戶端隱藏子系統(tǒng)細(xì)節(jié), 降低其與子系統(tǒng)的耦合.
橋接模式
JDBC中的把面向廠商的接口(Driver)和面向使用者的API(DriverManager)做了拆分隔離.
//開發(fā)者只需要關(guān)注JDBCAPI,無需關(guān)注不同數(shù)據(jù)庫Driver接口實(shí)現(xiàn) Class.forName("com.mysql.jdbc.Driver"); Connectionconn=DriverManager.getConnection(url,username,password);
適配器模式
引入第三方庫(hibernate, log4j), 不應(yīng)該直接在代碼中繼承或者使用其實(shí)體類.
需要抽出上層統(tǒng)一接口, 然后增加實(shí)現(xiàn)類, 對(duì)外暴露接口.
//代碼與log4j強(qiáng)耦合,不推薦 org.apache.log4j.Logger.getRootLogger().info("info"); //底層可以隨意更換log框架 FRLoggerFactory.getLogger().info("info");
審核編輯:湯梓紅
-
模塊
+關(guān)注
關(guān)注
7文章
2613瀏覽量
47015 -
耦合
+關(guān)注
關(guān)注
13文章
573瀏覽量
100659 -
接口
+關(guān)注
關(guān)注
33文章
8257瀏覽量
149957 -
API
+關(guān)注
關(guān)注
2文章
1461瀏覽量
61492 -
內(nèi)聚
+關(guān)注
關(guān)注
0文章
2瀏覽量
1317
原文標(biāo)題:圖解高內(nèi)聚與低耦合
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論