1. 程式人生 > >軟體複雜度和圈複雜度

軟體複雜度和圈複雜度

作者:翁鬆秀


軟體複雜度和圈複雜度

軟體複雜度

1,起源與應用

  • 成立於1976的McCabe & Associates公司開發出了McCabe Cyclomatic Complexity Metric(McCabe圈複雜度)技術對軟體進行結構測試
  • McCabe複雜度是對軟體結構進行嚴格的算術分析得來的,實質上是對程式拓撲結構複雜性的度量,明確指出了任務複雜部分。
  • McCabe複雜度能幫助工程師識別難以測試和維護的模組,已經成為評估軟體質量的一個重要標準。
  • McCabe複雜度可以為軟體開發過程中平衡成本、進度和效能提供指導

2,McCabe複雜度分類
在這裡插入圖片描述

(1)圈複雜度(Cyclomatic Complexity (v(G)) )
概念: 圈複雜度用來衡量一個模組的複雜程度
計算方法: 一個模組控制流圖有e條邊,n個節點,它的圈複雜度v(G) = e - n + 2。
在這裡插入圖片描述

(2)基本複雜度(Essential Complexity (ev(G)) )
概念: 基本複雜度用來衡量程式非結構化程度
計算方法: 將模組控制流圖中的結構化部分簡化成節點,計算簡化後控制流圖的圈複雜度就是基本複雜度。

(3)模組設計複雜度(Module Design Complexity (iv(G)) )
概念: 模組設計複雜度用來衡量模組之間的呼叫關係

,複雜度越高,模組之間耦合性越高,越難隔離,維護和複用。
計算方法: 從模組控制流圖中移去那些不包含呼叫子模組的判定迴圈結構後得到的圈複雜度。模組設計複雜度通常遠小於圈複雜度。

(4)設計複雜度(Design Complexity (S0) )
概念: 用來衡量程式模組之間的相互作用關係。
計算方法: 程式中所有模組設計複雜度之和。
在這裡插入圖片描述

(5)整合複雜度(Integration Complexity (S1) )
概念: 整合測試的數量表示,也是程式中獨立線性子樹的數目。
計算方法: S1=S0-N+1, N是程式中模組的數目。

(6)行數(Number of Lines (nl) )
概念:

模組中總的程式碼行數,包括註釋。

(7)規範化複雜度(Normalized Complexity (nv) )
概念: 規範化複雜度是圈複雜度和行數的比。
計算方法: nv=v(G)/nl

(8)全域性資料複雜度

(9)區域性資料複雜度

(10)病態資料複雜度

圈複雜度

概念: 衡量一個模組的複雜程度,數量上表現為獨立路徑的條數,也就是合理預防錯誤所需測試的最少路徑條數。圈複雜度以軟體的控制流圖為基礎。經驗表明,程式的可能錯誤和高的圈複雜度有很大的關係,McCabe & Associates建議圈複雜度到10。過於複雜的模組容易出錯,難於理解、測試、更正,所以應當在軟體開發的各個階段有意識地限制複雜度。
計算方法一: 一個模組控制流圖有e條邊,n個節點,它的圈複雜度v(G) = e - n + 2。
在這裡插入圖片描述
計算方法二: v(G)=判定節點數+1。對於多分支的CASE結構IF-ELSEIF-ELSE結構,要求必須統計全部實際的判定節點數,也即每個ELSEIF語句,以及每個CASE語句,都應該算為一個判定節點。
在這裡插入圖片描述
計算方法三: v(G)=R。其中,R代表平面被控制流圖劃分成的區域數。
在這裡插入圖片描述

方法總結:

  • 針對程式的控制流圖計算圈複雜度V(G)時,最好還是採用公式v(G)=e-n+2;
  • 針對模組的控制流圖時,可以直接統計判定節點數,這樣更為簡單;
  • 針對複雜的控制流圖時,使用區域計算公式v(G)=R更為簡單。