Styles

samedi 12 mai 2012

Qu'est-ce que la métrique "Feature Envy" ou "Jalousie de Fonctionnalité" ?

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.


Ce que nous confirme l'export HTML de l'Eclipse Metrics Plugin :
Le plugin Eclipse Metrics part sur une valeur max de JalousieDeFonctionalité = 2. Cela veut dire qu'au delà de 2, un message d'avertissement sera affiché dans la fenêtre "Problème" d'Eclipse, message qu'il sera donc intéressant de suivre en reconcevant la méthode si jalouse de ses voisines.

Aucun commentaire: