簡單理解一下內聚和耦合。
什么是模塊
模塊就是從邏輯上將系統分解為更細微的部分,分而治之。
復雜問題因為復雜性的問題,比較難解決,但是可以將復雜問題拆解為若干簡單問題,逐個擊破地解決這些簡單問題,最后實現解決復雜問題的效果。
模塊的粒度划分可大可小,可以是函數,類或功能塊等等。
耦合主要描述的是模塊與模塊之間的關系,內聚則主要描述的是單個模塊的內部構成。
什么是耦合
如果模塊之間存在依賴,則可能會導致一個模塊的改動影響了另外的模塊的問題,甚至是相互影響。
兩個模塊之間的關系越緊密,耦合就越強,模塊的獨立性就會越差。
比如一個模塊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框架的引用就可以了,不需要在每個業務代碼中修改。
"我曾對你心動過,但趕路要緊,我忘了說。"