domingo, janeiro 20, 2008

Sim, temos que ler

Assino o InfoQ, recebendo semanalmente cerca de 10 a 15 feeds sobre tecnologias diversas, principalmente nas áreas de processos ágeis, java e linguagens dinâmicas, como Groovy, Ruby e as primas pobres, como o Beanshell.

Claro, eventualmente, alguns lixos aparecem e, mesmo que não exista um botão "Ban" como no LastFM (sim meninos, foi ali que achei as fotos para o livro de Java EE...), o problema se resume em 30 segundos com uma rápida visualizada no abstract do artigo.

Entretanto, alguns feeds parecem bons, e como o tempo é curto, nada mais posso fazer além de marcá-los como featured no Gmail para uma leitura posterior. Porém, como a tendência é acumular as coisas, chega-se o tempo do flush e as coisiboas tem que ser lidas. Então, resumindo (bem) essa pilha de dois meses:

Elvis Operator
Esse é do Groovy, e adorei ele. Não pelo nome (que é engraçado mesmo), mas pela simplicidade e claro, pela performance. Resumindo:

Código Java:

String foo;
//brinca com foo
//...

//retorna o valor de foo

String getFoo() {

return foo;
}
//imprime foo...
void printFoo {
System.out.println( getFoo() != null ? getFoo() : "Foo é Nulo" );
}

Qual o problema? Hum...não sei :) Bem, primeiro, você está quebrando a premissa DRY (Don't Repeat Yourself). Segundo, getFoo() está sendo chamado duas vez. Não apenas performance pode estar envolvida, mas se esse método tiver um comportamento extra (com incrementar um contador, incluir, remover, alterar, etc, etc, etc) além de buscar um mísero valor (...), você está em maus lençóis e teria que usar uma variável auxiliar no código. No mínimo, chato. E, se você fosse ranzinza como eu, teria ainda mais problemas, como falsos hits em analisadores de código (PMD, etc), linhas e linhas de resultado em um Control+Alt+H no Eclipse, etc, etc, etc.

Tá, mas e o Elvis? Ok...

Código Grovy (1.5+):

//não vou repetir o código anterior :)
//imprime foo...
printFoo {
println { getFoo()?:"Foo é Nulo" }
}


Antes que você exclame Que que é isso?!, leia mais sobre o Elvis operator em What's New in Groovy 1.5. Garanto que vai gostar.

Enhanced Loop
Para os amantes do loop otimizado do Java 5, abaixo, a versão grooviana:

//varre o intervalo especificado

for(e in 0..9) println(e)

//e claro, o "e" pode ser qualquer coisa...
def list = ["uma string", 10, 2.2, null, new Person(name:"Marcelo"), this]
for(o in list) println(n)

DSL (Domain Specific Languages)
Pra quem tá por fora, vou resumir: Java é uma linguagem de uso geral, assim como C, Pascal e qualquer outra linguagem de terceira geração que todos nós mortais estamos acostumados (sim, pra variar SQL é tão podre que está no meio do caminho de novo...). Uma DSL é algo (interpretem como algo mesmo) mais próximo do...hum...domínio do problema. Tá, vou dar um exemplo real (em groovy):

"...ah, o somatório das horas no projeto pode ser feito com cálculos baseados em dias, horas, minutos, semanas, work days, non stop days e um monte de variações, suportando ainda intervalos, valores quebrados e combinações entre esses e outros elementos..."

Bom, dá pra notar que o usuário está falando do cálculo de horas em projetos (talvez de TI) e que, se você for programador e quiser implementar isso (hum, em Java) ficaria maluco fazendo classes genéricas, construtores, conversores, adaptadores e uma infinidade de métodos e classes utilitárias de suporte para...calcular as horas do projeto :)

De novo...código groovy:

//sim, funciona...
horasDoProjeto = 3.dia + 2.hora + 12.segundo + 4.workday + 2.nonstopday - 14.diaParado
//e, claro...
custoDoProjeto = horasDoProjeto.hora * 5.dolar


Para detalhes disso, o post do Joe's é uma leitura divertida.

Putz, já são 19:07
Sim, falei só do Groovy, e mesmo assim levei mais de 1h par escrever esse post! Estou ficando lerdo mesmo. Quando der, vou comentar os outros featured itens do meu Gmail...