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