Idioma: Parâmetros Opcionais Explícitos Problema: Você tem um método quem tem parâmetros opcionais. Frequentemente, a opção não passada é "null" ou tem um valor padrão bem definido. Solução: Crie um método para cada configuração de parâmetros que você tenha e faça os com menos parâmetros chamarem os de mais parâmetros. Apenas o método com mais parâmetros tem a lógica. Reasoning: Sempre usar um único método pode ser um problema se na maior parte das vezes o valor passado é o mesmo. Se você quiser alterar o "padrão", tem que caçar em todo o código. Por outro lado, travar um valor fixo faz você ter que alterar o código se quiser algo ligeiramente diferente. Oferecendo um bom padrão e , ao mesmo tempo, flexibilidade, resolve os dois usos e o custo é baixo. Exemplo:
public Autocomplete ( String className, Object parameter, int maxSize,
String highlightTemplate ) {
try {
this.klass = Class.forName ( className + "Option" );
this.parameter = parameter;
this.maxSize = maxSize;
this.highlightTemplate = highlightTemplate;
initialize ();
} catch ( ClassNotFoundException e ) {
throw new RuntimeException ( "Class not found for \"" + className + "\"", e );
}
}
public Autocomplete ( String className, Object parameter, int maxSize ) {
this ( className, parameter, maxSize, "$1" );
}
public Autocomplete ( String className, Object parameter ) {
this ( className, parameter, 8 );
}
Parece que dá um pouco de trabalho (e até dá), mas é uma maneira muito clara de você passar a idéia de ter parâmetros opcionais, e depois que você acostuma, é completamente trivial alterar os valores padrão.
Como experiência própria, só procure evitar "explodir" o número de métodos, procure só fazer os métodos mais usados como padrão e usar a versão "expandida" para flexibilidade total.
----
Idioma: Parâmetros Nomeados
Problema: Você tem uma classe que precisa de muitos parâmetros (principalmente opcionais) para ser configurada.
Solução: Para cada parâmetro, crie um método "set" que retorna o próprio objeto, assim, você pode encadear os métodos ("method chaining") em um única chamada.
Reasoning: Criar construtores com muitos parâmetros torna a classe difícil de usar, e forçar um série de métodos "set" repetindo o mesmo objeto torna o código chato de digitar e às vezes pouco óbvio de ser lido.
Exemplo:
(Tirado da biblioteca JDOM)
new Element("book").setAttribute ( "id", "1" ).setText("Java Idioms");
O equivalente sem o idioma seria:
Element element = new Element("book")
element.setAttribute ( "id", "1" )
element.setText("Java Idioms");
Bom, é isso. Nenhuma invenção nova, só catalogando idiomas que vivo esbarrando e acho legais :)