Nous avons beaucoup d'endroits dans le code source de notre application, où une classe a de nombreuses méthodes avec les mêmes noms et différents paramètres. Ces méthodes ont toujours tous les paramètres d'une méthode «précédente» plus un de plus.
C'est le résultat d'une longue évolution (code hérité) et de cette réflexion (je crois):
" Il y a une méthode M qui fait la chose A. J'ai besoin de faire A + B. OK, je sais ... Je vais ajouter un nouveau paramètre à M, créer une nouvelle méthode pour cela, déplacer le code de M vers la nouvelle méthode avec un paramètre de plus, faites l'A + B là-bas et appelez la nouvelle méthode à partir de M avec une valeur par défaut du nouveau paramètre. "
Voici un exemple (en langage Java):
class DocumentHome {
(...)
public Document createDocument(String name) {
// just calls another method with default value of its parameter
return createDocument(name, -1);
}
public Document createDocument(String name, int minPagesCount) {
// just calls another method with default value of its parameter
return createDocument(name, minPagesCount, false);
}
public Document createDocument(String name, int minPagesCount, boolean firstPageBlank) {
// just calls another method with default value of its parameter
return createDocument(name, minPagesCount, false, "");
}
public Document createDocument(String name, int minPagesCount, boolean firstPageBlank, String title) {
// here the real work gets done
(...)
}
(...)
}
J'ai l'impression que c'est faux. Non seulement nous ne pouvons pas continuer à ajouter de nouveaux paramètres comme celui-ci pour toujours, mais le code est difficile à étendre / modifier en raison de toutes les dépendances entre les méthodes.
Voici quelques façons de mieux faire cela:
Introduisez un objet paramètre:
class DocumentCreationParams { String name; int minPagesCount; boolean firstPageBlank; String title; (...) } class DokumentHome { public Document createDocument(DocumentCreationParams p) { // here the real work gets done (...) } }
Définissez les paramètres de l'
DocumentHome
objet avant d'appelercreateDocument()
@In DocumentHome dh = null; (...) dh.setName(...); dh.setMinPagesCount(...); dh.setFirstPageBlank(...); Document newDocument = dh.createDocument();
Séparez le travail en différentes méthodes et appelez-les selon vos besoins:
@In DocumentHome dh = null; Document newDocument = dh.createDocument(); dh.changeName(newDocument, "name"); dh.addFirstBlankPage(newDocument); dh.changeMinPagesCount(new Document, 10);
Mes questions:
- Le problème décrit est-il vraiment un problème?
- Que pensez-vous des solutions suggérées? Laquelle préféreriez-vous (en fonction de votre expérience)?
- Pouvez-vous penser à une autre solution?