內聚性

内聚性（）也稱為内聚力，是一軟體度量，是指機能相關的程式組合成一模組的程度Alan Hecht and Andy Simmons (1986) Integrating Automated Structured Analysis and Design with Ada Programming Support Environments  NASA 1986.，或是各機能凝聚的狀態或程度。是結構化分析的重要概念之一。量測内聚性的方式很多，有些方法是由分析源代碼，得到非量化的結果，有些方法則是檢查源代碼的文本特徵，以得到内聚性的量化分數。内聚性是屬於順序式的量測量，一般會以「高内聚性」或「低内聚性」來表示。一般會希望程式的模組有高内聚性，因為高内聚性一般和許多理想的軟體特性有關，包括鲁棒性、可靠度、及易懂性（understandability）等特性，而低内聚性一般也代表不易維護、不易測試、不易復用以及難以理解。

而耦合性（）是一個和内聚性相對的概念。一般而言高内聚性代表低耦合性，反之亦然。内聚性是由所提出，是以實務上可減少維護及修改的「好」軟體的特性為基礎W. Stevens, G. Myers, L. Constantine, “Structured Design”, IBM Systems Journal, 13 (2), 115-139, 1974.。

高内聚性
在計算機科學中，内聚性是指機能相關的程式組合成一模組的程度。應用在物件導向程式設計中，若服務特定型別的方法在許多方面都很類似，則此型別即有高内聚性。在一個高内聚性的系統中，代碼可讀性及復用的可能性都會提高，程式雖然複雜，但可被管理。

以下的情形會降低程式的内聚性：

許多機能封裝在一型別內，可以藉由方法供外界使用，但機能彼此類似之處不多。
在方法中進行許多不同的機能，使用的是相關性低或不相關的資料。

低內聚性的缺點如下：

增加理解模組的困難度。
增加維護系統的困難度，因為一個邏輯修改會影響許多模組，而一個模組的修改會使得一些相關模組也要修改。
增加模組復用困難度，因為大部份的應用程式無法復用一個由許多不一定相關的機能組成的模組。

内聚性的類型
内聚性是一種非量化的量測，可利用來確認待確認源代碼的内聚性的分類。内聚性的分類如下，由低到高排列：

偶然內聚性（Coincidental cohesion，最低）偶然內聚性是指模組中的機能只是剛好放在一起，模組中各機能之間唯一的關係是其位在同一個模組中（例如：「工具」模組）。

邏輯內聚性（Logical cohesion）邏輯內聚性是只要機能只要在邏輯上分為同一類，不論各機能的本質是否有很大差異，就將這些機能放在同一模組中（例如將所有的滑鼠和鍵盤都放在輸入處理副程式中）。模块内执行几个逻辑上相似的功能，通过参数确定该模块完成哪一个功能。

時間性內聚性（Temporal cohesion）時間性內聚性是指將相近時間點執行的程序，放在同一個模組中（例如在捕捉到一個異常後呼叫一函式，在函式中關閉已開啟的檔案、產生錯誤日誌、並告知使用者）。

程序內聚性（Procedural cohesion）程序內聚性是指依一組會依照固定順序執行的程序放在同一個模組中（例如一個函式檢查檔案的權限，之後開啟檔案）。

聯絡內聚性/信息内聚/通信内聚（Communicational cohesion）聯絡內聚性是指模組中的機能因為處理相同的資料或者指各处理使用相同的输入数据或者产生相同的输出数据，因此放在同一個模組中（例如一個模組中的許多機能都存取同一個記錄）。

依序內聚性/顺序内聚（Sequential cohesion）依序內聚性是指模組中的各機能彼此的輸入及輸出資料相關，一模組的輸出資料是另一個模組的輸入，類似工廠的生產線（例如一個模組先讀取檔案中的資料，之後再處理資料）。

功能內聚性（Functional cohesion，最高）功能內聚性是指模組中的各機能是因為它們都對模組中單一明確定義的任務有貢獻（例如XML字串的词法分析）。

由、愛德華·尤登及等人的研究Code Complete 2nd Ed., p168-171都提出偶然內聚性和邏輯內聚性是不好的，聯絡內聚性和依序內聚性是好的，而功能內聚性是最理想的狀態。

相關條目
耦合性 (計算機科學)

靜態程序分析
GRASP (面向对象设计)
SOLID (面向对象设计)

參考資料

外部連結
 Definitions of Cohesion metrics 
Cohesion metrics 
NDepend  Software metrics for .NET
CPPDepend  Software metrics for Microsoft Visual Studio C++
JavaDepend  Software metrics for Java

Category:软件架构
Category:軟體度量