1. 程式人生 > >你們要的動圖來了:2張動圖快速理解高內聚與低耦合

你們要的動圖來了:2張動圖快速理解高內聚與低耦合

模組

模組就是從邏輯上將系統分解為更細微的部分, 分而治之, 複雜問題拆解為若干簡單問題, 逐個解決.

耦合主要描述模組之間的關係, 內聚主要描述模組內部. 模組的粒度可大可小, 可以是函式, 類, 功能塊等等.

耦合

模組之間存在依賴, 導致改動可能會互相影響, 關係越緊密, 耦合越強, 模組獨立性越差.

比如模組A直接操作了模組B中資料, 則視為強耦合, 若A只是通過資料與模組B互動, 則視為弱耦合.

獨立的模組便於擴充套件, 維護, 寫單元測試, 如果模組之間重重依賴, 會極大降低開發效率. 

內聚

模組內部的元素, 關聯性越強, 則內聚越高, 模組單一性更強. 一個模組應當儘可能獨立完成某個功能, 

如果有各種場景需要被引入到當前模組, 程式碼質量將變得非常脆弱, 這種情況建議拆分為多個模組.

低內聚的模組程式碼, 不管是維護, 擴充套件還是重構都相當麻煩, 難以下手.

介面設計原則

好的介面應當滿足設計模式六大原則, 很多設計模式, 框架都是基於高內聚低耦合這個出發點的.

  1. 單一職責原則: 一個類只負責一個功能領域中的相應職責.

  2. 開閉原則: 一個軟體實體應當對擴充套件開放,對修改關閉.

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

  4. 依賴倒轉原則: 抽象不應該依賴於細節, 細節應當依賴於抽象. 換言之, 要針對介面程式設計, 而不是針對實現程式設計.

  5. 介面隔離原則: 使用多個專門的介面, 而不使用單一的總介面, 即客戶端不應該依賴那些它不需要的介面.

  6. 迪米特法則: 一個軟體實體應當儘可能少地與其他實體發生相互作用, 例如外觀模式, 對外暴露統一介面.

舉幾個栗子

外觀模式

為系統中多個子系統提供一致的對外呼叫, 對客戶端隱藏子系統細節, 降低其與子系統的耦合.

橋接模式

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

 // 開發者只需要關注JDBC API, 無需關注不同資料庫Driver介面實現
 Class.forName("com.mysql.jdbc.Driver");
 Connection conn = DriverManager.getConnection(url, username, password);

介面卡模式

引入第三方庫(hibernate, log4j), 不應該直接在程式碼中繼承或者使用其實體類.

需要抽出上層統一介面, 然後增加實現類, 對外暴露介面.

 // 程式碼與log4j強耦合, 不推薦
 org.apache.log4j.Logger.getRootLogger().info("info");
 // 底層可以隨意更換log框架
 FRLoggerFactory.getLogger().info("info");

原文連結:https://www.cnblogs.com/xdecode/p/9393885.html