Las métricas más comunes para medir la complejidad (o simplicidad, si considera que la simplicidad es lo opuesto a la complejidad) son la Complejidad Ciclomática de McCabe y las Métricas de Complejidad de Halstead .
La complejidad ciclomática mide el número de rutas distintas a través de una unidad dada, generalmente un método o función, aunque también se puede calcular en una clase. A medida que aumenta el número de rutas, se hace más difícil recordar el flujo de datos a través de un módulo dado, que está relacionado con el concepto de memoria de trabajo . La alta complejidad ciclomática tiende a indicar dificultad en la capacidad de probar un módulo; se requieren más casos de prueba para cubrir las diversas rutas a través del sistema. También se han realizado estudios que han relacionado la alta complejidad ciclomática con las altas tasas de defectos. Típicamente, una complejidad ciclomática de 10 indica que una unidad debe ser revisada y posiblemente refactorizada.
Las medidas de complejidad de Halstead utilizan las entradas de operadores y operandos totales y distintos para calcular el volumen, la dificultad y el esfuerzo de un fragmento de código. La dificultad, que es el (número de operadores únicos / 2) * (número total de operandos / número de operandos únicos), está ligada a la capacidad de leer y comprender el código para tareas tales como aprender el sistema o realizar una revisión del código. Nuevamente, puede contar esto en un nivel de sistema, un nivel de clase o un nivel de método / función. Hay algunas publicaciones sobre cómo calcular estas medidas aquí y aquí .
Simplemente contar líneas de código también puede darle una idea de la complejidad. Más líneas de código significa que hay más para leer y comprender en un módulo. Dudaría en usar esto como una medida independiente. En cambio, lo usaría con otras mediciones, como el número de defectos en un módulo dado para obtener la densidad de defectos. Una alta densidad de defectos podría indicar problemas al escribir pruebas y realizar revisiones de código, que pueden o no ser causadas por código complejo.
Fan-in y fan-out son otras dos métricas relacionadas con el flujo de datos. Como se define aquí , fan in es la suma de los procedimientos llamados, los parámetros leídos y las variables globales leídas y desplegadas es la suma de los procedimientos que llaman a un procedimiento dado, los parámetros escritos (expuestos a usuarios externos, pasados por referencia), y variables globales escritas en. Nuevamente, un alto nivel de entrada y salida puede ser indicativo de un módulo que puede ser difícil de entender.
En paradigmas específicos, puede haber otras medidas o métricas que también sean útiles. Por ejemplo, en el mundo orientado a objetos, la monitorización del acoplamiento (deseo bajo), la cohesión (deseo alto) y la profundidad de la herencia (deseo bajo) se pueden usar para evaluar qué tan simple o complicado es un sistema.
Por supuesto, es importante darse cuenta de que muchas medidas y métricas son simplemente indicadores. Debe usar su criterio para determinar si es necesario refactorizar para aumentar la simplicidad o si no vale la pena hacerlo. Puede realizar las mediciones, calcular las métricas y conocer su código, pero no desea diseñar su sistema por los números. En definitiva, haz lo que tenga sentido.