模块独立性
模塊獨立性
一、模塊獨立性概念
? ? ? ? 模塊獨立性的概念是模塊化、抽象和信息隱蔽的直接結果。
? ? ? ? 模塊獨立性是軟件質量的關鍵,它指軟件系統中的每個模塊只涉及軟件要求的具體子功能,而和系統中其他模塊接口是簡單的。這樣做不僅僅便于軟件測試和維護,還使模塊化程度較高的軟件易于開發,尤其當一組開發人員共同開發一個軟件時,模塊化能夠分割功能,而且接口可以簡化。
二、模塊獨立性標準
? ? ? ? 模塊的獨立性可以用兩個定性標準度量:耦合和內聚。
? ? ? ? 耦合是模塊之間相互連接的緊密程度的度量。模塊之間的連接越緊密,聯系越多,耦合性就越高,而其模塊獨立性就越弱。
? ? ? ? 內聚是一個模塊內部各個元素彼此結合的緊密程度的度量。
? ? ? ? 一個模塊內部各個元素之間的聯系越緊密,內聚性就越高,相對于其他模塊之間的耦合性就會降低,而模塊獨立性就越強。因此,模塊獨立性較強的模塊應該是高內聚低耦合的模塊。
三、耦合
? ? ? ? 耦合的強弱取決于各個模塊之間接口的復雜程度、調用模塊的方式以及哪些信息通過接口。一般模塊之間的連接方式有7 種,構成的耦合也有7 種類型。
1) 非直接耦合
? ? ? ? 如果兩個模塊之間沒有直接關系,它們之間的聯系完全是通過主模塊的控制和調用實現的,這就是非直接耦合。
? ? ? ? 這種耦合的模塊獨立性最強。但是,在一個軟件系統中不可能所有的模塊之間都無任何連接。
2) 數據耦合
? ? ? ? 如果兩個模塊彼此間通過數據參數(不是控制參數、公共數據結構或外部變量)交換信息,這種耦合稱為數據耦合。
? ? ? ? 由于限制了只通過參數表傳遞數據,所以按數據耦合開發的程序界面簡單、安全可靠。數據耦合是松散的耦合,模塊之間的獨立性比較強,在系統中必須有這類耦合。
3) 標記耦合
? ? ? ? 如果模塊之間通過參數表傳遞記錄信息,就是標記耦合。
由于模塊傳遞的不是簡單變量,而是某一數據結構的子結構,所以在設計中應避免這種耦合。
4) 控制耦合
? ? ? ? 如果模塊傳遞的信息中有控制信息,就稱作控制耦合。
? ? ? ? 這種耦合的實質是在單一接口上選擇多功能模塊中的某項功能。因此,對被控制模塊的任何修改,都會影響控制模塊。控制耦合屬于中等程度的耦合,它增加了系統的復雜程度。
5) 公共耦合
? ? ? ? 如果一組模塊通過同一個公共數據環境相互作用,則它們之間的耦合稱為公共耦合。
? ? ? ? 公共的數據環境可以是全局數據結構、共享的通信區、內存的公共覆蓋區、任何存儲介質上的文件、物理設備等。由于這種耦合的模塊都要訪問同一個公共數據環境,所以常會引發下列問題。
? ? ? ? A、公共數據環境內某個數據的修改將會影響到所有訪問該公共環境的其他模塊。
? ? ? ? B、無法控制各個模塊對公共數據的存取,嚴重影響軟件模塊的可靠性和適應性。
? ? ? ? C、公共數據名的使用,降低了程序的可讀性。
? ? ? ? 另外,公共耦合的模塊數越多,公共耦合的復雜程度就越高,因此在程序設計時要少使用公共耦合,只有在模塊之間共享的數據很多,而且通過參數表傳遞不是很方便的情況下才使用公共耦合。
6) 內容耦合
? ? ? ? 如果發生下列情形之一,兩個模塊之間就發生了內容耦合。
? ? ? ? A、一個模塊直接訪問另一個模塊的內部數據。
? ? ? ? B、一個模塊不能通過正常入口轉到另一模塊的內部。
? ? ? ? C、兩個模塊有一部分程序代碼重疊(只可能出現在匯編語言中)。
? ? ? ? D、一個模塊有多個入口。
? ? ? ? 內容耦合屬于最高程度的耦合,應該盡量避免使用。
7) 外部耦合
? ? ? ? 如果一組模塊都訪問同一全局簡單變量而不是同一全局數據結構,而且不是通過參數表傳遞該全局變量的信息,則稱為外部耦合。
? ? ? ? 總之,為了降低軟件的復雜程度,程序設計人員應盡量使用數據耦合,少用控制耦合,限制公共耦合的范圍,避免使用內容耦合。
四、內聚
? ? ? ? 內聚是一個模塊內部各個元素彼此結合的緊密程度的度量。一個內聚程度高的模塊應當完成軟件過程中的單一任務。它是信息隱蔽概念的一種自然擴展。
? ? ? ? 一般模塊的內聚性也有7 種類型。
1) 偶然內聚
? ? ? ? 如果一個模塊各部分之間沒有關系,或者即使有關系,這種關系也是很松散的,則稱作偶然內聚。
? ? ? ? 它是內聚程度最低的模塊。例如,一些不同的模塊中可能存在同一組語句,程序員為了節省空間,把它們抽出來組成一個新模塊,這就出現了偶然內聚的模塊。很明顯,這種模塊不易修改和維護,通常情況下應避免構造這種模塊。
2) 邏輯內聚
? ? ? ? 如果一個模塊中包含多個邏輯上相關的功能,每次被調用時,根據傳遞給該模塊的判定參數來確定模塊應執行的功能,稱作邏輯內聚。
? ? ? ? 它屬于單入口多功能模塊。例如,錯誤處理模塊根據收到的出錯信號顯示出不同的出錯信息等。邏輯模塊的修改也比較困難,有時對局部功能的改動也會影響到全局。
3) 時間內聚
? ? ? ? 如果一個模塊所包含的任務必須在同一時間內執行,稱作時間內聚,如初始化模塊和終止模塊。時間內聚比邏輯內聚好一些,它在一定程度上反映了程序的某些實質,但由于它把許多功能、任務組合在一起,給維護和修改帶來了困難。
4) 過程內聚
? ? ? ? 如果一個模塊內的處理是相關的,而且必須以特定次序執行,則稱為過程內聚。 ? ? ? ? ? 使用程序流程圖作為工具設計程序時,常常通過流程圖來確定模塊的劃分,這樣得到的就是過程內聚模塊。它相對時間內聚的程度更強一些,但由于僅僅為完整功能的一部分,所以內聚程度仍比較低。
5) 通信內聚
? ? ? ? 如果一個模塊各功能部分都使用了相同的輸入數據,或產生了相同的輸出數據,則稱為通信內聚。
? ? ? ? 通常,通信內聚模塊是通過數據流圖來定義的。因為此模塊中包含了許多獨立的功能,所以它的內聚程度高于過程內聚。但由于各功能部分使用了相同的I/O 緩沖區,從而降低了整個系統的效率。
6) 信息內聚
? ? ? ? 如果一個模塊能夠完成多個功能,各個功能都在同一數據結構上操作,每一項功能有唯一的入口點,稱作信息內聚。它可以看作是多個功能內聚模塊的組合,并能達到信息的隱蔽,增強了各模塊的獨立性。
7) 功能內聚
? ? ? ? 如果一個模塊內各個部分都是完成某一具體功能必不可少的組成部分, 稱作功能內聚。此模塊間功能明確、耦合簡單,是最高程序的內聚。
? ? ? ? 事實上,沒有必要精確地確定內聚的級別。重要的是設計時力爭做到高內聚,并且能夠辨認出低內聚的模塊,有能力通過修改設計提高模塊的內聚程度,降低模塊間的耦合程度,從而獲得較高的模塊獨立性。
總結