Complejidad Ciclomática: la calidad está en las raices

19 Oct

Para poder afirmar que un producto o software es de calidad, deberemos contemplarlo desde muchas perspectivas. No basta solo decir que haga lo que deba hacer, que no se cuelgue y que no corrompa los datos. Tampoco basta considerar la elegancia de la interfaz, la velocidad de sus operaciones, etc. etc..

Calidad implica considerar muchas variables, y entre ellas, una no menor y muchas veces descuidada por no ser visible para el usuario; una variable que es la raiz que sustenta todo un producto sofware: el código.

En los años 60/70, esta pregunta genero diferentes ramas de investigacion. La suposicion inicial fue que deberiamos poder medir de alguna manera el codigo y asi producir un valor numerico, con el cual podamos hacer comparaciones y determinar el porque de valores grandes o pequeños. Esta investigacion resulto en una nueva rama de la ingeniera del software destinada a estudiar las llamadas metricas de software.

La primera y mas comun medida utilizada para analizar codigos de diferentes productos fueron las LOC (lines of code). Éstas son un reflejo del tamaño del producto. El objetivo inicial fue suponer que a mayor cantidad de lineas de codigo, el software era mas complejo. Esta metrica fue rapidamente debatida puesto que tiene muchas desventajas:

1. Los comentarios, saltos de lineas, codigo tabulado, etc. contabilizan en la sumatoria de lineas de codigo. Conclusion: un codigo muy documento puede tener muchas lineas pero no necesariamente indica que sea complejo.

2. Segun el lenguaje de programacion, hacer lo mismo puede tener una determinada longitud en un lenguaje que en otro. Conclusion: un codigo desarrollado en un lenguaje puede suponerse complejo cuando en realidad no lo es.

3. Existen lineas de codigo que son mas faciles que otra. No es lo mismo incrementar un valor que hacer un loop. Conclusion: Si nuestro codigo tiene miles de linea de incremento de valor puede pensarse mas complejo que otro producto que tiene una sola linea de loop.

A partir de los puntos anteriores, vemos entonces que la real calidad del codigo esta vinculada con la capacidad de los programadores de entender dicho codigo. Escribir codigo complejo probablemente conduza a codigo de menor calidad. Si entendemos el codigo podremos entonces mas facil determinar si funciona o si tiene bugs.

En 1976,  Thomas J. McCabe dio con una metrica a la que llamo Complejidad Ciclomatica (CC). Esta describe la complejidad del flujo de control de un programa. Es una representacion numerica de un flowchart: cuanto mas cajas de decision haya, mas complejo será el control del programa. Actualmente, la metrica CC es un muy buen indicador de la calidad de un programa.

McCabe no solo muestra que los programas con bajas CC son mas confiables, sino que tambien muestra como calcular el CC total combinando las CC de rutinas o metodos individuales. De esta forma , uno puede mejora la calidad total de un producto mejorando las CC de las rutinas o metodos.

Procedimiento de calculo de CC para un metodo:

   1. Siempre comenzar con 1: Si fuera llamado, el metodo al menos un camino tiene.
   2. Agregue 1 por cada sentencia condicional o de loop (agregar 1 por un if, while, foreach, operador ternario, etc.)
   3. Agregue 1 por cada AND o OR usado en una condicion.
   4. Agregue 1 por cada bloque case en un select o switch. Si el switch no tiene un case default explicito, agregue 1.
   5. Agregue 1 for cada sentencia catch para una excepcion lanzada.

Despues de este calculo, obtendremos un valor que al menos es 1 (el metodo seria solo una secuencia de sentencias).
Si el resultado está entre 2 y 5 podriamos afirmar que no reviste complejidad de consideración. Entre 6 y 10 tenemos un poco de complejidad para entender que hace internamente. Un valor de CC de mayor de 10 implica que definitivamente el metodo es complejo y deberemos refactorizarlo.

Es valor de CC es una medida del numero de caminos a traves del metodo e indica el minimo numero de tests que necesitamos hacer para poder evaluar y cubrir todos los caminos del metodo. Un metodo de complejidad 10, requiere 10 tests para asegurar que todos los caminos son chequeados. Cuanto mayor cantidad de pruebas de cobertura podamos hacer, mayor sera la calidad del codigo.

Generalizando el calculo…
El numero de cajas de decision es quien define la complejidad del codigo. A mayor cantidad de puntos de decision, mas bugs pueden ser introducidos. El calculo de la CC puede hacerse a partir del flowchart de un metodo o rutina. Contamos el numero de bordes (flechas), numero de nodos (cajas y rombos), restamos este ultimo del primero y agregamos 2 (uno por la flecha para ingresar al flowchart y otro para salir). Nos queda:

CC = E – N + 2.

En el ejemplo, el numero de flechas es 13, el numero de cajas es 11 por lo que la CC es 4. Un punto interesante a notar es que aunque dividamos una caja en dos conectadas por flecha o unamos dos cajas en una, el valor de la CC no cambia. Otra manera de calcular CC es contar la cantidad de rombos y agregar 1.

CC de un Subsistema

Supongamos que uno tiene una rutina (A) que llama a otra rutina (B), cual seria la CC del subistema completo?. La rutina A necesita una flecha extra para ir a B (la llamada) y una rutina extra para volver (el retorno). El calculo seria el siguiente:
SumCC
 = (EA + EB + 2) – (NA + NB) + 2
 = (EA – NA + 2) + (EB – NB + 2)
 = CCA + CCB
Esto es, la CC de un subsistema es la suma de las CC de sus partes.

Mi conclusión respecto a este punto es que ya el developer cuenta con una herramienta para revisar la calidad del código que produce. Casi todos los IDE incluyen directamente o como plugins/add-ons , tools que permiten el calculo automatico de la CC. Una vez que sabemos ésto, no hay excusas para no probarlo y aplicarlo.

Saludos, Gastón

Fuente: http://www.boyet.com/Articles/PCPlusCyclComplex.html

 

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: