Analizar una aplicación para identificar posibles problemas y soluciones siempre será una tarea interesante, ya que siempre vamos a encontrar algo que se puede mejorar sea cual sea el tamaño de la aplicación, y es aquí en donde inicia ese camino de identificar posibles problemas e igualmente plasmar soluciones, una primera opción y que en algunos casos puede funcionar es el análisis manual, si, vamos a ir a cada archivo de la solución y revisamos cada clase, método, etc que veamos, y claro, encontraremos puntos de mejora, sin embargo ya sabemos que no es una tarea sencilla, además que va a tomar tiempo y será bastante sensible a errores.


Para solucionar lo anterior, y como ya todo (o bueno, casi todo) se ha inventado, podemos acudir a herramientas que nos ayuden a revisar la aplicación, y podemos iniciar por las mismas herramientas de Visual Studio, las cuales nos proveen información bastante útil como código duplicado, complejidad, herencia entre otras, y realmente son datos bastante interesantes, pero cuando dicha información no es suficiente o simplemente buscamos obtener una mayor información es donde NDepend entra en juego (hace ya un tiempo había escrito algo al respecto Comenzando con NDepend

Actualmente NDepend se encuentra en la versión 2017.1, la cual trae varias mejoras desde el modelo de licenciamiento, el modelo de nuevos release (punto que me parece un plus bastante bueno), ya tiene soporte para .Net Core, integración con TFS/Team City/SonarQube/FinalBuilder, etc, puedes consultar el resto de features en NDepend 2017.1

Para ver que ofrece NDepend, voy a tomar un proyecto de hace un tiempo (un muy buen tiempo) y ver que tan bien o que tan mal está.

NDepende puede utilizarse como un complemento de Visual Studio o como una aplicación externa, y en ambos casos brinda la misma información.


Dashboard

En mi opinión el punto de partida, desde este panel es posible visualizar claramente un estado general del proyecto, y bien sea alegrarse o precouparse por el estado del mismo, en general este panel brinda:

  • Líneas de código
  • Tipos
  • Comentarios
  • Reglas violadas
  • etc

El siguiente es el dashboard del proyecto que estamos analizando:

NDepend Dashboard

Luego de tener el dashboard, una de las secciones que me gusta revisar inicialmente es la de Rules, inicialmente visualizamos cuantas reglas han sido violadas, incluso cuales de ellas son criticas, en el ejemplo tenemos:

  • 4 Críticas
  • 38 Violadas

Para navegar a ellas, simplemente clic sobre el numerito y se nos muestra la información ya detallada, para este caso:

NDepend Rules

Para ver el detalle de cada regla, simplemente debemos dar doble-clic y podremos ver la información de violación de la regla, junto con la regla que se aplica, así por ejemplo, si se quiere verificar la primera regla de la lista relacionada con métodos con demasiados parámetros, NDepend nos muestra primero la regla que por defecto tiene (métodos con 7 o más parámetros) junto con los 2 métodos que la incumplen:

NDepend Rules Detail

En la tabla anterior podemos ver (ten en cuenta que las columnas que se muestran dependen de la regla seleccionada):

  • Método que viola la regla
  • Número de parámetros
  • Debt hace referencia al tiempo estimado para solucionar el problema
  • Annual Interest hace referencia al tiempo estimado "perdido" si el problema no es arreglado.


Luego de revisar las reglas que se están violando, otro de los paneles que en mi opinión es bueno seguir revisando es el de Method Complexity, el cual nos da información acerca de la complejidad de los métodos, ya que entre más complejo un método, más problemas nos va a traer cuando sea necesario modificarlo ya sea para corregir algún bug o para cambiar su comportamiento, al igual que con el panel de reglas, NDepend brinda información sobre la complejidad ciclomática de cada método, y la idea es que ese valor sea bastante bajo:

Method Complexity

Otra forma de navegar a los issues encontrados agrupados por categorías en utilizando la opción del menú NDepend -> Rules, allí podemos encontrar categorías como Code Smells, OO Design, Architecture, entre otros:

NDepend Rules Navigation

Por ejemplo, si vamos a Rules/Object Oriented Design/Avoid Interfaces too big, obtenemos información de las interfaces que ya tienen cara de ser bastantes grandes, es decir tener Fat Interfaces, para el ejemplo afortunadamente solo dos de todas las interfaces que tenemos presentan problemas:

NDepend Fat Interfaces

Definitivamente creo que NDepend debe ser una de esas herramientas que no pueden faltar en nuestro proyecto, ya que realmente nos ayuda a identificar problemas de una forma bastante agil y por lo tanto tener un mejor código.

Puedes descargar un trial de NDepend en el siguiente link: Download NDepend

Saludos :)