Arquivo da tag: groovy

Groovy Multiple Assignment

Salve Devs!

Sei que não tenho conseguido manter uma frequência nas postagens do SantoGrails, ainda tenho tido um pouco de dificuldade no gerenciamento do meu tempo, mas eu não poderia deixar de escrever algo sobre o que eu acabei de descobrir que o Groovy pode fazer… Estou falando do Multiple Assignment.

droctocat

Definição:

Multiple Assignment é um recurso oferecido por algumas linguagens, que tem o interesse de facilitar a atribuição de vários valores ao mesmo tempo.

Problematizemos então!!

Caso de Uso:
Imagine que você possue um método que retorne uma linha de um arquivo delimitado por “#”, onde por definição o nome é o primeiro valor, o ano de nascimento é o segundo valor e sua cidade de nascimento é o terceiro valor e onde o objetivo é carregar cada um desses valores em suas respectivas variáveis.

def atributos = "Stanley Kubrick#1928#New York".split("#")
String nome = atributos[0]
String ano = atributos[1]
String cidade = atributos[2]
println "Nome: $nome, Nascimento: $ano, Cidade: $cidade"

Se analisarmos rapidamente o código perceberemos que o nosso gargalo produtivo (se é que eu posso chamar desta forma) está na fragmentação da lista em variáveis.

Para isso foi criado o Multiple Assignment. Vejamos como ele pode nos ajudar.

def (nome, ano, cidade) = "Stanley Kubrick#1928#New York".split("#")
println "Nome: $nome, Nascimento: $ano, Cidade: $cidade"

E pronto!

Para finalizar… O Multiple Assignment do Groovy é bem poderoso, mas deixarei esta parte para o próximo post.

 

 

Anúncios
Etiquetado ,

Groovy e o seu selo de NERD!

Você já brincou de [Pedra, Papel e Tesoura]? …

db2e_lizard_spock

Se sua infância foi normal, provavelmente a resposta será sim… No entanto, se você já jogou a sua versão extendida [Pedra, Papel, Tesoura, LAGARTO e SPOCK] não sei se podemos dizer o mesmo!

Para quem não sabe, estamos falando da versão criada por Sam Kass, que ganhou popularidade quando foi apresentado no The Big Bang Theory.

Pois bem, não estamos aqui para falar de seriados e sim de programação, programação com Groovy!
Há um tempo atrás, participei de um dojo de programação onde o problema a ser resolvido foi exatamente esse… Pouco tempo depois, só por curiosidade fui ver como Groovy poderia facilitar ou complicar na resolução deste problema.

Em um primeiro momento decidi programar normalmente (de uma maneira que um ser humano possa ler >> ler código)

def play(play1, play2){
    warning = {i, n -> (i + n) % 5}
    position = plays.indexOf(play1)
    play1 == play2 ? 'draw' : play2 in [plays[warning(position, 1)] , plays[warning(position, 3)]] ? 'play1' : 'play2'
}

Mas não demorou muito tempo para eu tentar incurtar isso, já que o objetivo também era ver maneiras diferentes de resolver o mesmo problema e o resultado foi segundo script:

Como podemos ver abaixo, usando os recursos nerds do Groovy, o mesmo algorítimo está com apenas 88 caracteres! Se é que podemos chamar isso de algorítimo!
p={p1,p2,c={a,b->l[(l.indexOf(a)+b)%5]}->p1==p2?'eq':p2 in [c(p1, 1),c(p1,3)]?'p1':'p2'}
Segue gist completo dos exemplos com seus respectivos testes:

OK OK!! Não é bonito, mas de vez em quando é legal dar uma descontraida!

Se ficou alguma dúvida ou se você sabe como deixar o código menor ainda, é só deixar um comentário.

Etiquetado

Se aventurando no Switch do Groovy

O switch no Java fica sem graça quando comparado com o do Groovy (mesmo quando falamos do switch do Java 7 que já aceita Strings em sua estrutura).

gitfinn

O switch do Groovy suporta diferentes classifiers, ao contrário do Java que apenas suporta String e int com seus derivados. Qualquer um que implemente o método isCase() (seu código fonte) pode ser usado como um classifier. Groovy adicionou o isCase() para as seguintes situações: Class (com o isInstance), Object (com o equals), collections (com o contains) e expressões regulares (com o matches). Se implementarmos o isCase() em nossa classe groovy ela também poderá ser usada como um classifier.

E Finalmente podemos usar uma closure como classifier, lembrando que ela será avaliada como boolean.
Segue exemplo no gist: switch.groovy

 

Veja o exemplo funcionando no Groovy Console: switch.groovy

Gostaria de agradecer o Dev Hubert Klein Ikkink que tem contribuído bastante com a comunidade groovy com seus exemplos no Groovy Goodness.

Fonte original

Etiquetado

Método X Closure: Entendendo as Closures no Groovy – Parte 1

Uma das coisas que mais tem me chamado a atenção no groovy é o seu suporte à closures. Logo passei a utiliza-las no lugar dos métodos, já que a principio a função era a mesma. No entanto me surgiu uma dúvida… Será que eu ganho ou perco desempenho utilizando-as na aplicação?
Iniciei as consultas no google e não tive muito sucesso, em seguida postei minha duvida no grails brasil e pouco depois já tinham várias respostas. Percebi que o conteúdo que estava sendo gerado era muito rico e tive a ideia de compilar todas essas informações em um post de fácil entendimento.
Pois bem, para começar “métodos e closures” podem até trazer o mesmo resultado, mas eles não são a mesma coisa.
Este artigo será dividido em 3 posts, pois o mesmo possui bastante conteúdo.

  1. Entendendo as Closures no Groovy;
  2. Método X Closure;
  3. Teste de desempenho com Closures e Métodos;

Entendendo as Closures no Groovy

Segundo o Livro Groovy in action: closures são importantes, muito importantes, são de longe um dos recursos mais importantes do groovy.

Closure é um bloco de codígo encapsulado em um objeto. Definição tambem do Groovy in action.

Para os que estão acostumados com desenvolvimento java e já teve a oportunidade de escrever uma closure ,deve ter notado que seu fluxo lógico é diferente do tradicional, mas assim que nos acostumamos com o seu estilo de escrita os algoritmos fluem como água.
Um simples exemplo de closure utilizado na documentação do groovy é o seguinte:

def clos = { print “Hello”}
// - clos2: Onde a closure recebera algum valor na sua chamada e imprimirá o mesmo.
def clos2 = {print it}.
clos2(‘Hello’) /*Onde o mesmo imprime Hello*/

Também da documentação do groovy, temos dois exemplos bem interessantes de closures para listas.
Suponha que você precise varrer uma determinada lista e aplicar alguma lógica em cada item antes de inseri-los em outra lista.

Pois bem… Temos basicamente duas formas simples de fazer isso no groovy.
1 – Podemos utilizar o collect aplicando a logica para cada item iterado:

def list = ['a','e','i''o','u']
def newList = []

list.collect( newList ) { it.toUpperCase() }

Definição: Foi criada uma lista com as vogais e uma lista vazia que receberá o maiúsculo de cada vogal.
Neste caso o collect é utilizado para aplicar a logica ao it (variável default no groovy para closures com apenas um parâmetro – neste caso uma outra lista) e inseri-lo na lista passada por parâmetro.
Logo no final teremos a seguinte lista [“A”, “E”, “I”, “O”, “U”]

2 – Digamos que a logica a ser aplicada a cada item é um pouco mais complicada, também podemos encapsula-la em outra closure.

def list = ['a','e','i','o','u']
def newList = []

def closAux = { it.toUpperCase() }
list.collect( newList, closAux)

Definição: Neste caso estamos trabalhando com a mesma lógica, mas aqui podemos aproveitar a segunda closure para encapsular uma lógica mais complexa a ser atribuída a cada atributo da lista iterada.
Aqui, temos uma nova closure criada que atribui uma lógica (no it) para no final retorna-lo.
Logo em seguida podemos chamar o collect passando a nova lista e a closure. Pronto, a logica da closure passada por parâmetro será utilizada para cada item iterado da lista e atribuindo a nova lista.

Por fim. É claro que não paramos por aqui. Closures no groovy pode se transformar em um mundo quando utilizamos a boa e velha lógica de programação em conjunto com os conceitos da linguagem.

Lembrando que este post foi só um esclarecimento de closure para dar continuidade nos próximos posts.

Por: Jonatas Emidio

Etiquetado

Aprendendo Grails

grails-logo
Primeiramente, gostaria deixar claro o porquê de iniciar este blog e o motivo de iniciar nesta jornada grails.

Tudo começou com uma proposta para trabalhar em um projeto que já estava utilizando Grails. Assim que soube da proposta fui dar uma olhada na net mais a fundo sobre este framework que eu já tinha ouvido falar, mas por já utilizar Java em minhas aplicações complexas e python/Django em aplicações rápidas me via bem equipado para qualquer situação. Até que eu notei uma grande semelhança na sintaxe do Grails com Python e Java. Foi quase amor a primeira vista.

Ok… Mas não foi tão simples assim. Como de costume, comecei a pesquisar exemplos práticos da linguagem para ter maior noção se eu me adaptaria com facilidade.

Achei um exemplo simples, mas, completo. Criei um sistema inteiro de cadastro de produtos, incluindo tela, acesso ao banco e todo o CRUD completo com apenas quatro linhas de comando simples e uma pequena alteração na classe de modelo gerada.

Detalhamento do procedimento executado:

1 – comando para a criação do projeto loja: grails create-app loja;

2 – comando para a criação da classe de domínio Produto: grails create-domain-class Produto;

3 – declaração os atributos de produto na classe gerada no diretório (“projeto” /grails-app/domain/ “package”/”classe”): String nome, double valor e Date dataCadastro;

4 – comando para a geração da estrutura lógica inicial do negócio para o domínio Produto, ou seja, (CRUD): grails generate-all loja.Produto;

5 – Pronto, agora é só executar e testar: grails run-app.

Por incrível que pareça o projeto já está pronto e funcional utilizando os templates default do grails e acesso ao HSQLDB para persistência.

app

Print do resultado após a execução da aplicação.

Por fim, esta foi apenas uma descrição de como é simples a criação de um projeto utilizando grails. Lembrando que ao final e gerado o bytecode do projeto, ou seja, o seu sistema terá o mesmo desempenho que os criados em Java. Espero que vocês estejam tão interessados quanto eu fiquei ao finalizar este exemplo, pois os próximos posts serão para a criação do mesmo projeto, porem detalhando cada comando.

Até a próxima.

Por: Jonatas Emidio

Etiquetado , ,