segunda-feira, 18 de janeiro de 2010
Uninstall de plugins no grails
Para se instalar um plugin é muito fácil, você simplesmente roda o comando grails install-plugin *nome do plugin*.
Mas e para remover o plugin?
Não temos um comando grails uninstall-plugin.
Mas não há motivo para revolta, remover um plugin é bem simples.
Antes de instalar um plugin conheça o seu arquivo application.properties, nele são listados todos os plugins que você vier a instalar.
Quando um plugin é instalado lá ele é listado assim como os plugins que são dependências dele.
Para remover um plugin não mais utilizado no seu projeto simplesmente delete a linha com o mesmo nesse arquivo, ao rodar o build do seu projeto o console irá perguntar se você quer remover o plugin.
Pronto =)
Espero ter ajudado alguém com essa dica.
See you and Let's Code Better people.
quarta-feira, 16 de setembro de 2009
Decorando objetos em Scala
No desenvolvimento de software sempre existem características que são ortogonais ao sistema.
Para remover a duplicação de código que tais características causam podemos utilizar interceptors, aspectos, proxies, etc para com isso decorarmos o nosso objeto com a funcionalidade que queremos.
A solução fica legal, mas a quantidade de código que precisa ser gerada às vezes poderia desencorajar a implementação pois a duplicação de código seria trocada em alguns casos por muito código.
Entretanto se você resolver desenvolver seu sistema em Scala uma solução muito mais simples poderá ser implementada.
Com a utilização de traits, você pode adicionar novas características a objetos com muita facilidade e pouco código.
Por exemplo, suponhamos que você queira realizar um profile de alguns objetos no seu sistema.
O seguinte código resolveria tal problema:
//classe que já possuo class T{ def f = print("Ola enfermeira!") } //trait que adiciona comportamento a interface de T trait Profile extends T{ abstract override def f = { val time = System.nanoTime() super.f println("Tempo total em nanos: " + (System.nanoTime() - time)) } }
Ao rodar o seguinte código:
val t = new T with Profile t.f
Obtemos o seguinte resultado: Ola enfermeira!Tempo total em nanos: 214972
O que acontece é que utilizando a palava with na declaração da variável eu estou dizendo ao compilador do scala que ele deve adicionar as caracteristicas na minha Trait Profile ao objeto.
Sim, isso é um tipo de herança
Logo quando eu chamo o método f, a implementação que é chamada é a da Trait e não do objeto T.
Nesse ponto um detalhe que precisamos notar é como o scala trata o super.
Quando chamamos o super dentro da implementação de f em T o método f chamado será o da implementação que está imediatamente a esquerda da definição da trait.
Ou seja, o seguinte código pode ser feito:
trait Smile extends T{ abstract override def f = { print("=)") super.f } } val t = new T with Profile with Smile t.f
Tendo como output: =)Ola enfermeira!Tempo total em nanos: 27238
A implementação que está mais a direita (no caso Smile) foi invocada.
Ao chamar super a implementação exatamente a esquerda foi chamada (Profile).No próximo super a implementação de T foi chamada.
Com tal forma de encadeamento seus objetos podem ser decorados de inúmeras formas.
Tem alguma idéia melhor de como criar tais características?
Coloque nas revisões desse post =)
quinta-feira, 10 de setembro de 2009
Eliminando ifs encadeados com scala.
Estava lendo o seguinte post do meu amigo eliezer sobre eliminar if encadeados e pensei: Como seria um código para resolver esse problema em Scala.
Utilizando firstClass functions e placehoder syntax criei o seguinte código:
object StringUtils { def format( action: String => String, value: String ) = action(value) def removeBlanks = { (_:String).replaceAll( " ", "") } def onlyNumbers = { (_:String).replaceAll( "\\D", "" ) } }
Dá pra ver que o código fica bem mais enxuto e a responsabilidade fica toda dentro do objeto singleton StringUtils. O código cliente fica bem interessante também:
StringUtils.format( StringUtils.removeBlanks, "Ola enfermeira" )
O código retorna Olaenfermeira
Legal né =)
Se você tem alguma idéia melhor por favor compartilhe ela aí embaixo.