La complejidad ciclomática y cómo simplificar tus desarrollos

La calidad de software empieza en el código, por eso tu código debe ser lo más sencillo posible. Reducir su complejidad ciclomática al mínimo viable, te ayuda a tener un código limpio de calidad.

¿Qué es la complejidad ciclomática?

Me gusta la definición que puedes leer en Wikipedia:

La Complejidad Ciclomática (en inglés, Cyclomatic Complexity) es una métrica del software en ingeniería del software que proporciona una medición cuantitativa de la complejidad lógica de un programa.

Esta métrica la propuso Thomas McCabe en 1976, y para obtenerla, utiliza un diagrama de flujo sobre el código a analizar. Y si te gustan los documentos históricos, puedes ver la publicación original aquí.

ComplejidadCiclomatica

Una vez calculada, el resultado nos muestra los distintos caminos que puede seguir una aplicación, desde su entrada hasta su salida, según los bucles y condiciones que contenga.

Es fundamental para la realización de pruebas de caja blanca, ya que son las pruebas que se realizan sobre las estructuras de control de flujo y buscan principalmente defectos de fiabilidad o disponibilidad, y para ello, es clave la ruta que seguirá la aplicación según las condiciones que vaya cumpliendo la ejecución.

Además, también sirve para analizar el riesgo que supone un cambio sobre él, pues cuanto más elevado sea su valor, más riesgo supone su modificación.

¿Cómo se calcula la complejidad ciclomática?

Vamos a tomar como ejemplo el siguiente fragmento de código:

int x,y,r;
 if (x<0 || y<0) {
     system.out.println(“X o Y son negativos”);
 } else {
     r=(x+y)/2;
     system.out.println(“La media de X e Y es:” + r );
 }

Y sobre él obtendrías el siguiente diagrama, en el que los círculos serán los nodos, y las flechas las aristas. Como puedes ver los nodos azules (2), representan la entrada y la salida de la ejecución, los naranjas (4) las condiciones, y las aristas (7) las rutas de ejecución.

Diagrama de flujo

Para calcularla, tienes tres opciones:

  • Restar las aristas menos los nodos y sumar 2:
    • V(G) = Aristas – Nodos + 2
    • V(G) = 7 – 6 + 2 = 3
  • Sumar 1 al número de nodos predicados (aquellos de los que salen dos flechas)
    • V(G) = Nodos predicados + 1
    • V(G) = 2 + 1 = 3
  • Contar el número de regiones (espacios «encerrados entre nodos y aristas», también se tiene en cuenta el espacio «exterior» a todos los nodos y aristas.
    • V(G) = Regiones
    • V(G) = 3

Existe un cierto «acuerdo» en cuanto a la simplicidad de un código, en función de su complejidad ciclomática. Por lo que se establece que, según el valor obtenido, podemos determinar cómo es:

Complejidad ciclomática

Tipo de código

1-10

Simple

11-20

Algo complejo

21-50

Complejo

50

No testeable

Si quieres seguir practicando, puedes buscar páginas para calcular la complejidad ciclomática. Te será muy útil, sobretodo si estás pensando en obtener alguna certificación de testing.

Herramientas para la complejidad ciclomática

Si tengo que destacar una herramienta para calcularla sería SonarQube.

Muestra las métricas más importantes para analizar tu código, y entre ellas, como est´sd viendo, no podía faltar la complejidad ciclomática.

Para poder verla, sólo tienes que acceder, dentro del proyecto que hayas analizado, a Measures > Complexity > Cyclomatic Complexity

SonarQube complejidad ciclomatica

Ahí podrás ver el valor total de todo el proyecto, así como el de cada archivo o directorio.

Si quieres saber más detalles de cómo SonarQube calcula la complejidad ciclomática dependiendo del lenguaje utilizado puedes verlo en su documentación oficial.

Ventajas de reducir la complejidad ciclomática

Si puedes conseguir reducirla al mínimo, conseguirás:

  • Facilitar el mantenimiento del código
  • Simplificar la refactorización
  • Ver de forma rápida y global la calidad de tu aplicación
  • Hacer más fácil la escalabilidad del proyecto

Cómo reducir la complejidad ciclomática

Más que reducir la complejidad ciclomática, la preocupación debería ser porque «no creciera», siempre es mejor prevenir que curar

Aquí van una serie de consejos para que tengas un código sencillo:

No abuses de la indentación

Lo ideal sería un solo nivel por cada método

Intenta evitar las sentencias switch

Suelen utilizar bastantes parámetros, por lo que el número de «caminos a seguir» en el código se dispara

Desarrolla métodos lo más pequeños posibles

Tendrás un código más sencillo y más fácil de mantener, testear y corregir.


¿Se te ocurre alguna forma más de reducir la complejidad ciclomática?

Fuentes

Lectura recomendada

Fundamentos de un Pipeline Jenkins

Un Pipeline Jenkins es la clave para el despliegue continuo en esta herramienta open source ¿sabes cómo funciona?

Deja un comentario