Metrica: complessità ciclomatica
La metrica Cyclomatic Complexity consente di misurare la complessità di un programma contando il numero di percorsi linearmente indipendenti nel codice sorgente.
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