As linguagens dinâmicas estão ganhando um espaço considerável hoje em dia. Para dar um exemplo do poder dessas linguagens, criei um exemplo simples em Groovy (linguagem Java que roda “em cima” da JVM).
Uma das características dessas linguagens, é poder aproveitar a criatividade do desenvolvedor. Daí temos como exemplo uma função que pode ser definida em nossos objetos chamada methodMissing. Essa função é chamada quando algum método não encontrado é chamado em algum objeto. Caso não seja definida, aí sim temos o comportamento padrão do Java, uma exception apontando a falta do método.
No twitter, o @cmilfont perguntou ao @fabiokung sobre um builder de HTML que ele tinha feito em ruby com o mesmo princípio. Usar o methodMissing. Quando eu vi este builder, fiquei pasmo com a simplicidade e objetividade, e tudo isso originou este post. Coloquei alguns tratamentos que não existiam, para valores de atributos das tags.
O exemplo utiliza o poder da função methodMissing para criar um “Builder”, ou então um construtor de HTML dinâmico com base em pseudo-métodos chamados pelo cliente. Imaginem a função abaixo:
def methodMissing(String name, params) {
if (params[0] instanceof Closure) {
println "< ${name}>"
params[0].call()
println "< / ${name}>"
} else if (params[0] instanceof String) {
println "< ${name}>${params[0]}< ${name}>"
} else if (params[0] instanceof Map) {
print "< ${name}"
params[0].each() {chave, valor ->
print " ${chave}=\"${valor}\""
}
if (params.length > 1) {
if (params[1] instanceof Closure) {
println ">"
params[1].call()
println ""
}
} else println " />"
}
}
No primeiro if, resgatando o parâmetro do tipo closure, apenas faz a chamada a esta closure, para que o novo método seja chamado entre “TAGS” que são o nome do método criado dinâmicamente… Já no caso do parâmetro ser uma String, é encarada como conteúdo inteno da tag e renderizada desta maneira.
Se um map for passado como parâmetro, a interpretação é tida como vários atributos da tag html (método inexistente), e caso ainda tenhamos uma outra closure ali como parâmetro, o comportamento é repetido
Com este exemplo, poderíamos construir um simples HTML com o seguinte trecho de código (script) groovy:
html {
head {
title "teste de titulo"
}
body {
div(id:3, class:"odd") {
p "meu texto"
}
div id:5, class:"xpto"
}
}
Prontinho, a JVM com o trecho acima cria nosso super-mega-ultra-elaborado trecho de HTML:
< html >
< head >
< title >teste de titulo< / title >
< / head >
< body >
< div id="3" class="odd" >
< p >meu texto< / p >< / div >
< div id="5" class="xpto" / >
< / body >
< / html >
Groovy é uma linguagem de script muito bacana e poderosa, e como roda em cima da JVM, não é nada mais que Java puro. Pode com certeza e MUITA eficiência substituir aqueles scripts shell que temos em algumas aplicações, trazendo para os desenvolvedores mais liberdade (de chamar um jar com funcionalidades, por exemplo), e conforto (de não depender de alguém de infra estrutura, ou de conhecimento em shell script).
Fica aí a dica e o exemplo do poder…
Valeu!