2014-06-12 40 views
7

我發現關於圈複雜度on Wikipedia以下段落:cyclomatic複雜性= 1 + #if語句?

可以看出,任何結構化程序,只有一個入口點和一個出口點的圈複雜度等於(決策點的數量即「if」語句或條件循環)包含在該程序中加上一個。

這將意味着3圈複雜度的任意兩個嵌套的if語句:

if (a) 
{ 
    if (b) 
    { 
     foo(); 
    } 
    else 
    { 
     bar(); 
    } 
} 
else 
{ 
    baz(); 
} 

由於恰好的三個功能是去一個被稱爲,我的直覺與3

同意

然而,兩個任意if語句也可以按順序寫入,而不是嵌套它們:

if (a) 
{ 
    foo(); 
} 
else 
{ 
    bar(); 
} 

if (b) 
{ 
    baz(); 
} 
else 
{ 
    qux(); 
} 

現在有通過代碼四條路徑:

  • 富,巴茲
  • 富,qux
  • 酒吧,巴茲
  • 酒吧,qux

不應該這樣做的圈複雜度片段因此是4而不是3?

我誤解了引用的段落嗎?

+0

這個確切的例子在您鏈接的文章中進行了討論:http://en.wikipedia.org/wiki/Cyclomatic_complexity#Implications_for_software_testing –

回答

7

圈複雜度定義爲通過代碼線性無關路徑的數量。

在你的第二個例子,我們有一個運行以下路徑...

| # | A | B | Nodes hit | 
| 1 | true | true | foo() baz() | 
| 2 | true | false | foo() qux() | 
| 3 | false | true | bar() baz() | 
| 4 | false | false | bar() qux() | 

你是完全正確的,這裏的執行路徑的數量是4然而圈複雜度是3

的關鍵是理解什麼圈複雜度的措施:

定義:

線性獨立路徑是通過程序的任何路徑,其中 引入至少一個未包含在任何其他線性無關路徑中的新邊沿。

http://www.ironiacorp.com/

該第四路徑是不是線性獨立於第一三條路徑的,因爲它不引入了未包括在第一三條路徑的任何新的節點/程序語句。

the wikipedia article所述,圈複雜度總是小於或等於理論上唯一的控制流路徑的數量,並且總是大於或等於實際可實現的執行路徑的最小數量。

(驗證第二條語句,想象一下,如果b == a是總是在輸入您描述的代碼塊時爲true)。

+0

感謝您的回答!看來我只是誤以爲循環複雜度==通過代碼的路徑數量。 – fredoverflow

+0

如果你有路徑true-true和false-false,那會使它變成兩個,你會訪問所有4個節點?我錯過了什麼? –

+0

@fredoverflow你能回答嗎? –

0

我同意完美主義者的解釋。下面是Java語言中非正式的解釋:

方法的McCabe's Cyclomatic Complexity(McCC)表示爲其中的獨立控制流路徑的數量。它代表了源代碼中可能執行路徑的數量的下限,同時它是實現完整分支測試覆蓋所需的最小數量的測試用例的上限。度量值的計算方式爲以下指令的數量加1:if,for,foreach,while,do-while,case標籤(屬於switch指令),catch,條件語句(?:)。此外,邏輯「和」(& &)和邏輯「或」(||)表達式也將該值加1,因爲它們的短路評估會導致分支,具體取決於第一個操作數。不包括以下說明:else,switch,默認標籤(屬於開關指令),最後嘗試。