java -jar monJar.jar chemin_vers_les_sources <min-X>
où min-X
est utilisé dans la 11ème métrique calculée : Les classes qui possèdent plus de X
méthodes
L'affichage des graphes, via JGraphX, reste "brouillon" car il faut généralement replacer les éléments à la main pour obtenir un graphe compréhensible. Pour aider un peu, j'ai laissé j'ai laissé d'une part un projet "exemple" ici pour tester le projet sur un programme simple. D'autre part, j'ai laissé là les résultats réarrangés des rendus graphiques avec :
-
Sur l'analyse de ce projet même
-
Sur l'analyse du projet exemple
-
Sur des tests faits pour vérifier l'algorithme de clustering
Se réréfer à la classe Main
- Les métriques du code sont calculées et affichées dans la console.
Toujour avec la classe Main
- Pendant l'analyse, des Relations sont crées. Les Relations associent deux classes et ont un poids (le nombre d'appels de méthodes entre les deux classes)
- Les différents graphes (Appels entre les classes, une autre vue complémentaire pour ces appels et le graphe de couplage) sont affichés ensuite
Se réréfer à la classe CallGraphBySpoon
Le graphe d'appel est retrouvé cette fois grâce à Spoon
La construction du dendrogramme est effectuée par la classe Dendrogram Comme dit plus haut, elle utilise notamment des Relations d'où elle identifie les ClassClusters les plus couplés et les lie deux à deux.
Le couplage est arrété si la moyenne des couplages des clusters d'origine est supérieure à la métrique de couplage qu'aurait le clusster généré par cette fusion.
Exemple : (A lire de haut en bas)
(A) <--4--> (B) <--2--> (C)<--6-->(D) # A et B s'appellent 4 fois, B et C 2 fois, C et D 6 fois
(A+B; S=4) <--2--> (C+D; S=6) # A et B fusionnent, leur couplage vaut 4, pour C et D c'est 6
~~(A+B; S=2)~~ # Si (A+B) et (C+D) fusionnaient, le cluster restant aurait un couplage de 2
# Le clustering s'arrête donc à la ligne 2
J'ai proposé un scénario pour présenter l'utilité de Spoon comme outil de refactoring à travers la classe SpoonTutorial
Inspiré de OW2con'18 Spoon: open source library to analyze, rewrite, transform, transpile Java source code
Utilise le programme d'exemple qu'il faut refactorer.
Les classes refactorées par le programme sont placées dans le dossier parent de ces dernières (lib/SimpleSample/company/src/com/company), pour être facilement comparées.
Lors d'une code review, vous vous rendez-compte qu'une faille dans le code permet à des classes non autorisées de modifier librement des personnes.
Après inspection, il s'avère que l'attribut statique allPersons
de la classe Person a été laissé public, malgré le fait qu'un getter getAllPersons()
existe déjà.
On se rend compte au passage que le getter encapsule mal le champ et renvoie directement l'objet pointé par Person.allPersons
(et permet donc d'obtenir une référence vers allPersons
qui devrait être privé).
- Passer le champ
Person.allPersons
en private - Altérer
Person.getAllPersons()
pour qu'il retourne une copie de la liste privée de Personnes - Modifier dans la classe Main les accès en lecture du champ
Person.allPersons
pour appeler à la place le getter dorénavant sûr
-
Avec Spoon et en utilisant les bonnes requêtes, le programme récupère successivement les références vers :
- Les classes
Person
etMain
- La méthode
getAllPersons()
- Le champ
allPersons
- Les classes
-
La visibilité de
allPersons
et passée àPRIVATE
-
Le code de
getAllPersons()
est remplacé pour renvoyerPerson.allPersons.clone()
-
Les accès en lecture du champ
allPersons
au sein de la classeMain
sont remplacés par l'invocation de la méthodegetAllPersons()
-
Un commentaire "TODO : check this auto-generated patch !" est ajouté à chaque remplacement