Mesure de la qualité du code source - Algorithmes et outils
Indice de spécialisation
Définition
L'indice de spécialisation d'une classe est défini par la formule suivante :
Avec :
- NORM : Number of Overriden Methods, le nombre de méthodes redéfinies.
- DIT : Depth in Inheritance Tree, la profondeur dans l'arbre d'héritage.
- NOM : Number Of Methods, le nombre de méthodes de la classe 3.
Il est ensuite possible d'effectuer des moyennes pour un paquetage, un ensemble de paquetages, ou un projet.
Interprétation
Cet indice augmente quand :
- le nombre de méthodes redéfinies augmente,
- la profondeur d'héritage augmente.
Il diminue quand :
- le nombre de méthodes spécifiques à la classe augmente,
- le nombre de méthodes redéfinies diminue.
Cet indice peut-être considéré comme trop élevé lorsqu'il est supérieur à 1.5. Il faut alors penser à refactoriser en utilisant des interfaces. En effet, cela signifie souvent qu'un objet hérite d'un autre en redéfinissant beaucoup de ses méthodes : il utilise donc l'héritage alors qu'il s'agit d'un objet très spécialisé. L'utilisation des interfaces et de la délégation est plus appropriée, pour clarifier le code et éviter les problèmes de maintenance.
Exemple d'utilisation
Considérons le diagramme de classes suivant :
La classe 1 hérite de la classe Object. Sur ce diagramme, la classe 2 hérite de la classe 1 mais ne redéfinit aucune méthode. La classe 3 hérite de la classe 2 et redéfinit les méthodes 1, 2 et 3.
Calcul de l'indice
Pour la classe 3 de cet exemple, on a donc :
- NORM = 3, puisqu'on redéfinit trois méthodes.
- DIT = 3, il s'agit de la profondeur de la classe 3 dans l'arbre d'héritage.
- NOM = 3, puiqu'au total, la classe 3 possède trois méthodes (les trois méthodes redéfinies).
Dans cet exemple, l'indice de spécialisation vaut donc (3*3/3) = 3.
Il s'agit d'un indice de spécialisation élevé et cette classe gagnerait à être refactorisée.