2014-06-12 17 views
7

znalazłem następujący akapit dotyczące cyclomatic złożoności on Wikipedia:złożoność cykliczna = 1 + #if instrukcje?

Można wykazać, że cyklomatyczna złożoność każdego programu zorganizowanego z tylko jednym punktem wejściowym i jednym punktem wyjścia jest równa liczbie punktów decyzyjnych (tj wyrażenia "if" lub pętle warunkowe) zawarte w tym programie plus jeden.

To oznaczałoby cyclomatic złożoność 3 dla dwóch arbitralne zagnieżdżonych instrukcji if:

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

Ponieważ dokładnie jeden z trzech funkcji będzie się nazywać, mój gut zgadza się z 3.

jednak dwa arbitralne if można także zapisać w sekwencji zamiast ich gniazdowania:

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

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

Obecnie istnieją cztery ścieżki za pomocą kodu:

  • foo Baz
  • foo, qux
  • bar, baz
  • bar, qux

Jeżeli nie cyklomatyczna złożoność tego fragment powinien być 4 zamiast 3?

Czy nie rozumiem cytowanego akapitu?

+0

Ten dokładny przykład został omówiony w artykule, który łączysz: http://pl.wikipedia.org/wiki/Cyclomatic_complexity#Implications_for_software_testing –

Odpowiedz

7

Złożoność cykliczna jest definiowana jako liczba liniowo niezależnych ścieżek za pośrednictwem kodu.

W swoim drugim przykładzie mamy następujące ścieżki, który działa ...

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

Jesteś całkowicie poprawny, że liczba ścieżek wykonania tutaj to 4. I jeszcze Złożoność cykliczna jest 3.

kluczem jest zrozumienie, co cyclomatic środki złożoność:

Definicja:

Liniowo niezależną ścieżką jest dowolna ścieżka w programie, która wprowadza co najmniej jedną nową krawędź, która nie jest zawarta w żadnej innej liniowo niezależnej ścieżce .

z http://www.ironiacorp.com/

4th ścieżka nie jest liniowo niezależne od pierwszych trzech ścieżek, gdyż nie wprowadzają żadnych nowych sprawozdań węzły/programów, które nie zostały ujęte w pierwszych trzech ścieżkach.

Jak wspomniano w artykule the wikipedia article, złożoność cykliczna jest zawsze mniejsza lub równa liczbie teoretycznych unikalnych ścieżek przepływu sterowania i zawsze jest większa lub równa minimalnej liczbie faktycznie osiągalnych ścieżek wykonania.

(aby zweryfikować drugie stwierdzenie, wyobraź sobie, że b == a było zawsze prawdziwe przy wpisywaniu się do opisanego bloku kodu).

+0

Dzięki za odpowiedź! Wygląda na to, że po prostu wprowadziłem w błąd myśląc, że złożoność cykliczna == liczba ścieżek przez kod. – fredoverflow

+0

Co zrobić, jeśli masz ścieżkę true-true i false-false, która sprawiłaby, że dwoje byś odwiedziła wszystkie 4 węzły? Czego mi brakuje? –

+0

@fredoverflow czy możesz odpowiedzieć proszę? –

0

Zgadzam się z wyjaśnieniem perfekcjonistą. Oto bardziej nieformalne wyjaśnienie w przypadku języka Java:

Złożoność cykliczna McCabe'a (McCC) dla metody wyrażana jest jako liczba niezależnych ścieżek przepływu sterowania w niej. Reprezentuje dolną granicę dla liczby możliwych ścieżek wykonania w kodzie źródłowym i jednocześnie jest górną granicą dla minimalnej liczby przypadków testowych potrzebnych do uzyskania pełnego zasięgu testu gałęzi. Wartość metryki jest obliczana jako liczba następujących instrukcji plus 1: if, for, foreach, while, do-while, etykieta sprawy (która należy do instrukcji switch), catch, instrukcja warunkowa (? :). Co więcej, logiczne "i" (& &) i logiczne "lub" (||) również dodają 1 do wartości, ponieważ ich ocena zwarcia może powodować rozgałęzienia w zależności od pierwszego argumentu. Poniższe instrukcje nie są dołączone: inaczej przełącznik, domyślna etykieta (która należy do instrukcji przełączania), spróbuj, w końcu.