Métrica: Cyclomatic Complexity
La métrica Cyclomatic Complexity se utiliza para medir la complejidad de un programa al contar el número de rutas independientes lineales del código fuente.
Cyclomatic Complexity se calcula utilizando el gráfico de flujo de control del programa. La complejidad depende de la condición y de los puntos de decisión del gráfico de flujo de control.
Por ejemplo:
oNo hay condición ni punto de decisión: Complejidad = 1 (una ruta a través del código).
oUna declaración IF: Complejidad = 2 (dos rutas a través del código).
oUna declaración IF con dos condiciones: Complejidad = 3 (tres rutas a través del código).
o…
Existen diferentes interpretaciones e implementaciones de Cyclomatic Complexity disponibles, dependiendo de la herramienta de análisis. Algunas herramientas no tienen en cuenta expresiones con las instrucciones AND/OR/... en IF, REPEAT, WHILE... El McCabe Cyclomatic Complexity siempre se incrementa en +1. Otras herramientas también tienen en cuenta las expresiones en el flujo de código (fuera de una instrucción IF, REPEAT...) pero que luego se utilizan en una instrucción IF o REPEAT que resulta en un resultado Cyclomatic Complexity más alto. La implementación de Cyclomatic Complexity para el código IEC-61131-3 en EcoStruxure Machine Expert tiene en cuenta expresiones con AND/OR/... pero no tiene en cuenta expresiones precalculadas en el flujo de código o especificadas en una llamada de método.
Ejemplo
Ejemplo de cálculo de la Cyclomatic Complexity para código 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
Resultado de la Cyclomatic Complexity.
Cyclomatic Complexity (MCC) = 12