圖解高內聚與低耦合

模塊

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

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

耦合

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

好比模塊A直接操做了模塊B中數據, 則視爲強耦合, 若A只是經過數據與模塊B交互, 則視爲弱耦合.apache

獨立的模塊便於擴展, 維護, 寫單元測試, 若是模塊之間重重依賴, 會極大下降開發效率. 編程

 內聚

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

若是有各類場景須要被引入到當前模塊, 代碼質量將變得很是脆弱, 這種狀況建議拆分爲多個模塊.框架

低內聚的模塊代碼, 無論是維護, 擴展仍是重構都至關麻煩, 難如下手.函數

接口設計原則

好的接口應當知足設計模式六大原則, 不少設計模式, 框架都是基於高內聚低耦合這個出發點的.單元測試

  1. 單一職責原則: 一個類只負責一個功能領域中的相應職責.
  2. 開閉原則: 一個軟件實體應當對擴展開放,對修改關閉.
  3. 里氏代換原則: 全部引用基類(父類)的地方必須能透明地使用其子類的對象.
  4. 依賴倒轉原則: 抽象不該該依賴於細節, 細節應當依賴於抽象. 換言之, 要針對接口編程, 而不是針對實現編程.
  5. 接口隔離原則: 使用多個專門的接口, 而不使用單一的總接口, 即客戶端不該該依賴那些它不須要的接口.
  6. 迪米特法則: 一個軟件實體應當儘量少地與其餘實體發生相互做用, 例如外觀模式, 對外暴露統一接口.

舉幾個栗子

外觀模式測試

爲系統中多個子系統提供一致的對外調用, 對客戶端隱藏子系統細節, 下降其與子系統的耦合.

 

橋接模式

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

1         // 開發者只須要關注JDBC API, 無需關注不一樣數據庫Driver接口實現
2         Class.forName("com.mysql.jdbc.Driver");
3         Connection conn = DriverManager.getConnection(url, username, password);

適配器模式

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

須要抽出上層統一接口, 而後增長實現類, 對外暴露接口.

1         // 代碼與log4j強耦合, 不推薦
2         org.apache.log4j.Logger.getRootLogger().info("info");
3         // 底層能夠隨意更換log框架
4         FRLoggerFactory.getLogger().info("info");

 

相關文章
相關標籤/搜索