Metrica: complessità ciclomatica

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:

oNessuna condizione o punto di decisione: complessità = 1 (un percorso nel codice).

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

oUna istruzione IF con due condizioni: complessità = 3 (tre percorsi nel codice).

o

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

Esempio

Esempio di calcolo di Cyclomatic Complexity per codice IEC-61131-3:

// 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