Qu'est-ce que la complexité cyclomatique ? Mesure de la qualité du code

  • Principal
  • Nouvelles
  • Qu'est-ce que la complexité cyclomatique ? Mesure de la qualité du code

Shutterstock / fran_kie

La complexité cyclomatique est une métrique de code que vous pouvez voir dans de nombreux IDE, tels que Visual Studio. Bien qu'il ne s'agisse pas d'une science exacte, cela vous donne une idée générale de la complexité des fonctions, des classes et des espaces de noms, ce qui peut être utile lors de la recherche de code à refactoriser.

Qu'est-ce que la complexité cyclomatique ?

La complexité cyclomatique mesure essentiellement jusqu'où votre code se ramifie. Tant qu'il y a un |__+_| ou un autre bloc de contrôle tel qu'une boucle, la complexité cyclomatique augmente, car le graphe ressemblera de plus en plus à un arbre.

Si vous considérez votre code comme une série d'actions (fonctions, appels de méthode, affectations de variables) liées via un flux de contrôle, vous obtenez un graphique abstrait que vous pouvez utiliser pour mieux comprendre la complexité. Pour les flux de contrôle courants comme |__+_| déclarations et |__+_| boucle, les graphiques ressemblent à ceci:

La formule est simple; prenez le nombre d'arêtes sur le graphique (les flèches qui relient tout) et soustrayez le nombre de nœuds sur le graphique (les actions elles-mêmes).

|__+_|

Par exemple, ce code a une complexité cyclomatique de un, car il n'y a pas de branches, et il appelle simplement WriteLine encore et encore. Puisqu'il s'agit simplement d'un code parfaitement linéaire, le nombre de nœuds annulera le nombre d'arêtes, donnant une complexité cyclomatique de un.

|__+_|

Pour un code plus compliqué avec des branches, la complexité sera plus élevée. Ce code, qui contient un fichier |__+_| instruction, a une complexité de 6, car il existe de nombreux chemins différents que le code peut emprunter. Chaque |__+_| dans l'instruction switch ajoute de la complexité car elle peut conduire à différentes sorties avec différentes entrées.

|__+_|

La complexité cyclomatique n'est calculée que dans le cadre de la fonction. Si une fonction appelle une autre fonction qui a une complexité cyclomatique élevée, elle n'est comptée que comme un seul nœud et n'ajoute rien à l'appelant, même si elle ajoute techniquement de la complexité au programme au sens général.

La complexité cyclomatique est-elle utile ?

La complexité cyclomatique n'est pas une métrique parfaite. C'est une métrique très simple qui examine les nuances du code lui-même. Bien sûr, vous pouvez toujours avoir un code terrible avec une faible complexité ou un code décent avec une complexité élevée. Mais dans l'ensemble, cela reste assez utile pour avoir une idée générale de la complexité d'un programme.

Pour la plupart, la complexité 6 à 8 est probablement bonne tant que le code lui-même est bien formaté. Tout ce qui se situe entre 8 et 15 est discutable et tout ce qui dépasse 15 n'est probablement pas bon. Tout ce qui dépasse 25 ans est presque certainement un problème, sauf preuve du contraire.

Bien qu'une complexité cyclomatique élevée dans une fonction donnée ne soit pas la fin du monde, cela peut indiquer un problème plus vaste. Les fonctions très complexes sont plus difficiles à maintenir et sujettes à plus d'erreurs, car il y a plus de choses qui peuvent mal tourner. Et des fonctions plus complexes conduisent directement à des tests unitaires plus complexes, ce qui peut rendre le code difficile à maintenir à long terme en raison de la difficulté des tests.

Visual Studio et d'autres IDE calculent les complexités agrégées de classes et d'espaces de noms entiers, ce qui peut être utile pour suivre des classes plus complexes. Vous pouvez trier par complexité la plus élevée et obtenir plus d'informations sur les fonctionnalités individuelles.

La révision du code peut souvent tenir compte de la complexité cyclomatique, tout en signalant les fonctionnalités problématiques qui peuvent nécessiter une révision manuelle. Cela peut en faire un outil très utile pour garder une base de code propre et bien rangée.

Recherche d'un code erroné

De nombreux IDE, tels que Visual Studio, auront des outils intégrés pour calculer la complexité cyclomatique et d'autres métriques de code pour l'ensemble de la base de code.

Pour ce faire, à partir de Visual Studio, cliquez sur Analyser > Calculer les métriques de code > Par solution.

Le panneau 'Code Metrics' apparaîtra montrant une analyse détaillée de la solution. Vous pouvez trier par complexité dans l'ordre décroissant pour voir les espaces de noms les plus problématiques.

Ajoutant à la complexité, Visual Studio propose également un « indice de maintenabilité » qui attribue un score à la méthode la plus facilement maintenable de 0 à 100, ainsi qu'un « couplage de classe » qui répertorie le nombre de classes auxquelles cette fonction fait référence. ou classe.

Ici, Visual Studio a mis en évidence une de mes méthodes de 400 lignes qui a obtenu un énorme 72 sur l'échelle de complexité et un 14/100 sur l'indice de maintenabilité (présenté sous la forme d'un triangle d'avertissement jaune) et fait référence à 65 classes différentes.

Il pourrait être envoyé directement aux cinq étapes de la douleur dans le résultat. 'Mais c'est une très longue coroutine qui a beaucoup de travail à faire !' Je me dis, essayant de nier que le code que j'ai écrit est mathématiquement mauvais, au point où Visual Studio lance un avertissement. Une complexité de 72 doit absolument être nettoyée.

Dans ce cas, la solution était simple : la coroutine a de nombreuses tâches à faire, donc je divise ces tâches en coroutines plus petites et remplace la méthode principale par des appels de sous-routine. Le code global n'a pas changé, pas plus que la complexité globale de la classe elle-même, mais maintenant la fonction principale n'est plus une monstruosité de 400 lignes.

Qu'est-ce que tu penses?