2009-05-26 17 views
64

Un término que veo de vez en cuando es "Complejidad ciclomática". Aquí en SO, vi algunas preguntas sobre "cómo calcular el CC de Language X" o "Cómo hago Y con la cantidad mínima de CC", pero no estoy seguro de entender realmente de qué se trata.¿Qué es la Complejidad ciclomática?

Por NDepend Website, vi una explicación que básicamente dice "El número de decisiones en un método. Cada si, por, & & etc. añade 1 al CC 'puntuación'). ¿Es realmente él? Si sí, ¿por qué es malo? Puedo ver que uno querría mantener el número de declaraciones if bastante bajo para mantener el código fácil de entender, pero ¿realmente es todo esto?

¿O hay algún concepto más profundo?

Respuesta

48

No conozco un concepto más profundo. Creo que generalmente se considera en el contexto de un índice de mantenimiento. Cuantas más ramas hay dentro de un método en particular, más difícil es mantener un modelo mental del funcionamiento de ese método (generalmente).

Los métodos con mayor complejidad ciclomática también son más difíciles de obtener la cobertura de código completo en pruebas unitarias. (¡Gracias Mark W!)

Eso trae todos los otros aspectos de mantenibilidad, por supuesto. Probabilidad de errores/regresiones/etc. Sin embargo, el concepto central es bastante directo.

+8

Además, es más difícil de probar la unidad y obtener la cobertura de código completa. –

+1

Correcto porque dicen que solo puedes guardar un puñado de cosas en tu mente consciente en cualquier momento dado. – steamer25

+4

La complejidad ciclomática de un método también denota el número de casos de prueba unitaria requeridos para lograr la cobertura del código del 100% para ese método. –

6

Sí, eso es realmente. Cuantas más rutas de ejecución pueda tomar su código, más cosas se deben probar y mayor es la probabilidad de error.

2

De eso se trata, la idea es que un método que tiene un CC bajo tiene menos horquillas, bucles, etc., lo que hace que el método sea más complejo. Imagine revisar 500,000 líneas de código, con un analizador y ver un par de métodos que tienen una mayor cantidad de CC. Esto le permite enfocarse en refactorizar esos métodos para una mejor comprensión (también es común que un CC alto tenga una alta tasa de errores)

30

La complejidad ciclomática mide el número de veces que debe ejecutar un bloque de código con parámetros variables para ejecuta cada camino a través de ese bloque. Un conteo más alto es malo porque aumenta las posibilidades de que los errores lógicos escapen de su estrategia de prueba.

+0

Respuesta muy precisa. ¡Prestigio! – RBT

1

Cada punto de decisión en una rutina (bucle, interruptor, si, etc.) esencialmente se reduce a una declaración if equivalente. Para cada if tiene 2 rutas de códigos que se pueden tomar. Entonces, con la primera rama hay 2 rutas de código, con la segunda hay 4 rutas posibles, con la 3a hay 8 y así sucesivamente. Hay al menos 2 rutas de código N ** donde N es el número de ramas.

Esto dificulta comprender el comportamiento del código y probarlo cuando N crece más allá de un número pequeño.

1

Considere el control flow graph de su función, con una ventaja adicional desde la salida a la entrada. La complejidad ciclomática es la cantidad máxima de cortes que podemos realizar sin separar el gráfico en dos partes.

Por ejemplo:

function F: 
    if condition1: 
     ... 
    else: 
     ... 
    if condition2: 
     ... 
    else: 
     ... 

Control Flow Graph

Control Flow Graph

es probable que pueda ver de forma intuitiva por qué la gráfica vinculada tiene una complejidad de ciclomática 3.

+0

¿Puedes explicar cómo y dónde haces los cortes en el diagrama de arriba? –

1

complejidad Cyclomatric es básicamente una métrica para descubrir áreas de código que necesitan más atenuación para la mantenibilidad. Sería básicamente una entrada a la refactorización. Definitivamente da una indicación del código de área de mejora en términos de evitar bucle anidado profundo, condiciones, etc.

11

Wikipedia puede ser tu amigo en éste: Definition of cyclomatic complexity

Básicamente, hay que imaginar su programa como un gráfico y luego

La complejidad es (...) define como:

M = E − N + 2P 

donde

  • M = complejidad ciclomática,
  • E = el número de bordes de la gráfica
  • N = el número de nodos del grafo
  • P = el número de componentes conectados

CC es un concepto que intenta capturar qué tan complejo es su programa y qué tan difícil es probarlo en un solo número entero.

2

Cyclomatic La complejidad es solo una palabra de moda que da miedo. De hecho, es una medida de la complejidad del código utilizada en el desarrollo de software para señalar partes más complejas del código (es más probable que tenga fallas y, por lo tanto, debe probarse con mucho cuidado y exhaustividad). Puede calcularlo usando la fórmula E-N + 2P, pero le sugiero que lo calcule automáticamente con un complemento. He oído hablar de una regla empírica que debe esforzarse por mantener el CC por debajo de 5 para mantener una buena legibilidad y facilidad de mantenimiento de su código.

Recientemente he experimentado con el Eclipse Metrics Plugin en mis proyectos Java, y tiene un archivo de Ayuda realmente agradable y conciso que se integrará con su ayuda Eclipse y puede leer más definiciones de varias medidas de complejidad y consejos y trucos para mejorar tu código.

3

Otro punto interesante que he escuchado:

Los lugares en su código con los mayores guiones deben tener la más alta CC. En general, estas son las áreas más importantes para garantizar la cobertura de las pruebas porque se espera que sean más difíciles de leer/mantener. Como se señala en otras respuestas, estas son también las regiones de código más difíciles para garantizar la cobertura.

1

Eso es todo. Sin embargo, cada rama de una instrucción "caso" o "cambio" tiende a contar como 1. En efecto, esto significa que CC odia las declaraciones de casos y cualquier código que los requiera (procesadores de comando, máquinas de estado, etc.).

+0

Una declaración de caso puede ser el signo de un gráfico de objetos gritando a ser puesto en libertad .... –

+0

@TetsujinnoOni - * May * sí. El problema es que mi procesador de comandos típico está leyendo comandos de una fuente externa, por lo que no puedo dejar que el compilador coloque los elementos de datos donde lo desee, como debe hacerlo para una clase polimórfica dinámica. –

1

Las respuestas proporcionadas hasta ahora no mencionan la correlación de la calidad del software a la complejidad ciclomática. Las investigaciones han demostrado que tener una métrica de complejidad ciclomática más baja debería ayudar a desarrollar software que sea de mayor calidad. Puede ayudar con los atributos de calidad del software de legibilidad, mantenibilidad y portabilidad. En general, se debe tratar de obtener una métrica de complejidad ciclomática de entre 5 y 10.

Una de las razones para utilizar las métricas como la complejidad ciclomática es que, en general, un ser humano sólo puede realizar un seguimiento de cerca de 7 (más o menos 2) piezas de información simultáneamente en el cerebro. Por lo tanto, si su software es demasiado complejo con varias rutas de decisión, es poco probable que pueda visualizar cómo se comportará su software (es decir, tendrá una métrica de complejidad ciclomática alta). Esto probablemente conduzca al desarrollo de software erróneo o montado en errores. Se puede encontrar más información sobre esto en here y también en Wikipedia.

9
Cyclocmatic complexity = Number of decision points + 1 

Los puntos de decisión que pueden ser sus sentencias condicionales como if, if ... else, switch de bucle, el bucle while, etc.

La siguiente tabla describe el tipo de la aplicación.

  • complejidad ciclomática radica 1 - 10  Para ser considerado normal applicatinon

  • complejidad ciclomática mentiras 11 - 20  aplicación Moderado

  • complejidad ciclomática mentiras 21 - 50  aplicación Risky

  • ciclomática Complejidad encuentra a más de 50  aplicación inestable

+3

* "Complejidad ciclocmática = Número de puntos de decisión + 1" * Para todos los casos que he intentado, parece ser cierto. Tengo una sola pregunta: ¿por qué nos molestamos con los gráficos de flujo y las fórmulas, cuando 'decision_points + 1' es todo lo que necesitamos? (En cualquier caso, ¡gracias por este método extremadamente fácil!) – Luc

2

ciclomática complejidad se calcula utilizando el gráfico de flujo de control. El Número de medida cuantitativa de caminos linealmente independientes a través del código fuente de un programa se llama como Ciclomática Complejidad (si/si otra cosa/de/tiempo)

Cuestiones relacionadas