Quinta-feira, Junho 28, 2007

Candidatos a idiomas no Java

Apesar de focar muito em Ruby, é o Java quem paga o pão nosso de cada dia. E apesar de eu ter algumas encrespadas com a linguagem, ela é muito competente no que faz. Um pouco travada, talvez, mas ninguém é perfeito :)

O interessante é que depois de um tempo, vamos pegando alguns "idiomas", ou seja, mini-padrões que vivem se repetindo. Acho que já li esses dois em algum lugar (muito provável), mas como estou usando eles com muita frequência, gostaria de deixá-los registrados:



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 :)

0 comentários: