Metrica: Cyclomatic Complexity

Descrizione utente

La metrica Cyclomatic Complexity consente di misurare la complessità di un programma contando il numero di percorsi linearmente indipendenti nel codice sorgente.

Calcolo metrica

La Cyclomatic Complexity viene calcolata mediante il grafico del flusso di controllo del programma. La complessità dipende dalla condizione e dai punti di decisione del grafico del flusso di controllo.

Ad esempio:

  • Nessuna condizione o punto di decisione: Complessità = 1 (un percorso nel codice).

  • Una istruzione IF: complessità = 2 (due percorsi nel codice).

  • Una istruzione IF con due condizioni: Complessità = 3 (tre percorsi nel codice).

Vi sono diverse interpretazioni/implementazione della Cyclomatic Complexity, in base allo strumento di analisi. Alcuni tool non considerano espressioni con AND/OR/ecc. nelle istruzioni IF, REPEAT, WHILE, ecc. La McCabe Cyclomatic Complexity è sempre incrementata di +1. Altri tool considerano anche le espressioni nel flusso di codice (al di fuori di un'istruzione IF, REPEAT, ecc.) ma utilizzati successivamente in un'istruzione IF o REPEAT che determina un risultato di Cyclomatic Complexity più alto. L'implementazione della Cyclomatic Complexity in EcoStruxure Machine Expert considera le espressioni con AND/OR/ecc. ma non considera le espressioni precalcolate nel flusso di codice o specificate in una chiamata di metodo.

Esempio

Esempio di calcolo di Cyclomatic Complexity:

// MCC +1 (Initial Value)

// MCC +0 (Pre calculation of condition not considered)
a := b OR c;

// MCC +0 (Method call with condition not considered in calling implementation)
METH4(a);

IF a AND b OR c XOR d AND NOT e THEN

   // MCC +5 (IF with 5 conditions)

    CASE i OF
       1..4:
           // MCC +1 (CASE range is considered as one condition)

           FOR i := 1 TO 10 DO               // MCC +1

               METH1();
           END_FOR

       10, 11, 12, 13:
           // MCC +1 (multiple CASE labels considered as one condition)

           REPEAT
               // MCC +1 (one condition in REPEAT)

               WHILE (a = TRUE AND b = FALSE) DO
                   // MCC +2 (two conditions in WHILE)

                   METH2();

               END_WHILE

           UNTIL (TRUE) END_REPEAT

        ELSE
            // MCC +0 (Default path through CASE statement)

            METH3();
    END_CASE
END_IF

Risultato di Cyclomatic Complexity

Cyclomatic Complexity (MCC) = 12