Saltar al contenido

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript... y lo que venga ;)

18 años online

el blog de José M. Aguilar

Inicio El autor Contactar

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web
ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript...

¡Microsoft MVP!
martes, 23 de marzo de 2021

Como probablemente ya sabréis, NDepend es una de esas herramientas que están ahí de siempre, ayudando a desarrolladores y arquitectos a mejorar la calidad de nuestro software gracias a sus potentes y flexibles herramientas de análisis de proyectos.

Hace tiempo ya echamos por aquí un vistazo, pero creo que es interesante darle otra vuelta y refrescar conocimientos.

Qué es NDepend y en qué puede ayudarnos

NDepend de un analizador estático capaz de inspeccionar al detalle nuestros proyectos y ofrecernos métricas de calidad e información desde distintas perspectivas,tanto en tiempo de diseño como desde el interior de pipelines o procesos de build automatizados. Podemos usarlo desde línea de comandos, mediante un ejecutable standalone, o bien integrado en herramientas, como Visual Studio, Azure DevOps, TFS, TeamCity, AppVeyoor o SonarQube y otras.

Como otras soluciones, NDepend es capaz de analizar nuestro código y proponernos modificaciones sintácticas o consejos para alinearnos con buenas prácticas y convenciones habituales. Sin embargo, a diferencia de la competencia, NDepend permite obtener información bastante clarificadora sobre cómo evoluciona nuestra base de código y utilidades para mantener su calidad a raya durante el proceso de desarrollo, pues ofrece:

  • Información sobre la calidad del código que estamos introduciendo, relativo al nivel de calidad deseado o a un punto de partida establecido.

  • Estimación de deuda técnica o, en otras palabras, qué tiempo debemos dedicar al proyecto más adelante para solucionar problemas que estamos introduciendo en la actualidad. Aunque obviamente es una estimación, nos da una idea de la carga que suponen las prisas y el "dejar cosas para más adelante", y, sobre todo, nos permite ver su evolución en el tiempo e incidencia acumulada.

  • Configuración de criterios de calidad que deben cumplirse necesariamente durante la fase de desarrollo. Mediante expresiones LINQ, podemos realizar consultas a nuestro código y extraer conclusiones de forma realmente sencilla.

Pero donde NDepend destaca especialmente es en su conjunto de herramientas de visualización, que ofrecen perspectivas sobre nuestros proyectos que difícilmente podríamos lograr usando otras soluciones.

Al abrir un proyecto, ya sea seleccionando un archivo de solución (*.sln), proyecto (*.csproj), o incluso ensamblados independientes, tendremos acceso a un completo informe con las conclusiones más importantes obtenidas de su análisis. Para que os hagáis una idea de la información que podremos ver, en la web del producto tienen varios ejemplos de análisis de proyectos reales a los que vale la pena echar un vistazo, como:

Fijaos que en ambos casos se trata de comparaciones: NDepend no sólo realiza el análisis estático de la base de código actual, sino que puede compararla con versiones anteriores, o puntos de partida, para poder estudiar la evolución de distintos aspectos: tamaño, complejidad, problemas en el código, deuda técnica, porcentaje de cobertura de pruebas, etc.

La evolución, tanto de métricas predefinidas como de métricas personalizadas, puede analizarse de forma visual mediante las gráficas de tendencias. En ellas es posible observar cómo evolucionan los valores deseados a lo largo del tiempo y las distintas versiones del proyecto:

Gráfico de tendencias en NDepend

Por otra parte, el diagrama de dependencias es una de las grandes novedades de la última versión del producto, pues ha sido reimplementado desde cero para ofrecer mucha más potencia que en versiones anteriores. Este diagrama muestra la estructura de de un proyecto y las dependencias entre los principales bloques:

Diagrama de dependencias en NDepend

Este diagrama es interactivo, de forma que podemos ir profundizando sucesivamente hasta el máximo nivel de detalle y obteniendo interesantes métricas de cada bloque de código.

Otra forma de analizar las relaciones entre los bloques estructurales de un proyecto es a través de su matriz de dependencias. En esta matriz, las filas y columnas identifican los distintos componentes, mientras que en cada posición de la matriz veremos el grado de acoplamiento entre ambos. Este enfoque de análisis de dependencias puede ayudar a identificar valores anómalos en acoplamiento, cohesión, componentes con demasiadas responsabilidades, dependencias cíclicas, etc.

Matriz de dependencias en NDepend

Asimismo, es posible analizar el valor de distintas métricas sobre la superficie y estructura de la aplicación gracias al visualizador de métricas de código. Esta herramienta muestra un "mapa" de nuestro proyecto, sobre el que veremos los valores que nos interesen utilizando un código de colores para distinguir visualmente sus rangos de valores.

Análisis visual de la complejidad ciclomática

El nivel de granularidad es totalmente configurable (método, clase, namespace...), así como las métrica que decidirán la dimensión de los bloques y su color. Por ejemplo, en la gráfica anterior, cada cuadro representa un método, su tamaño viene definido por el número de líneas de IL que contiene, y el color por su complejidad ciclomática. De esta forma, podremos tener una idea muy rápida de dónde se encuentran los "puntos calientes", o las partes de nuestra aplicación más complicadas.

También es impresionante la capacidad de combinar los informes, gráficas, definición de reglas y otras funcionalidades con la posibilidad de utilizar queries sobre nuestra base de código usando LINQ. Por ejemplo, una consulta como la siguiente podría ser útil para filtrar los métodos con complejidad elevada en un informe:

from m in JustMyCode.Methods
where m.CyclomaticComplexity > 20
select new { m, m.CyclomaticComplexity, m.NbLinesOfCode }

O bien, para definir reglas de calidad de código personalizadas. En el siguiente código se configura una regla que lanzará un warning cuando tenemos más de un método con una complejidad elevada:

warnif count > 0 
from m in JustMyCode.Methods
where m.CyclomaticComplexity > 20
select new { m, m.CyclomaticComplexity, m.NbLinesOfCode }

En conjunto, todas estas herramientas pueden ser de gran utilidad en distintos escenarios, como en:

  • Mejorar la arquitectura de un proyecto
  • Mejorar la calidad de código
  • Comprender una base de código heredado
  • Auditar código externo
  • Analizar el impacto de refactorizaciones antes de acometerlas
  • Detectar dónde se concentra la complejidad de una base de código
  • Detectar breaking changes que afectarán a APIs
  • Detectar y eliminar código muerto
  • ... y muchos otros

NDepend es software comercial y tiene coste por licencia, pero podéis descargar una versión de prueba de 14 días para comprobar si os puede resultar útil. Os recomiendo que le deis una oportunidad y lo probéis con algunos de vuestros proyectos, porque seguro que váis a aprender bastante sobre ellos ;)

Publicado en Variable not found.

2 Comentarios:

Juan dijo...

Da miedito probarlo.

No sé si voy a poder distinguir toda la gama cromática del rojo...

:-D

José María Aguilar dijo...

Jajaja, es cierto!

Pero bueno, como es muy configurable, siempre se podrían ajustar los umbrales para que la cosa no parezca tan sangrienta :D

Saludos!