內聚性
內聚性(英語:Cohesion)也稱為內聚力,是一軟體度量,是指機能相關的程式組合成一模組的程度[1],或是各機能凝聚的狀態或程度[2]。是結構化分析的重要概念之一。量測內聚性的方式很多,有些方法是由分析源代碼,得到非量化的結果,有些方法則是檢查源代碼的文本特徵,以得到內聚性的量化分數。內聚性是屬於順序式的量測量,一般會以「高內聚性」或「低內聚性」來表示。一般會希望程式的模組有高內聚性,因為高內聚性一般和許多理想的軟體特性有關,包括魯棒性、可靠度、可復用性及易懂性(understandability)等特性,而低內聚性一般也代表不易維護、不易測試、不易復用以及難以理解。
而耦合性(英語:Coupling)是一個和內聚性相對的概念。一般而言高內聚性代表低耦合性,反之亦然。內聚性是由賴瑞·康斯坦丁所提出,是以實務上可減少維護及修改的「好」軟體的特性為基礎[3]。
高內聚性
在計算機科學中,內聚性是指機能相關的程式組合成一模組的程度。應用在物件導向程式設計中,若服務特定型別的方法在許多方面都很類似,則此型別即有高內聚性。在一個高內聚性的系統中,代碼可讀性及復用的可能性都會提高,程式雖然複雜,但可被管理。
以下的情形會降低程式的內聚性:
- 許多機能封裝在一型別內,可以藉由方法供外界使用,但機能彼此類似之處不多。
- 在方法中進行許多不同的機能,使用的是相關性低或不相關的資料。
低內聚性的缺點如下:
- 增加理解模組的困難度。
- 增加維護系統的困難度,因為一個邏輯修改會影響許多模組,而一個模組的修改會使得一些相關模組也要修改。
- 增加模組復用困難度,因為大部份的應用程式無法復用一個由許多不一定相關的機能組成的模組。
內聚性的類型
內聚性是一種非量化的量測,可利用評量規準來確認待確認源代碼的內聚性的分類。內聚性的分類如下,由低到高排列:
- 偶然內聚性(Coincidental cohesion,最低)
- 偶然內聚性是指模組中的機能只是剛好放在一起,模組中各機能之間唯一的關係是其位在同一個模組中(例如:「工具」模組)。
- 邏輯內聚性(Logical cohesion)
- 邏輯內聚性是只要機能只要在邏輯上分為同一類,不論各機能的本質是否有很大差異,就將這些機能放在同一模組中(例如將所有的滑鼠和鍵盤都放在輸入處理副程式中)。模塊內執行幾個邏輯上相似的功能,通過參數確定該模塊完成哪一個功能。
- 時間性內聚性(Temporal cohesion)
- 時間性內聚性是指將相近時間點執行的程序,放在同一個模組中(例如在捕捉到一個異常後呼叫一函式,在函式中關閉已開啟的檔案、產生錯誤日誌、並告知使用者)。
- 程序內聚性(Procedural cohesion)
- 程序內聚性是指依一組會依照固定順序執行的程序放在同一個模組中(例如一個函式檢查檔案的權限,之後開啟檔案)。
- 聯絡內聚性/信息內聚/通信內聚(Communicational cohesion)
- 聯絡內聚性是指模組中的機能因為處理相同的資料或者指各處理使用相同的輸入數據或者產生相同的輸出數據,因此放在同一個模組中(例如一個模組中的許多機能都存取同一個記錄)。
- 依序內聚性/順序內聚(Sequential cohesion)
- 依序內聚性是指模組中的各機能彼此的輸入及輸出資料相關,一模組的輸出資料是另一個模組的輸入,類似工廠的生產線(例如一個模組先讀取檔案中的資料,之後再處理資料)。
- 功能內聚性(Functional cohesion,最高)
- 功能內聚性是指模組中的各機能是因為它們都對模組中單一明確定義的任務有貢獻(例如XML字串的詞法分析)。
由賴瑞·康斯坦丁、愛德華·尤登及史蒂夫·麥康奈爾等人的研究[4]都提出偶然內聚性和邏輯內聚性是不好的,聯絡內聚性和依序內聚性是好的,而功能內聚性是最理想的狀態。
相關條目
參考資料
- ^ Alan Hecht and Andy Simmons (1986) Integrating Automated Structured Analysis and Design with Ada Programming Support Environments (頁面存檔備份,存於網際網路檔案館) NASA 1986.
- ^ Taco Oosterkamp; 蔡煥麟. 設計可維護的應用程式. [2010-06-09]. (原始內容存檔於2018-10-02) (中文).
- ^ W. Stevens, G. Myers, L. Constantine, 「Structured Design」, IBM Systems Journal, 13 (2), 115-139, 1974.
- ^ Code Complete 2nd Ed., p168-171
外部連結
- Definitions of Cohesion metrics (頁面存檔備份,存於網際網路檔案館)
- Cohesion metrics (頁面存檔備份,存於網際網路檔案館)
- NDepend (頁面存檔備份,存於網際網路檔案館) Software metrics for .NET
- CPPDepend (頁面存檔備份,存於網際網路檔案館) Software metrics for Microsoft Visual Studio C++
- JavaDepend (頁面存檔備份,存於網際網路檔案館) Software metrics for Java