Dibujar un grafo de flujo es la transcripción lógica del código a una estructura topológica. Para que el grafo sea útil, debe seguir una sintaxis rigurosa que permita aplicar las fórmulas de McCabe con éxito.
Cada estructura de control tiene una "huella dactilar" única en el grafo de flujo. Entender estas formas básicas es esencial para descomponer códigos complejos rápidamente.
Añade 1 punto de decisión. Crea un "salto" opcional.
Bifurcación binaria. Dos caminos excluyentes.
Bucle de pre-condición. Puede ejecutarse 0 veces.
Post-condición. Se ejecuta al menos 1 vez.
El compilador aplica cortocircuito: Si 'A' es Falso, salta directamente al final sin evaluar 'B'. Esto obliga a dibujar dos nodos de decisión separados.
Si 'A' es Verdadero, salta directamente al Body sin evaluar 'B'. De nuevo, son dos nodos de decisión separados. Un OR suma +2 a la complejidad total, no +1.
La Complejidad Ciclomática de McCabe ($V(G)$) no es arbitraria; se fundamenta en la teoría de grafos y la topología. Su objetivo es calcular la dimensión del espacio de caminos linealmente independientes. Entender el "porqué" de cada fórmula permite validar los resultados y elegir el método más eficiente según el contexto (análisis de código, diseño visual o auditoría métrica).
¿Cómo se calcula? Se cuentan las regiones (áreas cerradas) delimitadas por las aristas y los nodos del grafo, sumando siempre 1 (que corresponde a la región infinita exterior al grafo).
¿Por qué funciona? Esta fórmula deriva del teorema de la curva de Jordan. En un plano, cada camino independiente que se cierra sobre sí mismo (un ciclo) crea una nueva partición o "agujero" en el espacio. El número de regiones es una medida directa de cuántos ciclos fundamentales existen en el grafo. Es el método más intuitivo cuando ya tenemos el grafo dibujado.
¿Cómo se calcula? Se realiza un conteo exhaustivo de:
• E (Edges): Número de aristas (flechas).
• N (Nodes): Número de nodos (círculos).
Se resta el número de nodos al de aristas y se le suma una constante de 2.
¿Por qué funciona? Se basa en la Característica de Euler para grafos planos conectados ($V - E + F = 2$). En ingeniería de software, adaptamos esta relación para determinar el número de caminos base. El "+2" asume que el grafo tiene un único componente (una sola función). Si tuviéramos un sistema con $p$ funciones inconexas, la fórmula sería $E - N + 2p$. Es el método más riguroso para auditorías automáticas.
¿Cómo se calcula? Identificamos los P (Nodos Predicado), que son aquellos nodos de los cuales sale más de una arista (puntos de decisión como if, while, for). Sumamos 1 al total.
¿Por qué funciona? Esta es la interpretación más cercana a la programación. Cada decisión lógica en el código "rompe" la linealidad y añade exactamente un nuevo camino posible. El "+1" representa el camino principal (la ruta secuencial por defecto que existiría si no hubiera ninguna decisión). Es el método ideal para calcular la complejidad directamente desde el código fuente sin necesidad de dibujar el grafo.
El objetivo es diseñar un conjunto de pruebas tal que cada camino linealmente independiente en el grafo sea recorrido al menos una vez.
1: if (edad < 18) {
2: return "Menor";
3: }
4: if (tieneSeguro) {
5: return "Aprobado";
6: } else {
7: return "Pendiente";
8: }
A continuación, transcribimos el código a su topología de grafo de flujo, señalando directamente sobre él los elementos empíricos que componen las fórmulas de McCabe. Observa cómo los nodos de predicado (decisiones, marcados con P) dividen el flujo y generan regiones cerradas (R).
| Método de Cálculo | Verificación Matemática Visual | Resultado V(G) |
|---|---|---|
| Por Predicados | P1 (Línea 1) y P2 (Línea 4). $V(G) = P + 1 = 2 + 1$ |
3 |
| Por Elementos | Aristas marcadas E1...E7 (E=7). Nodos (1,2,4,5,7,Fin) (N=6). $V(G) = E - N + 2 = 7 - 6 + 2$ |
3 |
| Por Regiones | Regiones R1, R2 (interiores) y R3 (exterior). $V(G) = R$ |
3 |
Tras verificar matemáticamente que la complejidad es 3, extraemos exactamente los tres caminos bases recorriendo las aristas desde el nodo 1 hasta el nodo Fin, y determinamos qué datos obligan al código a seguir esa ruta:
Camino 1 (C1): Nodos 1 -> 2 -> Fin.
Datos de prueba: edad = 15 (Activa la arista E1 por primera vez).
Camino 2 (C2): Nodos 1 -> 4 -> 5 -> Fin.
Datos de prueba: edad = 20, tieneSeguro = true (Activa aristas E2 y E4 por primera vez).
Camino 3 (C3): Nodos 1 -> 4 -> 7 -> Fin.
Datos de prueba: edad = 20, tieneSeguro = false (Activa la arista E5 por primera vez).
El error más crítico en el cálculo, como acabamos de ver en los diagramas SVG de AND/OR, es ignorar el cortocircuito lógico. Si tienes un if (A || B), para la Fórmula 3 debes contar 2 puntos de decisión (P=2), no uno. La métrica de McCabe busca medir el esfuerzo de testeo, y una condición compuesta genera flujos de control ocultos que obligatoriamente deben probarse por separado.