2014-06-12 14 views
7

ho trovato il seguente paragrafo relativo ciclomatica complessità on Wikipedia:complessità ciclomatica = 1 + affermazioni #if?

Si può dimostrare che la complessità ciclomatica di qualsiasi programma strutturato con un solo punto di ingresso e un punto di uscita è uguale al numero di punti di decisione (vale a dire, "se" dichiarazioni o cicli condizionali) contenuti in quel programma più uno.

Questo implicherebbe una complessità ciclomatica di 3 per due arbitraria istruzioni IF nidificate:

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

Dal esattamente una delle tre funzioni sta per essere chiamato, il mio intestino concorda con 3.

Tuttavia, due arbitraria se dichiarazioni potrebbero anche essere scritti in sequenza anziché nidificandoli:

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

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

Ora ci sono quattro percorsi attraverso il codice:

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

Non dovrebbe la complessità ciclomatica di questo il frammento quindi è 4 anziché 3?

Sto fraintendendo il paragrafo citato?

+0

Questo esatto esempio è discusso nell'articolo che hai collegato: http://en.wikipedia.org/wiki/Cyclomatic_complexity#Implications_for_software_testing –

risposta

7

La complessità ciclica è definita come il numero di percorsi linearmente indipendenti tramite il codice.

Nel suo secondo esempio abbiamo i seguenti percorsi che corre ...

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

si è completamente corretto che il numero di percorsi di esecuzione qui è 4. E tuttavia la complessità ciclomatica è 3.

La chiave è nel capire che cosa misure di complessità ciclomatica:

Definizione:

Un percorso linearmente indipendente è qualsiasi percorso attraverso il programma che introduce almeno un nuovo bordo non incluso in altri percorsi linearmente indipendenti .

da http://www.ironiacorp.com/

Il quarto percorso non è linearmente indipendenti dei primi tre percorsi, in quanto non introduce alcuna nuova dichiarazione nodi/di programma che non sono stati inclusi nei primi tre percorsi.

Come menzionato su the wikipedia article, la complessità ciclomatica è sempre minore o uguale al numero di percorsi di flusso di controllo univoci teorici, ed è sempre maggiore o uguale al numero minimo di percorsi di esecuzione effettivamente realizzabili.

(per verificare la seconda affermazione, immaginare se b == a era sempre true quando si immette il blocco di codice che è stato descritto).

+0

Grazie per la tua risposta! Sembra che sia stato semplicemente ingannevole nel pensare che la complessità ciclica == numero di percorsi attraverso il codice. – fredoverflow

+0

E se avessi il percorso true-true e false-false, questo lo renderebbe due e avresti visitato tutti e 4 i nodi? Cosa mi manca? –

+0

@fredoverflow puoi rispondere per favore? –

0

Sono d'accordo con la spiegazione del perfezionista. Ecco una spiegazione più informale nel caso del linguaggio Java:

La complessità ciclomatica di McCabe (McCC) per un metodo è espressa come il numero di percorsi di flusso di controllo indipendenti in esso. Rappresenta un limite inferiore per il numero di possibili percorsi di esecuzione nel codice sorgente e allo stesso tempo è un limite superiore per il numero minimo di casi di test necessari per raggiungere la copertura completa del test di ramo. Il valore della metrica viene calcolato come il numero delle seguenti istruzioni più 1: if, for, foreach, while, do-while, etichetta del caso (che appartiene a un'istruzione switch), catch, istruzione condizionale (? :). Inoltre, le logiche "e" (& &) e le espressioni logiche "o" (||) aggiungono anche 1 al valore perché la loro valutazione di cortocircuito può causare la ramificazione a seconda del primo operando. Le seguenti istruzioni non sono incluse: altrimenti, cambia, etichetta predefinita (che appartiene a un'istruzione switch), prova, infine.