Saviez-vous que le code
source d'un programme a une odeur ? C'est souvent quand le code
sent mauvais qu'on la remarque (« code
smells »). L'analyse du code permet de détecter des
mauvaises pratiques de l'orienté-objet ou plus globalement, des
paradigmes à disposition dans le langage de programmation.
Aujourd'hui
penchons-nous sur cette odeur nauséabonde du code que les
anglo-saxons appellent « feature envy »,
et que je traduirais par « jalousie de fonctionnalité ».
La « jalousie de
fonctionnalité » survient quand une méthode est plus
intéressée par les fonctionnalités (méthodes et champs) d'autres
classes que les siennes propres. La solution la plus simple est de
déplacer la méthode dans ces autres classes, tout du moins, une
partie de la méthode, celle qui a le plus de « jalousie ».
Le greffon Eclipse
« Eclipse Metrics Plugin » calcule cette métrique avec
la formule suivante :
Etant donné :
m, la méthode pour
laquelle nous souhaitons calculer la « jalousie de
fonctionnalité »
Fc,
l'ensemble des fonctionnalités utilisées par m et appartenant au
type c
cm, la
classe dans laquelle m est définie
Alors
JalousieDeFonctionnalité(m)
= maxc ≠ cm(|Fc|) - |Fcm|
Prenons un exemple :
Etant donné la classe
Foo suivante :
package com.jeromeradix; public class Foo { public void methodA() { } public void methodB() { } public void methodC() { } }
et la classe Velo
suivante :
package com.jeromeradix; public class Velo { public void methodX() { } public void methodY() { } }
Examinons le classe Bar
suivante pour établir la métrique
JalousieDeFonctionnalité(Bar.method1) :
package com.jeromeradix; public class Bar { public void method1(Foo f, Velo v) { f.methodA(); f.methodA(); f.methodB(); v.methodX(); } }
Comme method1() appelle
deux méthodes différentes de Foo, on obtient |FFoo| = 2.
Comme method1() appelle
une seule méthode de Velo, on obtient |FVelo| = 1.
Ainsi maxc ≠
Bar(|Fc|) = 2
La méthode method1()
n'utilise pas d'autres méthodes de Bar, donc |FBar| = 0
Ainsi,
JalousieDeFonctionnalité(Bar.method1) = maxc ≠ Bar(|Fc|)
- |FBar| = 2 – 0 = 2.
Aucun commentaire:
Enregistrer un commentaire