18/12/2013

La maintenabilité d'un projet PHP en images

Ça faisait longtemps que je cherchais un outil capable de me fournir un aperçu, très général et visuel, de la maintenabilité d'un projet. Ne trouvant finalement que peu de chose sur le net, je me suis décidé à en coder un rapidement.

Pour illustrer le fonctionnement de cet outil, voici les rapport pour les sources de différents projets PHP :

Symfony2 Component :

Aperçu du rapport pour Symfony2 Component

Zend Framework 2 :

Aperçu du rapport pour Zend Framework 2

Drupal 7 :

Aperçu du rapport pour Drupal

CakePHP 2 :

Aperçu du rapport pour CakePHP

WordPress 3 2 :

Aperçu du rapport pour WordPress

Chaque cercle représente un fichier. En schématisant, plus le cercle est gros, plus le code est complexe ; la couleur, elle, est représentative de l'indice de maintenabilité.

Pour les plus pressés, l'outil en question est disponible sur Github.

Pour les autres, voici quelques explications.

Avant de commencer, il faut être conscient que la notion de maintenabilité applicative est bien plus complexe que ne sait le résoudre un tel outil. Elle dépend de facteurs humains (équipe en charge du projet), environnementaux (contexte de l'entreprise, contraintes de délais), du code source (clarté, simplicité), du choix des outils (présence d'un support, possibilité d'obtenir des formations), etc.

Cet outil ne prétend en aucun cas fournir des chiffres précis sur l'ensemble de ces critères. Non, l'objet de cet outil est de fournir des indicateurs à partir d'une analyse statique du code source.

Je n'ai rien inventé : les algorithmes utilisés pour calculer ce type d'indicateurs existent depuis la fin des années 70, et de nombreux IDE (Visual Studio par exemple) intègrent nativement des modules de supervision du code basés sur ces mêmes algoritmes pour différents langages de programmation.

L'outil commence d'abord par convertir le code source en tokens, pour calculer le premier indicateur utilisé : les métriques d'Ahlstead. Cet indicateur fourni des informations à partir d'un ratio entre le volume du code, la variété et le type de structures manipulées dans un code source. Il fournit :

  • la taille du programme (N) ;
  • le vocabulaire (n) : en gros, plus le code emploie de fonctions, variables, opérateurs... différents, plus le vocabulaire est riche ;
  • le volume du programme (V) : ratio entre la taille et le vocabulaire ;
  • le niveau de difficulté (D) : propension d'erreurs du programme ;
  • l'effort d'implémentation fourni (E) ;
  • le temps d'implémentation estimé en secondes (T) ;
  • le nombre de bugs délivrés (B) : il s'agit d'une estimation du nombre de bugs dans le code source. Ce nombre est idéalement inférieur à 2.

La seconde étape consiste à calculer la complexité cyclomatique du code source. De ce côté, je n'ai pas cherché à réinventer la route : j'utilise l'excellent phploc.

À partir de ces informations, nous pouvons calculer l'Indice de maintenabilité. Cet indicateur fourni une note, de 0 à 171, où 0 représente un code très difficilement maintenable, et 171 un code maintenable.

Le code source est disponible sur Github: Halleck45/PhpMetrics. Cet outil reste à affiner ; n'hésitez donc surtout pas à proposer des améliorations ou à signaler des anomalies.

blog comments powered by Disqus