Temos muitos lugares no código fonte do nosso aplicativo, onde uma classe tem muitos métodos com os mesmos nomes e parâmetros diferentes. Esses métodos sempre têm todos os parâmetros de um método 'anterior' mais um.
É o resultado de longa evolução (código legado) e esse pensamento (acredito):
" Existe um método M que faz a coisa A. Eu preciso fazer A + B. OK, eu sei ... vou adicionar um novo parâmetro a M, criar um novo método para isso, mover o código de M para o novo método com mais um parâmetro, faça o A + B ali e chame o novo método de M com um valor padrão do novo parâmetro " .
Aqui está um exemplo (em linguagem semelhante 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
(...)
}
(...)
}
Eu sinto que isso está errado. Não apenas não podemos continuar adicionando novos parâmetros como esse para sempre, mas o código é difícil de estender / alterar por causa de todas as dependências entre os métodos.
Aqui estão algumas maneiras de como fazer isso melhor:
Introduzir um 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 (...) } }
Defina os parâmetros para o
DocumentHome
objeto antes de chamarmoscreateDocument()
@In DocumentHome dh = null; (...) dh.setName(...); dh.setMinPagesCount(...); dh.setFirstPageBlank(...); Document newDocument = dh.createDocument();
Separe o trabalho em diferentes métodos e chame-os conforme necessário:
@In DocumentHome dh = null; Document newDocument = dh.createDocument(); dh.changeName(newDocument, "name"); dh.addFirstBlankPage(newDocument); dh.changeMinPagesCount(new Document, 10);
Minhas perguntas:
- O problema descrito é realmente um problema?
- O que você acha das soluções sugeridas? Qual você prefere (com base na sua experiência)?
- Você consegue pensar em outra solução?