2014-06-12 3 views
7

я нашел следующий пункт относительно цикломатической сложности on Wikipedia:цикломатическая сложность = 1 + #if утверждения?

Можно показать, что цикломатическое сложность любой структурированной программы только один входной точки и одну точку выхода, равно числу точек решения (то есть, «if» или условные петли), содержащиеся в этой программе, плюс один.

Это будет означать цикломатическую сложности 3 для двух произвольных вложенных если заявления:

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

Так точно одна из трех функций будет называться, моя кишка соглашается с 3.

Однако две произвольные, если заявления также может быть записана в последовательности вместо вложенности их:

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

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

В настоящее время существуют четыре пути через код:

  • обув, БАЗ
  • Foo, 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/

4-й путь не линейно зависит от первых трех путей, так как она не вводит никаких новых заявлений узлов/программ, которые не были включены в первые три пути.

Как упомянуто в 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, default label (который принадлежит команде switch), попробуйте, наконец.

Смежные вопросы