0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

圖解高內(nèi)聚與低耦合

馬哥Linux運(yùn)維 ? 來源:博客園-大道方圓 ? 2023-03-08 17:25 ? 次閱讀

模塊

模塊就是從邏輯上將系統(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ā)效率.

1a42c608-a2f7-11ed-bfe3-dac502259ad0.gif

內(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)麻煩, 難以下手.

1a580716-a2f7-11ed-bfe3-dac502259ad0.gif

接口設(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)的耦合.

1a697604-a2f7-11ed-bfe3-dac502259ad0.png

橋接模式

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);

1adf5914-a2f7-11ed-bfe3-dac502259ad0.png

適配器模式

引入第三方庫(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");

1b097ec4-a2f7-11ed-bfe3-dac502259ad0.png

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 模塊
    +關(guān)注

    關(guān)注

    7

    文章

    2613

    瀏覽量

    47015
  • 耦合
    +關(guān)注

    關(guān)注

    13

    文章

    573

    瀏覽量

    100659
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8257

    瀏覽量

    149957
  • API
    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)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    cpost的使用及原理解析

    嵌入式編程的需求千變?nèi)f化,要做到系統(tǒng)穩(wěn)定,又要代碼可復(fù)用,就要做到內(nèi)耦合。
    發(fā)表于 08-08 11:01 ?1198次閱讀

    使用C語言實(shí)現(xiàn)內(nèi)耦合

    編程時(shí),我們講究的是內(nèi)耦合,在協(xié)同開發(fā)、代碼移植、維護(hù)等環(huán)節(jié)都起到很重要的作用。
    發(fā)表于 09-21 11:33 ?1126次閱讀

    如何實(shí)現(xiàn)代碼的內(nèi)、耦合

    大家在談到面向?qū)ο缶幊痰臅r(shí)候基本都是討論軟件的“內(nèi)耦合”的特點(diǎn),這6個(gè)字也是算是成為了大部分評(píng)判代碼質(zhì)量的一個(gè)標(biāo)準(zhǔn),所以很多小伙伴一
    發(fā)表于 10-13 08:57 ?966次閱讀

    淺析模塊化編程思路

    好久沒更新播客了,最新想寫些自己的編程方面想法。也就是些自己的想法,不一定準(zhǔn)確,在這希望能和大家分享下。相信大家在大學(xué)的時(shí)候都學(xué)過程序遵循的標(biāo)準(zhǔn)是“內(nèi)
    發(fā)表于 12-20 06:52

    如何去實(shí)現(xiàn)模塊設(shè)計(jì)中的內(nèi)耦合

    內(nèi)耦合分別是什么意思?有何作用?如何去實(shí)現(xiàn)模塊設(shè)計(jì)中的
    發(fā)表于 02-25 07:05

    怎么把硬件操作和APP軟件耦合起來?

    你們寫嵌入式都是怎么把硬件操作和APP軟件耦合起來的,怎樣達(dá)到內(nèi)耦合的效果
    發(fā)表于 11-06 07:57

    光電耦合器詳細(xì)資料(圖解)

    光電耦合器詳細(xì)資料(圖解) 把發(fā)光器件和光敏器件按適當(dāng)方式組合,就可以實(shí)現(xiàn)以光信號(hào)為媒介的電信號(hào)變換。采用這種組合方式制成的器件稱為
    發(fā)表于 03-01 16:42 ?1310次閱讀

    基于最優(yōu)投影的半監(jiān)督類算法

    (semi-su-pervised spectral clustering based on the optimal projection,SSOP)。該算法從高內(nèi)耦合
    發(fā)表于 01-14 11:54 ?0次下載

    寬帶頻率范圍內(nèi)的定向和雙向耦合

    MCLI在無源元件方面的專業(yè)知識(shí)還擴(kuò)展到寬帶頻率范圍內(nèi)的定向和雙向耦合器,具有插入損耗、指向性和駐波比的特點(diǎn)。MCLI所有定向
    發(fā)表于 11-10 10:24 ?969次閱讀

    C語言中的內(nèi)耦合講解

    編程時(shí),我們講究的是內(nèi)耦合,在協(xié)同開發(fā)、代碼移植、維護(hù)等環(huán)節(jié)都起到很重要的作用。 一、原理篇而
    的頭像 發(fā)表于 08-16 14:06 ?2258次閱讀

    C語言--“內(nèi)耦合”編程思想

    1、定義內(nèi)耦合,是軟件工程中的概念,是判斷設(shè)計(jì)好壞的標(biāo)準(zhǔn),主要是面向?qū)ο蟮脑O(shè)計(jì),主要是看類的內(nèi)聚性是否
    發(fā)表于 01-13 13:43 ?3次下載
    C語言--“<b class='flag-5'>高</b><b class='flag-5'>內(nèi)</b><b class='flag-5'>聚</b>,<b class='flag-5'>低</b><b class='flag-5'>耦合</b>”編程思想

    很強(qiáng)大!耦合內(nèi)的MCU實(shí)用軟件框架

    一個(gè)模塊內(nèi)部各個(gè)元素之間的聯(lián)系的緊密程度,如果各個(gè)元素(語句、程序段)之間的聯(lián)系程度越高,則內(nèi)聚性越高,也就是內(nèi)。
    發(fā)表于 02-08 15:56 ?3次下載
    很強(qiáng)大!<b class='flag-5'>低</b><b class='flag-5'>耦合</b><b class='flag-5'>高</b><b class='flag-5'>內(nèi)</b><b class='flag-5'>聚</b>的MCU實(shí)用軟件框架

    手把手帶小白做MODBUS通訊實(shí)驗(yàn)

    我們做程序庫封裝的基本要義是內(nèi)耦合, 而評(píng)價(jià)低耦合的終極體現(xiàn)則是使用實(shí)現(xiàn)過程的優(yōu)雅程度。
    的頭像 發(fā)表于 08-06 17:05 ?1244次閱讀
    手把手帶小白做MODBUS通訊實(shí)驗(yàn)

    電路耦合效應(yīng)分析 耦合好還是

    電路耦合效應(yīng)分析 耦合好還是好 電路耦合效應(yīng)是指兩個(gè)或更多電路之間存在的相互影響的現(xiàn)象。在電路中,一個(gè)信號(hào)的變化可能會(huì)引起另一個(gè)信號(hào)的
    的頭像 發(fā)表于 09-22 12:47 ?3633次閱讀

    編程如何做到內(nèi)耦合呢?

    耦合,是指模塊之間盡可能的使其獨(dú)立存在,模塊之間不產(chǎn)生聯(lián)系不可能,但模塊與模塊之間的接口應(yīng)該盡量少而簡(jiǎn)單。
    的頭像 發(fā)表于 12-06 09:20 ?802次閱讀