Mesure de la qualité du code source - Algorithmes et outils
Distance from the main sequence
Définition
La distance from the main sequence est définie par la formule suivante :
Avec :
- Abstractness : Le niveau d'abstraction.
- Instability : L'indice d'instabilité.
Interprétation
Cet indicateur est toujours compris entre 0 et 1. Il représente en fait l'équilibre qui doit résider entre le niveau d'abstraction et l'indice d'instabilité.
Plus la valeur est proche de 0, plus le design du paquetage est considéré comme bon. En effet, cette valeur va tendre vers 0 lorsque :
- le paquetage est instable mais possède peu d'interfaces,
- beaucoup d'autres paquetages dépendent de ce paquetage, mais celui-ci possède beaucoup d'interfaces.
Une valeur au delà de 0,5 indique qu'il faut songer à refactoriser le paquetage.
Exemple d'utilisation
Reprenons l'exemple des pages précédentes
Comme nous l'avons déjà calculé dans les slides précédentes, on a :
- Paquetage stable :
- Instability : 0
- Abstractness : 0
- Paquetage instable :
- Instability : 1
- Abstractness : 0
En appliquant la formule, on obtient une distance from the main sequence de |0+0-1| = 1 pour le paquetage stable et de |1+0-1| = 0 pour le paquetage instable.
L'indicateur considère donc le paquetage instable comme bien architecturé alors que le paquetage stable est considéré comme mal architecturé. Ces résultats, qui peuvent paraître étranges au premier abord, sont en fait parfaitement compréhensibles.
En effet, la distance from the main sequence du paquetage instable est bonne parce que l'architecture du paquetage est cohérente avec le besoin que les classes extérieures ont de lui : il n'est pas très sollicité, il n'a donc pas besoin de beaucoup d'interfaces. Son indice aurait été mauvais s'il avait eu beaucoup d'interfaces alors que personne ne dépendait de lui.
En revanche, la distance from the main sequence du paquetage stable est mauvaise parce que ce paquetage ne possède pas d'interface alors que beaucoup de classes dépendent de lui. Il faut refactoriser ce paquetage en ajoutant des interfaces pour les classes utilisées.