Refactorizar en .Net utilizando herramientas de análisis de código
Refactorizar es una técnica dentro del desarrollo de software y la Wikipedía lo define así:
La refactorización es una técnica de la ingeniería de software para reestructurar un código fuente, alterando su estructura interna sin cambiar su comportamiento externo.
Muy importante es el hecho de que para poder refactorizar es necesario tener unos tests que respalden los cambios que vas a realizar sino el resultado final sería bastante incierto y seguramente los problemas saldrían en producción.
Proceso evolutivo
La refactorización a mi me gusta realizarla como una actividad evolutiva, poco a poco y en el día a día. En ocasiones, si tiramos en exceso del hilo nos podemos meter en demasiados cambiós y podemos meternos en problemas. Mi experiencia me dice que puedes acabar en un pozo de cambios del que puede ser complicado salir.
Imagen ilustrativa de un mal refactoring :)
Herramientas de analisis de código
Para mí el ideal es ir refactorizando tú código de forma evolutiva, pero que sucede si nos enfrentamos a una situación donde necesitamos refactorizar y no se ha cumplido el ideal. Hay situaciones donde podemos no haber ido refactorizando el código como nos gustaría por diferentes motivos o simplemente es un código heredado.
En estas circunstancias aconsejo la utilización de herramientas de análisis de código que nos van a ayudar a detectar los puntos de refactorización más críticos consiguiendo establecer por donde empezar.
Existen diferentes herramientas externas que nos pueden ayudar pero creo que las que vienen en Visual Studio son un buen punto de partida.
Análisis de código en Visual Studio
En Visual Studio existen dos tipo de herramientas:
- Métricas de código
- Análisis de código
Vamos a ver en qué consiste cada uno.
Métricas de código
Las métricas de código muestra un informe con una serie de columnas:
- Índice de mantebilidad, el código con valores más bajos es más difícil de mantener.
- Complejidad ciclomática, mide la complejidad estructural del código. Valores más altos significan mayor complejidad.
- Profundidad de herencia, indica el número de definiciones de clase que se extienden a la raíz de la jerarquía de clases. Valores más altos indican mayor profundidad.
- Acoplamiento de clases: mide el acoplamiento a las clases únicas a través de parámetros, variables locales, tipos de valores devueltos, llamadas a métodos, instancias genéricas o de plantillas, clases base, implementaciones de interfaces, campos definidos en tipos externos y decoración de atributos
- Líneas de código: indica el número aproximado de líneas del código.
Los resultados vienen agrupados jerarquicamente y desde aquí se leen un poco mal porque tienes que estar moviendote por el arbol. Existe un opción para exportar a excel donde vamos a poder filtrar por member por ejemplo y se leer mucho mejor.
Análisis de código
Los resultados del análisis de código se integran como warnings en la ventana de lista de errores.
Se puede ejecutar manualmente desde el menú que hemos visto en la imagen de arriba o se puede incluir en el proceso de compilanción, para eso hay que activar la opción en las propiedades del proyecto.
En esta misma ventana podemos establecer la rigurosidad de las reglas a verificar.
Uno de los conjuntos de reglas más severas en el análisis es Microsoft Extended Design Guidelines Rules. Si aplicamos este conjunto de reglas nos van a salir warnings por ejemplo para try catch vacios.
Interpretando los resultados
Los resultados del análisis de código tienen poca interpretación que hacer. Son resultados muy concretos.
Respecto a los resultados de las métricas de código si son más interpretables, generalmente van a indicar incumplimiento de principios SOLID.
Una clase o método con muchas líneas de código puede ser indicativo de que tiene muchas responsabilidades y por lo tanto está inclumpliendo el principio de responsabilidad única.
Complejidad ciclomática elevada puede suponer de nuevo incumplimiento de principio de responsabilidad única y también de abierto cerrado, seguramente para extender lo que hace la clase sea necesario modificarla y eso supone un problema.
El indice de mantenibilidad yo lo interpreto como un resumén, si hay valores problemáticos en las demás columnas se vera reflejado en esta.
Conclusiones
Para la actividad de refactorizar en .Net puede resultar útil apoyarse en herramientas de análisis de código que trae Visual Studio. Estas herramientas deben ser un apoyo, luego hay que saber interpretarlas y aplicar sentido común.