共用方式為


程式碼度量 - 類別結合程度

類別結合程度也會使用最初由 CK94 所定義的名稱「物件之間的結合 (Coupling Between Objects (CBO))」。 基本上,類別結合程度是單一類別所使用類別數目的量值。 此計量的高數值表示不良,低數值通常是良好狀態。 類別結合程度已被證明是軟體失敗的準確預測工具,且最近的研究指出,上限值 9 是最有效率的 S2010

根據 Microsoft 文件,類別結合程度「透過參數、區域變數、傳回型別、方法呼叫、泛型或範本具現化、基底類別、介面實作、外部類型上定義的欄位,以及屬性裝飾,測量唯一類別的結合程度。 良好的軟體設計會規定類型和方法都應有高內聚和低結合程度。 高結合程度表示設計與其他類型有許多相互依賴性,因而難以重複使用和維護。」

結合程度和內聚的概念明確相關。 為了專注在這個主題的討論,除了提到 KKLS2000 的簡短定義以外,我們不會深入探討內聚:

「Yourdon 和 Constantine 引進模組內聚,形式為「模組內部元素與另一個元素有多緊密繫結或相關」YC79。 如果模組只代表一個工作 […],而且其所有元素都參與此單一工作,則模組具有很強的內聚。 他們將內聚描述為設計的屬性,而不是程式碼,以及可用來預測再使用性、可維護性和可變更性的屬性。」

類別結合程度範例

讓我們看看作用中的類別結合程度。 首先,建立新的主控台應用程式,並建立名為 Person 的新類別,其中包含一些屬性,然後立即計算程式碼度量:

類別結合程度範例 1

請注意,類別結合程度是 0,因為這個類別不會使用任何其他類別。 現在,使用建立 Person 執行個體的方法建立另一個名為 PersonStuff 的類別,並設定屬性值。 再次計算程式碼度量:

類別結合程度範例 2

查看類別結合程度值如何上升? 另請注意,無論您設定多少個屬性,類別結合程度值只會上升 1,而不是其他值。 類別結合程度只會針對此計量測量每個類別一次,無論其使用量多少。 此外,您可以看到 DoSomething() 有 1,但是建構函式 PersonStuff() 的值為 0? 目前建構函式中沒有使用另一個類別的程式碼。

如果您將程式碼放在使用另一個類別的建構函式中,該怎麼辦? 以下是您得到的內容:

類別結合程度範例 3

現在建構函式顯然有使用另一個類別的程式碼,而類別結合程度計量會顯示這個事實。 同樣地,您可以看到 PersonStuff() 的整體類別結合程度為 1,而 DoSomething() 也是 1,顯示不論您有多少使用它的內部程式碼,都只會使用一個外部類別。

接下來,建立另一個新類別。 為這個類別提供名稱,並在其中建立一些屬性:

類別結合程度範例 - 新增新類別

現在,在 PersonStuff 類別內的 DoSomething() 方法中取用類別,並再次計算程式碼度量:

類別結合程度範例 4

如您所見,PersonStuff 類別的類別結合程度最多可達 2,而且如果您鑽研類別,您可以看到 DoSomething() 方法具有其中最大的結合程度,但是建構函式仍然只會耗用 1 個類別。 使用這些計量,您可以看到指定類別的整體最大數目,並向下切入每個成員的詳細資料。

魔術數字

與循環複雜度一樣,沒有適合所有組織的限制。 不過,S2010 確實表示 9 的限制是最佳的:

「因此,我們會考慮 […] 為最有效閾值。 這些閾值 (針對單一成員) 是 CBO = 9[…]。」(已新增強調)

程式碼分析

程式碼分析包含可維護性規則的類別。 如需詳細資訊,請參閱可維護性規則。 使用舊版程式碼分析時,延伸設計指導方針規則集包含可維護性區域:

類別結合程度延伸設計指導方針規則

可維護性區域內是類別結合程度的規則:

類別結合程度規則

當類別結合程度過多時,此規則會發出警告。 如需詳細資訊,請參閱 CA1506:避免過度類別結合程度

引用

CK94

Chidamber, S. R. 和 Kemerer, C. F. (1994 年)。 A Metrics Suite for Object Oriented Design (IEEE Transactions on Software Engineering, Vol. 20, No. 6). Retrieved May 14, 2011, from the University of Pittsburgh web site: http://www.pitt.edu/~ckemerer/CK%20research%20papers/MetricForOOD_ChidamberKemerer94.pdf

KKLS2000

Kabaili, H.、Keller, R.、Lustman, F. 和 Saint-Denis, G。(2000)。 類別內聚重新檢視:工業系統的經驗研究 (物件導向軟體工程量化方法研討會論文集)。 2011 年 5 月 20 日擷取自 Université de Montréal 網站 http://www.iro.umontreal.ca/~sahraouh/qaoose/papers/Kabaili.pdf

SK2003

Subramanyam, R. 和 Krishnan, M. S. (2003 年)。 Empirical Analysis of CK Metrics for Object-Oriented Design Complexity: Implications for Software Defects (IEEE Transactions on Software Engineering, Vol. 29, No. 4).

S2010

Shatnawi, R.(2010). A Quantitative Investigation of the Acceptable Risk Levels of Object-Oriented Metrics in Open-Source Systems (IEEE Transactions on Software Engineering, Vol. 36, No. 2).

YC79

Edward Yourdon 和 Larry L. Constantine。 結構化設計。 Prentice Hall, Englewood Cliffs, N.J., 1979.