什么是軟件的內聚度和耦合度


一、聯系

當一個程序段或語句(指令) 引用了其它程序段或語句(指令)中所定義或使用的數據名(即存貯區、地址等)或代碼時,他們之間就發生了聯系。一個程序被划分為若干模塊時,聯系既可存在於模塊之間,也可存在於一個模塊內的程序段或語句之間,即模塊內部。聯系反映了系統中程序段或語句之間的關系,不同類型的聯系構成不同質量的系統。因此,聯系是系統設計必須考慮的重要問題。

系統被分成若干模塊后,模塊同模塊的聯系稱為塊間聯系;一個模塊內部各成份的聯系稱為塊內聯系。顯然,模塊之間的聯系多,則模塊的相對獨立性就差,系統結構就混亂;相反,模塊間的聯系少,各個模塊相對獨立性就強,系統結構就比較理想。同時,一個模塊內部各成份聯系越緊密,該模塊越易理解和維護。

二、評判模塊結構的標准

1.模塊獨立性

模塊化是軟件設計和開發的基本原則和方法,是概要設計最主要的工作。模塊的划分應遵循一定的要求,以保證模塊划分合理,並進一步保證以此為依據開發出的軟件系統可靠性強,易於理解和維護。根據軟件設計的模塊化、抽象、信息隱蔽和局部化等原則,可直接得出模塊化獨立性的概念。所謂模塊獨立性,即:不同模塊相互之間聯系盡可能少,應盡可能減少公共的變量和數據結構;一個模塊應盡可能在邏輯上獨立,有完整單一的功能。

模塊獨立性(Module independence)是軟件設計的重要原則。具有良好獨立性的模塊划分,模塊功能完整獨立,數據接口簡單,程序易於實現,易於理解和維護。獨立性限制了錯誤的作用范圍,使錯誤易於排除,因而可使軟件開發速度快,質量高。

為了進一步測量和分析模塊獨立性,軟件工程學引入了兩個概念,從兩個方面來定性地度量模塊獨立性的程度,這兩個概念是模塊的內聚度和模塊的耦合度。

2.塊間聯系的度量―耦合度

耦合度是從模塊外部考察模塊的獨立性程度。它用來衡量多個模塊間的相互聯系。一般來說,耦合度應從以下三方面來考慮,即:

耦合內容的數量,即模塊間發生聯系的數據和代碼的多少,同這些數據和代碼發生聯系的模塊的多少,多的耦合強,少的耦合弱;

模塊的調用方式,即模塊間代碼的共享方式。可分為用CALL語句調用方式和用GOTO語句直接訪問方式;

模塊間的耦合類型。耦合類型有以下幾種方式:

①獨立耦合

②數據耦合

③控制耦合

④公共耦合

⑤內容耦合

下面重點對各種類型的耦合作進一步的說明。

(1)獨立耦合

指兩個模塊彼此完全獨立,沒有直接聯系。它們之間的唯一聯系僅僅在於它們同屬於一個軟件系統或同有一個上層模塊。這是耦合程度最低的一種。當然,系統中只可能有一部分模塊屬此種聯系,因為一個程序系統中不可能所有的模塊都完全沒有聯系。

(2)數據耦合

指兩個模塊彼此交換數據。如一個模塊的輸出數據是另一個模塊的輸入數據,或一個模塊帶參數調用另一個模塊,下層模塊又返回參數。應該說,在一個軟件系統中,此種耦合是不可避免的,且有其積極意義。因為任何功能的實現都離不開數據的產生、表示和傳遞。數據耦合的聯系程度也較低。

(3)控制耦合

若在調用過程中,兩個模塊間傳遞的不是數據參數而是控制參數,則模塊間的關系即為控制耦合。控制耦合屬於中等程度的耦合,較之數據耦合模塊間的聯系更為緊密。但控制耦合不是一種必須存在的耦合。

當被調用模塊接收到控制信息作為輸入參數時,說明該模塊內部存在多個並列的邏輯路徑,即有多個功能。控制變量用以從多個功能中選擇所要執行的部分,因而控制耦合是完全可以避免的。排除控制耦合可按如下步驟進行:

①找出模塊調用時所用的一個或多個控制變量;

②在被調模塊中根據控制變量找出所有的流程;

③將每一個流程分解為一個獨立的模塊;

④將原被調模塊中的流程選擇部分移到上層模塊,變為調用判斷。

通過以上變換,可以將控制耦合變為數據耦合。由於控制耦合增加了設計和理解的復雜程度,因此在模塊設計時要盡量避免使用。當然,如果模塊內每一個控制流程規模相對較小,彼此共性較多,使用控制耦合還是合算的。

(4)公共耦合

公共耦合又稱公共環境耦合或數據區耦合。若多個模塊對同一個數據區進行存取操作,它們之間的關系稱為公共耦合。公共數據區可以是全程變量、共享的數據區、內存的公共復蓋區、外存上的文件、物理設備等。當兩個模塊共享的數據很多,通過參數傳遞可能不方便時,可以使用公共耦合。公共耦合共享數據區的模塊越多,數據區的規模越大,則耦合程度越強。公共耦合最弱的一種形式是:兩個模塊共享一個數據變量,一個模塊只向里寫數據,另一個模塊只從里讀數據。

當公共耦合程度很強時,會造成關系錯綜復雜,難以控制,錯誤傳遞機會增加,系統可靠性降低,可理解、維護性差。

(5)內容耦合

內容耦合是耦合程序最高的一種形式。若一個模塊直接訪問另一模塊的內部代碼或數據,即出現內容耦合。內容耦合的存在嚴重破壞了模塊的獨立性和系統的結構化,代碼互相糾纏,運行錯綜復雜,程序的靜態結構和動態結構很不一致,其惡劣結果往往不可預測。

內容耦合往往表現為以下幾種形式:

①一個模塊訪問另一模塊的內部代碼或數據;

②一個模塊不通過正常入口而轉到另一個模塊的內部(如使用GOTO語句或JMP指令直接進入另一模塊內部);

③兩個模塊有一部分代碼重迭(可能出現在匯編程序中,在一些非結構化的高級語言,如COBOL中也可能出現);

④一個模塊有多個入口(這意味着一個模塊有多種功能)。

一般講,在模塊划分時,應當盡量使用數據耦合,少用控制耦合(盡量轉成數據耦合),限制公共耦合的范圍,完全不用內容耦合。

3.塊內聯系的度量――內聚度

內聚度(Cohesion)是模塊內部各成份(語句或語句段)之間的聯系。顯然,模塊內部各成份聯系越緊,即其內聚度越大,模塊獨立性就越強,系統越易理解和維護。具有良好內聚度的模塊應能較好地滿足信息局部化的原則,功能完整單一。同時,模塊的高內聚度必然導致模塊的低耦合度。理想的情況是:一個模塊只使用局部數據變量,完成一個功能。

按由弱到強的順序,模塊的內聚度可分為以下7類,現分述於下。

(1)偶然內聚

塊內的各個任務(通過語句或指令來實現的)沒有什么有意義的聯系,它們之所以能構成一個模塊完全是偶然的原因。如下圖3-4-1所示。

在模塊T有三條語句。至少從表面上看不出這三條語句之間有什么聯系,只是由於P,Q,R,S四個模塊中都有這三條語句,為了節省空間才把它們作為一個模塊放在一起。這完全是偶然性的。偶然內聚的模塊有很多缺點:由於模塊內

沒有實質性的聯系,很可能在某種情況下一個調用模塊需要對它修改而別的模塊不需要。這時就很難處理。同時,這種模塊的含義也不易理解,甚至難以為它取一個合適的名字,偶然內聚的模塊也難於測試。所以,在空間允許的情況下,不應使用這種模塊。

(2)邏輯內聚

一個模塊完成的任務在邏輯上屬於相同或相似的一類(例如,用一個模塊產生各種類型的輸出),則該種模塊內的聯系稱為邏輯內聚。如圖3-4-2a和3-2-2b所示。

在圖3-4-2a中,模塊A,B,C的功能相似但不相同,如果把它們合並成一個模塊ABC,如圖3-4-2b所示,則這個模塊就為邏輯內聚,因為它們是由於邏輯上相似而發生聯系的。邏輯內聚是一種較弱的聯系。實際執行時,當X,Y,Z調用合成的模塊ABC時,由於原A,B,C並不完全相同,所以還要判別是執行不同功能的哪一部分。

邏輯內聚存在的問題是:

①修改困難,調用模塊中有一個要對其改動,還要考慮到其它調用模塊;

②模塊內需要增加開關,以判別是誰調用,因而增加了塊間聯系;

③實際上每次調用只執行模塊中的一部分,而其它部分也一同被裝入內存,因而效率不高。

(3)時間內聚

時間內聚是指一個模塊中包含的任務需要在同一時間內執行(如初始化,結束等所需操作)。如圖3―4―3所示的模塊。與偶然內聚和邏輯內聚相比,這種內聚類型要稍強些,因為至少在時間上,這些任務可以一起完成。但時間內聚和偶然內聚、邏輯內聚一樣,都屬低內聚度類型。

(4)過程內聚

如果一個模塊內的各個處理元素是相關的,而且必須按固定的次序執行,這種內聚就叫做過程內聚。過程內聚的各模塊內往往體現為有次序的流程。

 

(5)通信內聚

若一個模塊中的各處理元素需引用共同的數據(同一數據項、數據區或文件),則稱其元素間的聯系為通信內聚。通信內聚的各部分間是借助共同使用的數據聯系在一起的,故有較好的可理解性。通信內聚和過程內聚都屬中內聚度型模塊。

(6)順序內聚

若一個模塊內的各處理元素關系密切,必須按規定的處理次序順序執行,這樣的模塊為順序內聚類型。順序內聚的模塊內,后執行的語句或語句段往往依賴先執行的語句或語句段,以先執行的部分為條件。由於模塊內各處理元素間存在着這種邏輯聯系,所以順序內聚模塊的可理解性很強,屬高內聚度類型模塊。

(7)功能內聚

功能內聚是內聚度最高的一種模塊類型。如果模塊僅完成一個單一的功能,且該模塊的所有部分是實現這一功能所必須的,沒有多余的語句,則該模塊為功能內聚。功能內聚模塊的結構緊湊、界面清晰,易於理解和維護,因而可靠性強;又由於其功能單一,故復用率高。所以它是模塊划分時應注意追求的一種模塊類型。如圖3―4―7是模塊划分時得到的功能內聚模塊。

在模塊設計時應力爭做到高內聚,並且能夠辨別出低內聚的模塊,加以修改使之提高內聚度並降低模塊間的耦合度。具體設計時,應注意:

①設計功能獨立單一的模塊;

②控制使用全局數據;

③模塊間盡量傳遞數據型信息。

 

轉自 http://blog.sina.com.cn/s/blog_4ca059540100jnk7.html


免責聲明!

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



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