概述
模塊的划分是軟件結構化方法中提出來的想法,結構化方法的思想是,一個大問題分解成多個中問題,每個中問題再分解為多個子問題,直至可以容易的解決為止,這些划分出來的塊就是我們說的模塊,模塊有大有小,大到系統的架構,小到一個類一個方法,換句話說,我們學過的系統三層架構中的每一層都可以稱為一個模塊,三層架構是基於結構化思想得來的,我們編寫的每一個函數,也可以說是一個模塊,至於下面描述的模塊,我們不要將其定死在一個實體上,應該怎么好理解,就把其當成什么。
在划分模塊的時候,根據模塊和模塊之間的關系(耦合),以及模塊內部之間的關系(內聚),我們來判斷划分的模塊是否為優。下面來具體說耦合和內聚的具體分類
耦合
模塊之間互相連接的緊密程度的度量。各個模塊之間的復雜程度、調用模塊的方式以及哪些信息通過接口
內容耦合
如果一個模塊直接訪問另一個模塊的內部數據,或者一個模塊不通過正常入口轉到另一模塊內部,或者兩個模塊有一部分程序代碼重疊,或者一個模塊有多個入口,則兩個模塊之間就發生了內容耦合。
公共耦合
若一組模塊都訪問同一個公共數據環境,則他們之間的耦合就稱為公共耦合。公共的數據環境可以是全局數據結構、共享的通信區、內存的公共覆蓋區等
外部耦合
一組模塊都訪問統一全局簡單變量而不是統一全局數據結構,而且不是通過參數表傳遞該全局變量的信息
外部耦合和公共耦合的區別
外部耦合不存在依賴於一個數據結構內部各項的物理安排
控制耦合
如果一個模塊通過傳送開關、標志、名字等控制信息,明顯地控制選擇另一模塊的功能,就是控制耦合
標記耦合
如果一組模塊通過參數表傳遞記錄信息,就是標記耦合。共享某一數據結構的子結構
數據耦合
如果一個模塊訪問另一個模塊時,彼此之間是通過數據參數(不是控制參數、公共數據結構或外部變量)來交換輸入、輸出信息的,則稱這種耦合為數據耦合
非直接耦合
如果兩個模塊之間沒有直接關系,它們之間的聯系完全是通過主模塊的控制和調用來實現的,這就是非直接耦合
內聚
模塊內部各個元素彼此結合的緊密程度的度量
偶然(巧合)內聚
當幾個模塊內湊巧有一些程序段代碼相同,又沒有明確變現出獨立的功能,把這些代碼獨立出來建立的模塊即為偶然內聚模塊,模塊的各成分之間毫無關系,也就是說模塊完成一組任務,這些任務之間沒有關系
缺點:模塊的內容不易理解,不易修改和維護
邏輯內聚
這種模塊把幾種相關的功能組合在一起,每次被調用時,由傳送給模塊的控制型參數來確定該模塊應執行哪一種功能。
邏輯內聚表明了各部分之間在功能上的相關關系
時間內聚
如果一個模塊完成的功能必須在同一時間內執行(系統初始化),但這些功能只是因為時間因素關聯在一起
過程內聚
使用流程圖作為工具設計程序的時候,常常通過流程圖來確定模塊划分。把流程圖中的某一部分划分出組成模塊,就得到過程內聚模塊
通信內聚
如果一個模塊內各功能部分都使用了相同的輸入數據,或產生了相同的輸出數據,則稱之為通信內聚模塊。通常,通信內聚模塊時通過數據流圖來定義的。如果一個模塊的所有成分都操作同一數據集或生成同一數據集
順序(信息)內聚
這種模塊完成多個功能,各個功能都在同一數據結構上操作,每一項能有一個唯一的入口點。如果一個模塊的各個成分和同一個功能密切相關,而且一個成分的輸出作為另一個成分的輸入,則稱為順序內聚
信息內聚模塊可以看成是多個功能內聚模塊的組合,並且達到信息的隱蔽。即把某個數據結構、資源或設備隱蔽在一個模塊內,不為別的模塊所知曉,當把程序某些方面細節隱藏在一個模塊中時,就增加了模塊的獨立性
功能內聚
一個模塊中各個部分都是為完成一項具體功能而協同工作,緊密聯系,不可分割的,則稱該模塊為功能內聚模塊。功能內聚模塊時內聚性最強的模塊
總結
模塊的內聚和耦合,我們主要的抓點就是:耦合是多個模塊之間的關系;內聚是一個模塊內部各成員的關系。然后根據這個依據,再分析就非常容易了
結構化方法不但應該應用在我們的軟件開發上,更應該應用在我們生活中的方方面面