循環複雜度

循環複雜度()也稱為條件複雜度圈复杂度,是一種軟體度量,是由(Thomas J. McCabe, Sr.)在1976年提出,用來表示程式的複雜度,其符號為VG或是M。循環複雜度由程式的源代碼中量測線性獨立路徑的個數。此概念有些類似的量測文字複雜度的 ,不過方法不完全相同。

循環複雜度是由程式的控制流圖來計算:有向圖的節點對應程式中個別的程式碼,而若一個程式執行後會立刻執行另一程式碼,會有邊連結二程式碼對應的節點。圈複雜度可應用在程式的子程序、模組、方法或類別。

麥凱布首先提出一種稱為「基礎路徑測試」()的軟體測試方式,是測試程式中的每一線性獨立路徑,此情形的測試用例個數即為程式的循環複雜度。

「循環複雜度」的名稱有時會讓人誤解,因為此複雜度不只計算程式中的迴圈(循環)個數。循環複雜度是指程式的控制流圖中,若將結束點到啟始點再增加一個邊時,控制流圖中的圈(幾個邊形成封閉路徑)的個數的循環複雜度是利用程式的控制流圖來定義,控制流圖是一個有向圖,圖中的節點為程式的基礎模塊,若一個模塊結束後,可能會執行另一個模塊,則用箭頭連結二個模塊,並標示可能的執行順序。循環複雜度M可以用下式定義:

:M = EN + 2P

其中
:E 為圖中邊的個數
:N 為圖中節點的個數
:P 為圖中連通元件的個數

的控制流圖,若利用此圖計算循環複雜度,其公式為M=E-N+P,而E = 10、N = 8、P = 1,因此循環複雜度為3]]
另一個計算循環複雜度的公式,需修改控制流圖,每一個結束點都增加一個到啟始點的邊。修改後的圖稱為強連通,任何二個節點A和B,都可以找到從A到B及從B到A的路徑。程式的循環複雜度等於此圖中迴路的個數(也稱為第一貝蒂數),其公式如下

循環複雜度也可以延伸到多個結束點的程式,此時的循環複雜度如下:
:π - s + 2
其中
:π是程式中決策點的個數
:s為結束點的個數

應用
限制軟體複雜度
麥凱布提出循環複雜度時,其原始目的之一就是希望在軟體開發過程中就限制其複雜度。他建議程式設計者需計算其開發模組的複雜度,若一模組的循環複雜度超過10,需再分割為更小的模組

模組內聚性的評估
可以預期一個複雜度較高模組的內聚性會比較低,至少不會到功能內聚性的程度。一個有高複雜度及低內聚性的模組中會有許多的決策點,這類的模組多半執行超過一個明確定義的任務,因此內聚性較低。一個2005年的研究發現複雜度的度量和由專家評估的模組內聚性有高度負相關,反而針對內聚性設計的度量和專家評估結果之間的相關性還比較不明顯。

推測軟體缺陷個數
許多研究指出一模組及方法的循環複雜度和其中的缺陷個數有相關性,許多這類研究發現循環複雜度和缺陷個數有高度的正相關:循環複雜度最高的模組及方法,其中的缺陷個數也最多。

不過,有些研究是在控制模組大小相近的情形下進行分析(例如比較二個源代碼行數相近,但循環複雜度不同模組的缺陷個數),許多這類的研究發現循環複雜度和缺陷個數沒有明顯相關,不過仍有一些研究認為在此情形下二者仍有相關性。有些此領域的研究者認為那些研究結果循環複雜度和缺陷個數沒有明顯相關的研究,其研究方法的有效性可能有問題。

認為利用循環複雜度來預測缺陷個數,和利用源代碼行數來預測缺陷個數的結果大致相近。

同步複雜度
同步複雜度()是一種并行性軟體的量化屬性。同步複雜度分析程式碼,量測程式因為同步結構而產生額外的複雜度。同步複雜度在本質上可視為循環複雜度在多工軟體或多線程軟體上的延伸。

相關條目
*特徵蔓延
*決策到決策路徑
*计算机程序
*程序设计
*控制流程
*本質複雜度
*霍爾斯特德複雜度量測
*軟體工程
*軟體測試

註解
參考資料

评论 (0)

  • 还没有评论,来抢沙发吧。