Remplacer une méthode par un objet-méthode.
Vous avez une longue méthode dans laquelle les variables locales sont si entremêlées que vous ne pouvez pas appliquer Extraire une méthode.
Transformez la méthode en une classe distincte afin que les variables locales deviennent des champs de la classe. Vous pourrez alors scinder la méthode en plusieurs méthodes au sein de la même classe.
##Example
class Order {
// ...
public double price() {
double primaryBasePrice;
double secondaryBasePrice;
double tertiaryBasePrice;
// Effectuer le long calcul.
}
}class Order {
// ...
public double price() {
return new PriceCalculator(this).compute();
}
}
class PriceCalculator {
private double primaryBasePrice;
private double secondaryBasePrice;
private double tertiaryBasePrice;
public PriceCalculator(Order order) {
// Copier les informations pertinentes depuis
// l'objet order.
}
public double compute() {
// Effectuer le long calcul.
}
}##Why Refactor
Une méthode est trop longue et vous ne pouvez pas la séparer à cause d'un enchevêtrement de variables locales difficiles à isoler les unes des autres.
La première étape consiste à isoler la méthode entière dans une classe distincte et à transformer ses variables locales en champs de la classe.
D'une part, cela permet d'isoler le problème au niveau de la classe. D'autre part, cela ouvre la voie au découpage d'une méthode volumineuse et peu maniable en méthodes plus petites qui, de toute façon, ne cadreraient pas avec la vocation de la classe d'origine.
##Benefits
- Isoler une longue méthode dans sa propre classe permet d'empêcher une méthode de gonfler démesurément. Cela permet aussi de la scinder en sous-méthodes au sein de la classe, sans polluer la classe d'origine avec des méthodes utilitaires.
##How to Refactor
-
Créez une nouvelle classe. Nommez-la d'après l'objectif de la méthode que vous refactorisez.
-
Dans la nouvelle classe, créez un champ privé destiné à stocker une référence vers une instance de la classe où se trouvait précédemment la méthode. Il pourra servir à récupérer certaines données nécessaires depuis la classe d'origine, le cas échéant.
-
Créez un champ privé distinct pour chaque variable locale de la méthode.
-
Créez un constructeur qui accepte comme paramètres les valeurs de toutes les variables locales de la méthode et qui initialise également les champs privés correspondants.
-
Déclarez la méthode principale et copiez-y le code de la méthode d'origine, en remplaçant les variables locales par les champs privés.
-
Remplacez le corps de la méthode d'origine dans la classe d'origine en créant un objet-méthode et en appelant sa méthode principale.