Para utilizar todas las funcionalidades que ofrece este sitio, es necesario tener JavaScript habilitado.

Siempre debemos estar en búsqueda de herramientas que nos ayuden a crear código de buena calidad, ese es un deber de todo programador.  Durante ese proceso de auto-mejoramiento, inevitablemente nos vamos a topar con las métricas de software y dentro de ese campo, nos vamos a encontrar con una muy útil llamada complejidad ciclomática (Cyclomatic Complexity en inglés).

La complejidad ciclomática calcula el número de puntos en donde se toman decisiones. Hacer el cálculo de la complejidad ciclomática es muy sencillo y aunque hay herramientas que nos pueden asistir en ello, uno mismo puede hacer la cuenta con gran facilidad (por lo menos para archivos sencillos). Básicamente vamos a contar la declaración de la función o método, los bucles y condicionales (for, foreach, while, if, &&, ||, etc).

Vamos al código - Imaginemos que tenemos una función que nos sirve para asegurar que un array siempre contenga algunos campos definidos. Calculemos su complejidad ciclomática.

Como podemos ver, en esa simple función hay una complejidad ciclomática de 4. Teniendo en cuenta ese valor, hay un a tabla que nos sirve para ver su complejidad.

  • 1 - 4: Poca Complejidad
  • 5 - 7: Complejidad moderada
  • 8 - 10: Complejidad alta
  • 11+: Complejidad muy alta

Lo que nos dice la tabla es la cantidad de lógica que esta realizando una rutina. Con respecto al ejemplo inicial, estamos clasificados dentro del rango de Poca Complejidad Genial! Teniendo eso en cuenta, si tenemos una función o método con una complejidad ciclomática mayor o igual a 11, es casi seguro que esa rutina esta haciendo demasiadas cosas y debemos buscar la forma de mejorarla.

Ahora, calcularle la CC (complejidad ciclomática) a una sola rutina, es bueno y es algo que podemos usar como guía mientras estamos escribiendo código, sin embargo, es mucho más interesante ver la CC promedio de todas las clases en nuestro proyecto. Para eso Calculamos la CC de cada método y lo dividimos por el número de métodos en las clases. Para eso también hay una tabla:

  • 1 - 2: Poca Complejidad
  • 3 - 4: Complejidad Moderada
  • 5 - 6: Complejidad Alta
  • 6+: Complejidad muy alta

Esa tabla se utiliza solamente para clases (o en otras palabras, solo nos es útil si estamos usando programación orientada a objetos). Los rangos cambian un poco, pero nos sirve para ver un proyecto desde una perspectiva más amplía y entender que tan complejo es.

Ahora, si vemos que el resultado es un número muy bajo, puede ser un indicativo de que nuestro código es muy abierto o no esta tomando muchas decisiones. Siendo así las cosas, generalmente en esta tabla, deberíamos apuntar a un resultado entre 1.6 y 2.10.

Adicionalmente, también se puede calcular la CC, por linea de código. Eso es más útil puesto que ahí estamos evaluando absolutamente todo! Incluyendo lo que no sea POO.

  • 0.01 - 0.05: Complejidad Baja
  • 0.06 - 0.10: Complejidad Moderada
  • 0.11 - 0.15: Complejidad Alta
  • 0.15+: Complejidad muy Alta

Con estos datos podemos ver aún mejor el estado de un proyecto. Por ejemplo si nuestro resultado nos arroja un 0.08, nos esta indicando que tenemos una complejidad moderada y que el 8% de nuestro proyecto son puntos en donde se están tomando decisiones.

En el caso de PHP, hay una herramienta buenísima que nos puede ayudar con este tipo de cálculos, llamada PHPLOC. Con ese programita, en cuestión de segundos, puedes empezar a evaluar todo un proyecto.

Ahora que sabemos como calcular la CCy tenemos una tablar que nos ayuda a evaluar la complejidad, la pregunta que nos queda es - Para que tomarse el trabajo de hacer todo eso?

Entre más complejidad tenga una rutina o un software, más se dificulta su manutención, la probabilidad de tener bugs será mucho más alta e incluso añadir nuevas funcionalidades se vuelve más complicado. Con código complejo, muy seguramente vamos a terminar con una deuda técnica alta.

Adicionalmente, la calidad y la complejidad están fuertemente relacionadas. Software con demasiada complejidad tiende a ser software de baja calidad. Entonces, nuestra motivación siempre debería ser, tratar de reducir la complejidad lo que más se pueda.

Podemos resumir todo diciendo, que la CC, es solamente un número que evalúa el sentido común, en cuanto a desarrollo de software. Si estas escribiendo una rutina y te das cuenta que su complejidad es muy alta en relación a funcionalidad, debes buscar formas de reducirla. Volvamos a nuestro ejemplo inicial - Con un Typehint y una ligera modificación podemos lograr el mismo resultado.

Mejor cierto? Terminamos con una CC de 1. Es cierto que antes clasificábamos dentro de una baja complejidad con un 4, pero 4 sigue siendo alto para la funcionalidad que queríamos lograr.

Para finalizar, aunque es cierto que debemos adoptar este tipo de métricas para mejorar nuestro código, lo más importante es tener software que funcione. Nos podemos pasar tardes debatiendo la teoría pero si el software no funciona, estamos generando código malo.

La gran ventaja de usar estas métricas radica en que al tenerlas, nos permite hacer preguntas y reflexiones sobre nuestro software.

En próximas entradas voy a discutir otras métricas como N-Path y CRAP, también pienso escribir sobre la deuda técnica... pero todo a su tiempo.

Encontraste algún error en esta entrada? Alguna duda? Házmela saber en los comentarios. Como siempre, gracias por leer.

Comentarios