Esta métrica, propuesta por Thomas McCabe en 1976, se basa en el diagrama de flujo determinado por las estructuras de control de un determinado código. De dicho análisis se puede obtener una medida cuantitativa de la dificultad de crear pruebas automáticas del código y también es una medición orientativa de la fiabilidad del mismo.
El resultado obtenido en el cálculo de la complejidad ciclomática define el número de caminos independientes dentro de un fragmento de código y determina la cota superior del número de pruebas que se deben realizar para asegurar que se ejecuta cada sentencia al menos una vez.
Una vez calculada la complejidad ciclomática de un fragmento de código, se puede determinar el riesgo que supone utilizando los rangos definidos en la siguiente tabla:
Complejidad Ciclomática Evaluación del Riesgo
1-10 Programa Simple, sin mucho riesgo
11-20 Más complejo, riesgo moderado
21-50 Complejo, programa de alto riesgo
50 Programa no testeable, muy alto riesgo
A partir del análisis de muchos proyectos McCabe encontró que un valor 10 es un límite superior práctico para el tamaño de un módulo. Cuando la complejidad supera dicho valor se hace muy difícil probarlo, entenderlo y modificarlo. La limitación deliberada de la complejidad en todas las fases del desarrollo ayuda a evitar los problemas asociados a proyectos de alta complejidad. El Límite propuesto por McCabe sin embargo es fuente de controversias. Algunas organizaciones han utilizado el valor 15 con bastante éxito.
¿Cómo se calcula la complejidad ciclomática? Primero introducir una sencilla notación para la representación del flujo de control, denominada grafo de flujo de control de un programa.
- M = Complejidad ciclomática.
- E = Número de aristas del grafo. Una arista conecta dos vértices si una sentencia puede ser ejecutada inmediatamente después de la primera.
- N = Número de nodos del grafo correspondientes a sentencias del programa.
- P = Número de componentes conexos, nodos de salida.
M = E - N + 2*P
Una versión simplificada para el cálculo de la Complejidad Ciclomática es la siguiente:
M = Número de condiciones + 1
Esta fórmula hay que retocarla si el código a analizar presenta varios puntos de salida o "returns", pasando a ser:
M = Número de condiciones + Número de retornos o salidas
donde el número de salidas nunca descenderá de 1.
En las dos fórmulas en las que se utiliza el número de condiciones hay que tener en cuenta que, por ejemplo, un IF equivale a una condición y la rama ELSE equivaldría a otra condición. Por lo tanto, dado el siguiente fragmento de código en Cobol:
IF A >= 5
MOVE A TO B
ELSE
MOVE ZEROES TO B
END-IF
Tendríamos 2 condiciones. Para rebajar complejidad en un programa cuya complejidad ciclomática sea alta sería tan fácil como realizar modificaciones en el código hasta conseguir rebajarla. En el ejemplo anterior valdría con poner lo siguiente:
MOVE ZEROES TO B
IF A >= 5
MOVE A TO B
END-IF
Esto ha sido todo.
No hay comentarios:
Publicar un comentario