Complexité cyclomatique (simplifiée) !

Clean Code CC .NET
Par Alexis SANTO il y a 3 ans 4 minutes

Dans cet article nous allons parler d’un des concepts du « clean code ».

Pour rappel, le clean code est un groupement de pratiques visant à rendre votre code propre, lisible, compréhensible, évolutif et facilement maintenable par toute personne qui passerait après vous.

Pour plus de détails, suivez ce lien.

Entrons donc maintenant dans le vif du sujet. Qu’est-ce que la complexité cyclomatique ?

Définition :

La complexité cyclomatique est une métrique logicielle utilisée pour indiquer la complexité d'un programme. Nous la déterminons en comptant le nombre de chemins linéairement indépendants à travers le code source d'un programme. Elle a été développée par Thomas J. McCabe, Sr. en 1976.

Mesurer la complexité d’un code :

Nous pouvons mesurer la complexité cyclomatique de différentes façons. Si vous voulez en savoir plus, je vous invite à consulter ces différents liens :

Wikipedia. "Cyclomatic complexity". Version anglaise.

Arthur H. Watson; Thomas J. McCabe (1996). "Structured Testing: A Testing Methodology Using the Cyclomatic Complexity Metric" (PDF). NIST Special Publication 500-235.

Je vous présente la formule de calcul :

M = E – N + 2P.

E correspond aux arêtes (ou arcs) ;

N correspond aux nœuds ;

P correspond aux nombres de composants connectés.

Plus le nombre de complexité est élevé, plus votre code est complexe. Nous allons démontrer cela à travers un exemple.

Voici l’algorithme que nous allons analyser :

if (a == 10) {
  if (b > c) {
    a = b;
  } else {
    a = c;
  }
}

print(a);
print(b);
print(c);

Et voici le diagramme qui en découle :

image

Si nous suivons la formule, alors 8 – 7 + (2 * 1) = 3.

La complexité cyclomatique donc de 3.

Utilité de la démarche :

Simplifier et rendre plus lisible votre code lors de la phase de développement.

L’étude menée par McCabe met en avant le fait que si une complexité cyclomatique est de 10 ou plus, cela est un signe qui indique que le code nécessite sûrement une refactorisation (découpe du code en sous parties par exemple). Dans certains cas où la tâche est complexe, nous pouvons élever ce jalon à 15 mais il est alors conseillé de laisser un commentaire pour en expliquer la raison.

Déterminer le nombre de cas de tests nécessaires.

En effet, une couverture de tests complète nécessite qu’il y ait autant de tests que le nombre de complexité obtenu. Il est cependant impossible de tester tous les chemins dans certains cas et donc nous pouvons avoir un nombre de tests inférieur à la complexité trouvé.

Réduire le nombre d’erreurs dans votre programme.

Des études ont démontré qu’il existe une relation entre une grande complexité et le nombre d’erreurs possibles. Voici quelques articles qui en parlent :

  • Norman E Fenton, Martin Neil (1999). “A Critique of Software Defect Prediction Models”.
  • Schroeder, Mark (1999). “A Practical guide to object-oriented metrics”.

Augmenter le taux de cohésion de votre programme.

Il a été montré qu’une forte correspondance existe entre le niveau de cohésion et la complexité cyclomatique par une étude menée en 2005. Voici le lien pour plus de détails : Stein Cara, Cox Glenn, Etzkorn Letha, Gholston Sampson, Virani Shamsnaz, Farrington Phil (2005). Exploring the Relationship between Cohesion and Complexity. Journal of Computer Science, 1(2), 137-144.

Evaluation de la complexité (avec NDepend):

NDepend est un logiciel d’analyse statique du code pour le framework .NET qui se concentre sur les relations entre les objets. Il passe en revue les bonnes pratiques du développement (les « code smells », la complexité, la maintenabilité, l’évolutivité, les tests, etc).

L’analyse vous donne accès à différentes métriques avec une représentation graphique.

Comment l’installer ?

Ce logiciel a une version d’essai de 14 jours. Après l’avoir téléchargé, il suffit de le dézipper à la racine du projet que nous souhaitons analyser et de lancer l’exécutable.

Il s’installera ensuite en tant qu’extension sur la version de Visual Studio que vous choisirez. Il peut aussi s’exécuter en mode standalone via un exécutable.

Utilisation :

Ouvrez la solution ou vous avez installé NDepend. Une fois que Visual Studio est ouvert, vous pourrez trouver un nouveau volet « NDepend » dans le volet « Extensions ».
Survolez le volet pour ouvrir un autre volet et cliquez sur « Attach New NDepend Project to Current VS Solution ».

image

Après avoir cliqué, vous verrez apparaître une fenêtre avec une liste des « assemblies » que vous pouvez analyser dans la solution courante.

image

Sélectionnez les « assemblies » que vous souhaitez puis lancez l’analyse.

Après un petit moment d’attente, une fenêtre apparaîtra. Cliquez sur « View NDepend Dashboard ».

image

Voici le tableau de bord de NDepend.

image

Cliquez ensuite encore une fois sur le volet « Extensions » puis survolez le volet « NDepend » pour voir que de nouvelles options sont apparues.

image

Cliquez sur l’option « Code Metrics » pour voir apparaître la vue des métriques.

image

Sélectionnez ensuite l’option « Cyclomatic Complexity (CC) » dans les deux volets déroulants.

image

Vous verrez alors les métriques se mettre à jour.

image

Les couleurs que vous voyez sur le graphique sont apparentées aux taux de cohésion qui sont définies sur la barre de droite. Les différents taux de complexités par défaut se basent sur l’étude de McCabe. Vous pouvez personnaliser vos propres limites de complexité si vous le souhaitez.
Vous pouvez aussi choisir le niveau de précision souhaité dans le volet « Level » situé en haut à gauche (méthode, classe…).

image

Conclusion :

Et voilà, c’est la fin de cet article. Je vous laisse maintenant analyser votre code plus en détails.
Sachez aussi que vous pouvez personnaliser NDepend avec vos propres règles et bonnes pratiques de développement. Si vous voulez creuser le sujet plus loin, voici un lien vers la documentation qui vous aiguillera.

A vous de jouer !