Nombre cyclomatique

Le nombre cyclomatique, la complexité cyclomatique ou la mesure de McCabe est un outil de métrologie logicielle développé par Thomas McCabe en 1976 pour mesurer la complexité d'un programme informatique. Cette mesure reflète le nombre de décisions d'un algorithme en comptabilisant le nombre de « chemins » linéairement indépendants au travers d'un programme représenté sous la forme d'un graphe.

Définition

La complexité cyclomatique d'un programme structuré[note 1] est définie[1] par :

M = E N + 2 P {\displaystyle M=E-N+2P}

où  :

M = complexité cyclomatique ;
E = le nombre d'arêtes du graphe ;
N = le nombre de nœuds du graphe ;
P = le nombre de composantes connexes du graphe.

Intérêt

Un code simple, au faible nombre cyclomatique, est théoriquement plus facile à lire, à tester et à entretenir[2] :

  • un effort de compréhension plus soutenu doit être effectué durant la lecture d'un code complexe, de façon à retenir et à prendre en compte chaque embranchement ;
  • les tests unitaires doivent tester toutes les possibilités d’embranchement dans la fonction, de façon à suivre chacun des « chemins » ; or, les tests unitaires ont primordialement été conçus pour tester des fonctions en isolation par un cas simple ;
  • de même, la correction d'un bug ou l'amélioration d'une fonction simple sera facilitée par l'absence d'obligation de prise en compte de ces embranchements et possibilités.

Critique

Cependant, le nombre cyclomatique ne fait pas l'unanimité. Ainsi, dès , une étude montre que le nombre cyclomatique ne s'appuie pas sur une base théorique solide et n'est pas adapté au développement logiciel et souligne qu'aucune observation empirique ne vient justifier l'utilité de cette mesure[3].

D'autres possibilités existent pour compléter le nombre cyclomatique, comme la complexité NPath (en anglais, NPath complexity), mesurant le nombre total de possibilités d'emprunter l'ensemble des chemins, là où le nombre cyclomatique se contente d'additionner ces chemins[2],[4].

Outils de mesure de complexité

Si ce bandeau n'est plus pertinent, retirez-le. Cliquez ici pour en savoir plus.
Si ce bandeau n'est plus pertinent, retirez-le. Cliquez ici pour en savoir plus.

Cet article contient une ou plusieurs listes ().

Ces listes gagneraient à être rédigées sous la forme de paragraphes synthétiques, plus agréables à la lecture, les listes pouvant être aussi introduites par une partie rédigée et sourcée, de façon à bien resituer les différents items.
D'autre part, Wikipédia n'a pas pour rôle de constituer une base de données et privilégie un contenu encyclopédique plutôt que la recherche de l'exhaustivité.

Il existe plusieurs outils logiciels pour calculer le nombre cyclomatique. Selon les langages de programmation, il y a des outils qui sont open source et d'autres non.

Pour les langages C et C++, pmccabe, GNU Complexity et Frama-C sont open source alors que Testwell CMT++ et PolySpace sont des logiciels commerciaux. Dans le monde de Java nous trouvons Eclipse Metrics et Metrics des plugins open source pour Eclipse. Testwell CMTJava est logiciel commercial.

  • En open source
    • Pour C et C++
      • pmccabe
      • GNU Complexity
      • Frama-C
    • Pour PHP
      • PHPDepend
      • PHPMD
      • phploc
    • Pour Python
      • Pynocle
      • Pycabehtml
      • flake8.
    • Pour Java (plugins Eclipse)
      • Eclipse Metrics
      • Metrics
    • Pour Ada
      • gnatmetric (fourni avec GNAT)
    • Pour Ruby
      • Rubocop[5]
    • Pour Go
      • Gocyclo[6]

Notes et références

Notes
  1. Ici, structuré signifie en particulier « avec un seul point d'entrée et un seul point de sortie ».
Références
  1. McCabe (1976), p. 314.
  2. a et b « Cyclomatic and NPath complexity explained », sur Coding Swag, (consulté le ).
  3. (en) M. Shepperd, « A critique of cyclomatic complexity as a software metric », Software Engineering Journal, IET, vol. 3, no 2,‎ , p. 30-36 (ISSN 0268-6961, résumé, lire en ligne).
  4. (en) Brian A. Nejmeh, « NPATH: a measure of execution path complexity and its applications », Communications of the ACM, Association for Computing Machinery, vol. 31, no 2,‎ , p. 188-200 (ISSN 0001-0782, DOI 10.1145/42372.42379, résumé, lire en ligne).
  5. (en) « Rubocop/rubocop : A Ruby static code analyzer and formatter, based on the community Ruby style guide. », sur GitHub (consulté le ).
  6. (en) « Fzipp/gocyclo : Calculate cyclomatic complexities of functions in Go source code. », sur GitHub (consulté le ).

Outils calculant la complexité cyclomatique

  • Métrique (logiciel)
  • PMD (logiciel)

Liens externes

  • Calcul du nombre cyclomatique (article dans MSCoder)
  • (en) Cyclomatic and NPath complexity explained sur Coding Swag


v · m
Gestion de la qualité logicielle
Indicateurs de qualité (ISO/CEI 9126)
Compréhension et contrôle du code source
Tests
Métriques
Remaniements
Principes de programmation
SOLID
Mauvaises pratiques
Antipatterns
Code smells
Voir aussi : Génie logiciel, Érosion de l'architecture logicielle
  • icône décorative Portail de l’informatique