Complessità ciclica con due IF: perché è 3?

6

Ho letto un articolo con il seguente esempio:

void func()
{
if (condition1)
a = a + 1;
if (condition2)
a = a - 1;
}

Si dice che il CC è 3 in quanto vi sono tre percorsi possibili. Come mai? Perché non 4? Mi aspetterei VERO, VERO; FALSO, FALSO; VERO, FALSO e FALSO, VERO.

Non importa quali sono le affermazioni. CC = Ifs-EndPoints + 2. È sempre 3 per 2 IF e uno che termina ..

    
posta John V 17.01.2013 - 14:09
fonte

3 risposte

12

Se il tuo articolo "dice che CC è 3 in quanto ci sono tre percorsi possibili", nell'articolo mancano alcuni dettagli. La definizione wikipedia di complessità ciclomatica la definisce in termini di numero di nodi e spigoli nel grafico della funzione: M = E - N + 2P.

Questo è il grafico della tua funzione:

    (+)
     |
    (if)
     |\
     | (stmt)
     |/
    (if)
     |\
     | (stmt)
     |/
    (*)

E = 7, N = 6, P = 1 quindi M = 7 - 6 + 2 * 1 = 3.

    
risposta data 17.01.2013 - 14:38
fonte
2

TRUE, TRUE ha lo stesso risultato di FALSE, FALSE.

//TRUE,TRUE
void func()
{
    a = 1;

    if (condition1)
        a = a + 1; // a == 2
    if (condition2)
        a = a - 1; // a == 1

    // a == 1
}

//FALSE,FALSE
void func()
{
    a = 1;

    if (condition1)
        a = a + 1; // a == 1
    if (condition2)
        a = a - 1; // a == 1

    // a == 1 
}

//TRUE, FALSE
void func()
{
    a = 1;

    if (condition1)
        a = a + 1; // a == 2
    if (condition2)
        a = a - 1; // a == 2

    // a == 2 
}

//FALSE, TRUE
void func()
{
    a = 1;

    if (condition1)
        a = a + 1; // a == 1
    if (condition2)
        a = a - 1; // a == 0

    // a = 0
}
    
risposta data 17.01.2013 - 14:12
fonte
-2

Un link interessante: Complessità ciclopica e linee di codice: evidenza empirica di una relazione lineare stabile

ABSTRACT: "I ricercatori hanno spesso commentato l'alta correlazione tra la complessità ciclomatica di McCabe (CC) e le linee di codice (LOC). Molti hanno ritenuto questa correlazione abbastanza alta da giustificare la correzione di CC per LOC o anche la sostituzione di LOC per CC. da un punto di vista empirico, la relazione tra CC e LOC è ancora aperta, e ad oggi intraprendiamo il più ampio studio statistico su questa relazione, utilizzando tecniche di regressione moderne, riteniamo che la linearità di questa relazione sia stata strongmente sottovalutata, tanto che Si può affermare che CC non ha assolutamente alcun potere esplicativo. Questa ricerca dimostra che LOC e CC hanno una relazione lineare praticamente perfetta e stabile che vale per i programmatori, i linguaggi, i paradigmi del codice (procedurale rispetto all'oggetto) ei processi software. I modelli lineari sono sviluppati in relazione a LOC e CC Questi modelli sono verificati rispetto a oltre 1,2 milioni di file sorgente selezionati casualmente dal repository di codice SourceForge tory. Questi file rappresentano progetti software da tre lingue di destinazione (C, C ++ e Java) e una varietà di livelli di esperienza del programmatore, architetture software e metodologie di sviluppo. I modelli sviluppati sono in grado di prevedere con successo circa il 90% della varianza di CC dalla sola LOC. Ciò suggerisce non solo che la relazione lineare tra LOC e CC sia stabile, ma gli aspetti della complessità del codice che CC misura, come la dimensione dello spazio del test case, crescono linearmente con le dimensioni del codice sorgente attraverso linguaggi e paradigmi di programmazione. "

Questa è una dichiarazione molto strong.

    
risposta data 17.01.2013 - 14:51
fonte

Leggi altre domande sui tag