內聚與耦合


簡單理解一下內聚和耦合。

什么是模塊

模塊就是從邏輯上將系統分解為更細微的部分,分而治之。

復雜問題因為復雜性的問題,比較難解決,但是可以將復雜問題拆解為若干簡單問題,逐個擊破地解決這些簡單問題,最后實現解決復雜問題的效果。

模塊的粒度划分可大可小,可以是函數,類或功能塊等等。

耦合主要描述的是模塊與模塊之間的關系,內聚則主要描述的是單個模塊的內部構成。

什么是耦合

如果模塊之間存在依賴,則可能會導致一個模塊的改動影響了另外的模塊的問題,甚至是相互影響。

兩個模塊之間的關系越緊密,耦合就越強,模塊的獨立性就會越差。

比如一個模塊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);

這樣,開發者只需要指定數據庫的驅動類,調用的方法即API都是相同的,不會因為數據庫的不同而有所區別。

適配器模式

如果引入了第三方庫(Hibernate,Log4j),不應該直接在代碼中繼承或者使用其實體類。

應該要抽出上層統一接口,然后增加實現類,最后對外暴露接口。

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

這樣,如果要更換log框架,只需要修改FRLoggerFactory中對log框架的引用就可以了,不需要在每個業務代碼中修改。

 

 

"我曾對你心動過,但趕路要緊,我忘了說。"


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM