強內聚與松耦合[轉載]

IT界有一句很著名的口號:強內聚、松耦合。

  即使是最初級的程序員,在常常的被教導中,他也瞭解了這句口號的含義:我們的程序要模塊化,模塊要完成明確的一組關聯的服務功能,要求它的各部分是相關的、有機組合起來是完整體(外部程序來看黑盒子),模塊的內部各成分之間相關聯程度要儘可能高(強內聚);而模塊與模塊之間又要求是可分拆的、少依賴的(松耦合)。

  人們易於實現強內聚的模塊,例如:一個函數實現一個獨立的功能,這就是強內聚。

  人們不易實現松耦合,因爲,孤獨的模塊毫無意義,只有模塊間的相互協調地工作,才能實現系統的目的。而對於模塊間的相互關係的設計,沒有一定的經驗是難以把握。耦合的強度依賴於:(1)一個模塊對另一個模塊的調用;(2)一個模塊向另一個模塊傳遞的數據量;(3)一個模塊施加到另一個模塊的控制的多少;(4)模塊之間接口的複雜程度。等等。

  當然,“強內聚、松耦合”也是有矛盾的,如:內聚性越強,則要求的函數越多(每個函數只作一件“事”),這樣,將它們組合成“大”的功能,也就越複雜,就不可能達到松耦合。因此,應在二者之間作出平衡與折衷的選擇,這也體現程序員的水平。從系統論的角度來看,系統是有層次的,即系統可以分爲子系統,模塊可分爲子模塊,“強內聚、松耦合”的“度”的把握,應結合系統的次層性來考慮,即通常應在層次性上作出折衷,如:模塊內子程序(下一個層次上)應共享數據(有一定的耦合度),而減少全局變量能降低子程序性間的耦合性。

  面向對象的語言進一步強化了“強內聚、松耦合”,類的封裝性既強調了相關內容(數據及其操作)的內聚,又強調了類的獨立性和私密性。而類的繼承性以及友元等,就是在松耦合的原則下規範了類之間的關聯關係。類與類之間通常通過接口的契約實現服務提供者/服務請求者模式,這就是典型的松耦合。

  “強內聚、松耦合”對於程序編寫分工、程序的可維護性以及測試都有重要的關係,如:從設計角度來看,在“強內聚、松耦合”的指導下進行的設計得到的程序模塊,符合項目管理的WBS(工作分解結構)的要求,其相對獨立的模塊可以分配到具體的程序員進行開發,另外,程序編碼外包也必須建立在這種原則的設計之下;從程序生命期角度來看,它有利於提高程序質量,特別是方便於程序的日後維護,即程序模塊的相對獨立性是可維護性的保證;再從測試角度來看,符合“強內聚、松耦合”的程序,易於對局部(模塊)進行黑盒測試,也易於編寫測試用的“樁”和“驅動”。

  “強內聚、松耦合”也是對組織結構的要求,項目組分爲幾個小組(正式的或非正式的),各小組的工作應是高度相關的,各小組之間的工作應儘量是較少相關或有明確的接口,從而減少溝通成本。其實,“強內聚、松耦合”是系統中應遵守的普遍原則,我們在許多領域都可以找到它的應用。

  “強內聚、松耦合”是我們不得不念的“三字經”,我們一定要念好它 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章