jul 05

La Complejidad Ciclomática (Cyclomatic Complexity) es una métrica del software que proporciona una medición cuantitativa de la complejidad lógica de un programa. Es una de las métricas de software mas ampliamente aceptada, ya que ha sido concebida para ser independiente del lenguaje.

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 de crear pruebas automáticas del código y también es una medición orientativa de la fiabilidad del mismo.

El nombre “Complejidad Ciclomática” puede resultar engañoso para un programador ya que la idea de esta métrica no es contar los bucles (for, while, do…) en el código de un programa sinó en el resultado de contar el número de ciclos diferentes que se siguen en un fragmento de código de un programa habiendo creado una rama imaginaria desde el nodo de salida al nodo de entrada del diagrama de flujo correspondiente a este fragmento de código. Un nombre más adecuado podría ser Complejidad Condicional ya que el cálculo de esta métrica se ajusta más al hecho de buscar condiciones que contar ejecuciones de predicados dentro de bucles.

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.

La medida resultante puede ser utilizada en el desarrollo, mantenimiento y reingeniería para estimar el riesgo, costo y estabilidad. Algunos estudios experimentales indican la existencia de distintas relaciones entre la métrica de McCabe y el número de errores existentes en el código fuente, así como el tiempo requerido para encontrar y corregir esos errores.

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álculo de la Complejidad Ciclomática

Para poder dar una definición acabada de la complejidad ciclomática, es necesario primero introducir una sencilla notación para la representación del flujo de control, denominada Grafos 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 correspondientes a las diferentes subrutinas, funciones o métodos.

Definidos estos conceptos, la Complejidad Ciclomática puede calcularse de la siguiente manera:

M = EN + P

Una versión simplificada para el cálculo de la Complejidad Ciclomática es la siguiente:

M = Número de condiciones + 1

Ámbito de utilizacion de la Complejidad Ciclomática

La complejidad ciclomática puede ser aplicada en varias áreas incluyendo:

• Análisis de riesgo en desarrollo de código: Mientras el código esta en desarrollo, su complejidad puede ser medida para estimar el riesgo inherente.

• Análisis de riesgo de cambio durante la fase de mantenimiento: La complejidad del código tiende a incrementarse a medida que es mantenido durante el tiempo. Midiendo la complejidad antes y después de un cambio propuesto, puede ayudar a decidir cómo minimizar el riesgo del cambio.

Planificación de Pruebas: El análisis matemático ha demostrado que la complejidad ciclomática indica el número exacto de casos de prueba necesarios para probar cada punto de decisión en un programa.

Reingeniería: Provee conocimiento de la estructura del código operacional de un sistema. El riesgo involucrado en la reingeniería de una pieza de código está relacionado con su complejidad.

Aplicaciones para calcular la Complejidad Ciclomática

Algunas aplicaciones que implementan el cálculo de complejidad ciclomática son las siguientes:

  • Covertura : Muestra la Complejidad Ciclomática en Java para cada clase y la media de Complejidad Ciclomática para cada paquete y para todo el proyecto.
  • PEAR::CodeSniffer : Comprobador de código PHP para la verificación de varios estándares que incluye comprobación de Complejidad Ciclomática.
  • Perl::Metrics::Simple : Analizador de código fuente Perl que comprueba varias métricas, entre ellas, la Complejidad Ciclomática de cada subrutina/método.
  • complexity.py : Script en Python para comprobar la Complejidad Ciclomática en programas realizados en este lenguaje.

Consideraciones finales

En Softonic, empresa en la que trabajo, utilizamos esta y otras métricas para garantizar la calidad en nuestros desarrollos y puedo decir por experiencia personal que los resultados tienden a mejorar la claridad y estructura de código, reducir los tests necesarios para comprobar el código y minimizar el riesgo de errores.

Para una mayor profundización teórica en estos conceptos, recomiendo la lectura de los siguientes documentos:

A Complexity Measure – McCabe’s original paper (1976).
Complejidad ciclomática – Tésis sobre la complejidad ciclomática.

Valorar esta entrada:

1 Estrella2 Estrellas3 Estrellas4 Estrellas5 Estrellas (5 votos, media: 5 sobre 5)
Loading ... Loading ...

Entradas relacionadas:

9 respuesta a “Complejidad Ciclomática”

  1. pinar en Complejidad Ciclomática
    pinar dice:

    Muy currado el artículo. De verdad.

    Sería estupendo usarlo como para crear el artículo de la wikipedia.

    ¿Te importa?

  2. Javier Callón en Complejidad Ciclomática

    ¡Claro! No tengo ningún problema en que se utilicen los contenidos de este blog y de hecho me parece genial, siempre que se cite la fuente con el correspondiente enlace ;)

  3. pinar en Complejidad Ciclomática
    pinar dice:

    http://es.wikipedia.org/wiki/Complejidad_ciclom%C3%A1tia

    Ahí tienes el enlace, como verás y hecho un C&P bastante abusibo de tu blog. Eso es en parte a que el estilo en que has escrito es muy enciclopédio e ideal para transcribir a la wikipedia.

    He enlazada tu blog. pero la Wikipedia es un Wiki y cualquiera puede cambiarlo. Lo digo porque hay wikipedistas a los que no les gustan los enlaces a Blogs.

    También está enlazada la tesis, supongo que nadie tendrá problemas con ello, por lo que supongo que no será cambiado en un futuro.

    Gracias a este post he descubierto tu blog y viendo los artículos de portado me he llevado una buena impresión. Probablemente me veas más por aquí. :-)

  4. Maria en Complejidad Ciclomática
    Maria dice:

    Hola Javier

    Coincido con Pinar en que la exposición que haces sobre este tema es buenísima y me ha ayudado mucho. Estoy en un proyecto un tanto particular y me han pedido que estime cuanto me supondría hacer una ingeniería inversa de varias aplicaciones. Hay algunas en tecnología J2EE, otras en cobol y otras usan ambas. A partir del código tendría que estimar cuánto me supone crear un documento funcional, el diseño técnico, … ¿sabes si hay métricas para hacer esto? ¿y herramientas?

    Muchas gracias por adelantado

  5. Carlos Gomez en Complejidad Ciclomática
    Carlos Gomez dice:

    Muy interesante y muy clara la explicaciòn, no hay duda de que queda muy claro para quien pretenda realizarla; de hecho, ya lo aplique.

    Muchas gracias

  6. David en Complejidad Ciclomática
    David dice:

    Un apunte.

    cuando dices que una versión simplificada de calcular la CC es

    M = Número de condiciones + 1

    lo has simplificado demasiado ya que esta fórmula solo se aplica cuando los predicados son simples

    Por ejemplo
    if a=b then
    sentencia1
    else
    sentencia2
    end if

    Pero si la condición es múltiple hay que sumar 1 por cada and y/o que aparezca.

    Por ejemplo
    if a = b or a = c then
    sentencia1
    else
    sentencia2
    end if

    da una CC de 3

    Algo similar pasa con los Switch

    El resto de artículo estupendo.

    Por cierto el enlace
    http://javier.callon.org/www.itba.edu.ar/capis/rtis/articulosdeloscuadernosetapaprevia/RIZZI-COMPLEJIDAD.pdf
    no funciona

    ¿Por casualidad no sabrás donde puedo localizarlo?

    Resulta que lo tengo en PDF porque me lo bajé hace tiempo pero me gustaría saber donde localizarlo para incluir la referencia en mi PFC.

    Un saludo.

  7. Elias en Complejidad Ciclomática
    Elias dice:

    Hola, tengo una pregunta con respecto a este apartado, que sucede cuando calculas la complejidad ciclomatica y el numero de casos de pruebas es menor, ciertamente se puede considerar que hemos cubierto todos los casos de prueba pero entonces no esta dando el numero exacto. Saludos

  8. Alejandro en Complejidad Ciclomática
    Alejandro dice:

    Javier:
    Increible, me parece muy bueno tu analisis de la complejidad ciclomatica, pero no hay que dejar de lado el resto de las metricas que existen en el analisis de un segmento de programacion. o en lo que se quiera programar.

  9. Tweets that mention Complejidad Ciclomática | Callon blog — Topsy.com en Complejidad Ciclomática

    [...] This post was mentioned on Twitter by David Morales. David Morales said: RT @hmCuesta: Buen post de Complejidad Ciclomatica http://javier.callon.org/complejidad-ciclomatica las Metricas de Software son muy int … [...]

Dejar una respuesta