NDepend : Analysez en profondeur votre code

Installation et lancement de l’analyse NDepend

NDepend est un outil de qualimétrie, au même titre que Sonar ou encore les outils de mesure embarqués directement dans Visual Studio : il permet d’analyser le code et d’en extraire une multitude d’informations quant à sa qualité, sa maintenabilité, sa testabilité et sa performance.

Voici pour commencer une courte vidéo de présentation montrant comment installer NDepend et lancer une première analyse sur une solution .NET.

Dans cet article, nous allons analyser un projet que tout développeur .NET devrait maintenant connaitre : Json.NET. Ca tombe bien, le code est open-source et disponible sur GitHib. Après avoir cloné le repo Git (ou avoir téléchargé directement le code) et ouvert la solution Newtonsoft.Json.sln, nous allons commencer à instrumenter cette dernière.

Etape 1 : attacher un nouveau projet NDepend à la solution

image

Si le projet n’avait encore jamais été compilé, la fenêtre suivante est affichée :

image

Dans ce cas, annulez, et compilez au préalable la solution. La fenêtre précédente aura maintenant la tête suivante :

image

Etape 2 : lancer l’analyse des 3 assemblies

image

Cette fenêtre est affichée à la première analyse. Elle montre les deux principaux points d’entrée de NDepend : le dashboard et le diagramme d'e dépendances. Ces deux points d’entrée sont bien sûr accessibles directement le menu NDepend :

image

Nous voyons à la même occasion que le menu NDepend est bien fourni. Nous y reviendrons. Quant au bouton “Browse NDepend Code Rules” du menu NDepend Beginner, il permet de naviguer dans les règles statiques exécutées par NDepend.

Le diagramme de dépendances

L’objectif du diagramme de dépendances, comme son nom l’indique assez logiquement, est de modéliser de façon compréhensible l’ensemble des dépendances d’une solution ou d’un projet. Dans le cas de Json.NET, le résultat est le suivant :

image

Ce diagramme est dynamique et exploratoire : en cliquant sur une boîte, on affiche plusieurs informations de synthèse sur l’assembly : nombre de lignes de code, d’instructions, de lignes de commentaire, de méthodes, de propriétés, de champs… Ainsi que quelques agrégats : coefficient d’abstraction, d’instabilité et la distance de bonne conception (on en avait déjà parlé dans cet article de 2013).

image

Quelles informations tirer de ce diagramme ? Pour commencer, nous voyons immédiatement que l’assembly Newtonsoft.Json n’a de dépendances sur sur le Framework.Net. Et encore, sur des composants de bas niveau. On s’en serait douté, vu les services qu’elle expose, mais l’intuition est confirmée par le diagramme. L’assembly Newtonsoft.Json.Tests, qui contient logiquement les tests unitaires de l’assembly précédente, dépend elle aussi du Framework .NET mais également de NUnit et Autofac.

Pour aller plus loin, il existe également une visualisation sous forme de matrice :

image

La version Ultimate de Visual Studio permet également de générer un diagramme de dépendances, qui se présente différemment :

image

En cliquant sur une assembly, on voit ses dépendances, entrantes et sortantes :

image

Le résultat est à mon sens graphiquement bien plus réussi, mais les informations présentées directement par NDepend sont un vrai plus. On peut se faire une idée relativement précise de la complexité d’une assembly d’un seul coup d’oeil, ce qui n’est pas possible avec le diagramme de VS Ultimate.

Cette fonctionnalité est d’une aide non-négligeable dans bon nombre de contextes :

  • audit de code
  • accueil d’un nouvel arrivant sur le projet
  • étude avant tout chantier de réécriture ou de refactoring conséquent

Le dashboard

Le dashboard sera dans la majorité des cas le point d’entrée le plus souvent utilisé. L’objectif ici est d’afficher une synthèse de la solution :

image

Deux catégories d’informations sont exposées :

  • des métriques : nombre de lignes de code, d’assemblies, de namespaces, de méthodes, mais aussi la complexité cyclomatique et le taux de couverture s’il est remonté. Et enfin, dans l’encart “third party usage”, sont affichées des informations détaillées sur les dépendances externes et la façon dont on utilise les assemblies dont dépend la solution.
  • l’état du code vis à vis des règles de codage et des requêtes d’analyse utilisées pour l’analyse, avec CQLinq (Code Query over Linq). En effet, NDepend se donne pour objectif non seulement d'exposer rapidement et clairement l’état d’une solution, mais aussi de viser à améliorer la base de code. Chacune de ces règles et requêtes est paramétrable via une interface dédiée. Cette fonctionnalité se pose directement en concurrence d’utilitaires comme FxCop /Visual Studio Code Analysis ou des règles Resharper, et des tableaux de bord Sonar. D’autant plus que NDepend permet de suivre l’évolution de chacune des informations affichées dans le temps et de visualiser les tendances associées.

Le dashboard NDepend est efficace, mais un peu moins évolué que celui de Sonar, qui permet de faire du drill-down très très simplement, et d’afficher la ligne de code qui a généré une violation de règle. En revanche, sa mise en place et la rapidité de l’analyse n’a rien à voir. Sonar demande bien plus de travail. Remarquons au passage d’une passerelle Sonar/NDepend est actuellement en cours de développement.

A noter que l’analyse NDepend est évidemment intégrable dans une build d’Intégration Continue, via l’exécution en ligne de commande avec NDepend.Console.exe. Les résultats seront affichés à l’aide d’un rapport HTML/Javascript. Les serveurs d’IC supportés officiellement sont :

  • TFS
  • CruiseControl.Net
  • Team City
  • FinalBuilder

Pas encore de Jenkins, mais un plugin d’intégration est à l’étude.

Pour aller plus loin

Nous avons vu dans les deux précédents paragraphes les principales fonctionnalités de NDepend, mais en réalité, l’outil fourmille de fonctionnalités, plus ou moins utiles selon le contexte. Citons :

  • la possibilité de piloter NDepend via une API .NET permettant d’exécuter des requêtes CQLinq et l’analyse depuis une application externe.
  • la comparaison de deux versions du code
  • quelques fonctionnalités dédiées à la programmation multi-threadée
  • la mise en oeuvre de certaines pratiques issues du Clean Code
  • la détection d’incohérences de dépendances (PDB manquantes, problèmes de versionnement d’assemblies, etc.)

Moralité

NDepend n’est pas un outil unique en son genre. En revanche, c’est probablement le seul outil du marché dédié à .NET et à donner un tel niveau de détail sur vos projets de façon centralisée. Il permet d’analyser rapidement l’état de santé d’un projet .NET et de garantir son maintien dans le temps. Les écrans pourraient être plus jolis, mais ils ont le mérite d’être efficaces, et la documentation est exhaustive et très détaillée.