Tenemos muchos lugares en el código fuente de nuestra aplicación, donde una clase tiene muchos métodos con los mismos nombres y diferentes parámetros. Esos métodos siempre tienen todos los parámetros de un método 'anterior' más uno más.
Es el resultado de una larga evolución (código heredado) y este pensamiento (creo):
" Hay un método M que hace la cosa A. Necesito hacer A + B. OK, lo sé ... Agregaré un nuevo parámetro a M, crearé un nuevo método para eso, moveré el código de M al nuevo método con un parámetro más, haga A + B allí y llame al nuevo método desde M con un valor predeterminado del nuevo parámetro " .
Aquí hay un ejemplo (en lenguaje similar a 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
(...)
}
(...)
}
Siento que esto está mal. No solo eso no podemos seguir agregando nuevos parámetros como este para siempre, sino que el código es difícil de extender / cambiar debido a todas las dependencias entre los métodos.
Aquí hay algunas formas de hacerlo mejor:
Introducir un objeto de parámetro:
class DocumentCreationParams { String name; int minPagesCount; boolean firstPageBlank; String title; (...) } class DokumentHome { public Document createDocument(DocumentCreationParams p) { // here the real work gets done (...) } }
Establezca los parámetros para el
DocumentHome
objeto antes de llamarcreateDocument()
@In DocumentHome dh = null; (...) dh.setName(...); dh.setMinPagesCount(...); dh.setFirstPageBlank(...); Document newDocument = dh.createDocument();
Separe el trabajo en diferentes métodos y llámelos según sea necesario:
@In DocumentHome dh = null; Document newDocument = dh.createDocument(); dh.changeName(newDocument, "name"); dh.addFirstBlankPage(newDocument); dh.changeMinPagesCount(new Document, 10);
Mis preguntas:
- ¿El problema descrito es realmente un problema?
- ¿Qué opinas sobre las soluciones sugeridas? ¿Cuál preferirías (según tu experiencia)?
- ¿Se te ocurre alguna otra solución?