Groovy Mateus Maso, Vanoir Zacaron, Vicente Coral, Lucas Just Meller

Preview:

Citation preview

GroovyGroovy

Mateus Maso, Vanoir Zacaron, Vicente Coral, Lucas Just Meller

TópicosTópicos

1) Introdução2) Histórico5) Características da Linguagem6) Groovy Beans6) Groovy vs Java7) Frameworks (Grails, Griffon, Gaelyk)8) Exemplo de aplicação em Grails

Introdução Introdução

• Groovy é uma linguagem ágil e dinâmica que roda sobre a JVM.

• Groovy possui características de Python, Ruby e Smalltalk.

• Groovy utiliza uma sintaxe similar à de Java, é compilada dinamicamente para bytecode Java, e integra-se com outros códigos e bibliotecas Java.

• Assim como Java, Groovy também é Orientada a Objetos,porém também pode-se programar de forma procedural com a mesma.

• Utiliza tipagem dinâmica, forte e duck.

HistóricoHistórico•  A primeira menção ao Groovy foi vista no blog de James

Strachan em Agosto de 2003; • Em 2 de janeiro de 2007 foi publicada a primeira versão

(1.0) do Groovy  •  Em dezembro de 2007 a versão 1.1 Final foi entregue e

imediatamente se constituiu como Groovy 1.5 devido ao grande avanço obtido.

   “Groovy é uma linguagem ágil e dinâmica para a plataforma

Java com muitas características inspiradas em linguagens como Python, Ruby e Smalltalk, disponibilizando-as para os desenvolvedores utlizando uma sintaxe similar à de Java [GROOVY, 2009]”

Características da LinguagemCaracterísticas da Linguagem

• Def (Tipagem dinamica)• Closures• Methods Signature• Collections• Operators, Categories e Mixins

DefDef

O que é tipagem dinâmica?

•Em Groovy também representada por “def”.•Usado para indicar que você não se importa ou não sabe o tipo de variável representado.•Groovy parser não acusa nenhum tipo de erro.•É possivel usar esta expressão tanto para variáveis locais, atributos de uma classe e retorno de método.•Reconhece void como um tipo de retorno vazio.

Regra importante: "def" não é uma representação de "Object”.

Exemplo: DefExemplo: Def

def dynamic = 1 dynamic = "Eu sou uma String guardada num tipo dinamico" int typed = 2 typed = "Eu sou uma String guardada num tipo int estático??" // throws ClassCastException

def name = "Joao"println name.toUpperCase() // nao precisa de castObject name = ”Joao";

Object name = "Maria"System.out.println(((String) name).toUpperCase()); // precisa de cast

ClosuresClosures

O que são Closures?

•"bloco de código" ou um ponteiro para método.•Pedaço de código definido e executado naquele ponto.•Possui algumas propriedades especiais:    - Variáveis implícitas "it",     - Passagem de argumentos    - Consegue usar variáveis livres (fora da closure)    - Parâmetro de método (mandar um “método” para um método)

Exemplo: ClosuresExemplo: Closures

//Closure com variavel implícitadef closure1 = { print it } closure1("olá") //ola

//Closure com argumentodef closure2 = { a, b ->     print a+b } closure2(5, 7) //12

Exemplo: ClosuresExemplo: Closures//Closure como parametro de métododef list = ['a','b','c','d'] def newList = []  def closure3 = { it.toUpperCase() } 

list.collect(newList, closure3)//Equivalente a:list.collect(newList) {       it.toUpperCase() } 

println newList //["A", "B", "C", "D"]

Method SignatureMethod Signature  

Como é invocado métodos? •Parêntesis "()" opcional

•Múltiplos parâmetros (em lista) •Parâmetros com mapeamento •Declaração de throws opcional •Suporta duck typing

Exemplo: Method SignatureExemplo: Method Signatureclass Duck {     String nome

    def quack(... args) {         println "I am a Duck called ${nome} ${args.length}"     } }  class Frog {        String nome

    def quack(... args) {         println "I am a Frog called ${nome} ${args.length}"     } }  

def quackers = [new Duck(nome: "Donald"), new Frog(nome: "Feioso")] 

for (q in quackers) {     q.quack 1, true, "Teste"}

CollectionsCollections

Como são representadas as coleções? 

•Suporte nativo de lists, maps e ranges. •List: [0, true, "Joao", ...] •Map: [”chave": "valor", ...]  •Range: -5..10  ou 'a'..'z'  •each{}, find{}, findAll{}, sort{}, collect{}

Exemplo: CollectionsExemplo: Collections

def list = [5, 6, 7, 8]def map = ["nome":"Mateus", "idade":19]def range = 0..10

list.sort { it } //[5, 6, 7, 8]

map.find { key, value ->     key == "nome" && value == "Mateus"} //nome=Mateus

list.findAll { value -> value > 6 } //[7, 8]

range.each { println it } //conta ate 10

Operadores especiais em Groovy:

•as e in•?.             (null-safe)•*.              (coleção)•?:             (condição)•=˜ e ==˜    (expressão regular)

Categories e Mixin em Groovy:•Agregam funções e atributos para uma classe•Melhor uso em classes JDK e third-party (nao mexer no código)

Operators, Categories e Mixins

interface Estudante {    def estudar()}

class Aluno implements Estudante {    String nome    Integer idade

    def estudar() { println "estudando.." }}

Aluno aluno1 = new Aluno(nome: "Mateus", idade: 19)Aluno aluno2 = new Aluno(nome: "Lucas", idade: 20)Aluno aluno3 = null

Exemplo: Operators, Categories e Mixins

//Operador .?println aluno3.nome //throws NullPointerExceptionprintln aluno3?.nome //ok

//Operador .*def alunos = [aluno1, aluno2]println alunos*.idade.sum() / alunos.size()  //19.5

//Operador inprintln aluno1 in Estudante //trueprintln aluno1 in Object    //true

//Operador asdef estudante = {

estudar: println "estudante nao aluno”} as Estudanteestudante.estudar()

Exemplo: Operators

Exemplo: Categories e MixinsExemplo: Categories e Mixins

@Category(Aluno) class AlunoDorminhoco {         def dormir() { println "zzzzz" }}

@Mixin(AlunoDorminhoco)class Aluno implements Estudante {    [...]}

aluno1.dormir() //zzzzz

Groovy Beans vs Java BeansGroovy Beans vs Java Beans

Qual é a vantagem de usar Groovy Beans?•JavaBeans com sintaxe simplificada•Construtor dinâmico (mapa com valores)•Gera getter e setter sem precisar declarar•Listeners e forma de closures

Exemplo: Groovy BeansExemplo: Groovy Beansclass Customer {         Integer id         String name     

    void setName(String name) {        this.name = "Senhor "+name    }}

Customer customer = new Customer()customer.id = 1234              //setcustomer.name =  "Manolo"       //set

println customer.id             //get = 1234println customer.name           //get = Senhor Manolo

Groovy vs JavaGroovy vs Java

• Condição: objeto null = false, objeto com referencia = true• Finalização com ponto e vírgula opcional• Return opcional• Switch com strings, ranges, etc.• Concatenar por ${} dentro de strings ””• SwingBuilter: simplifica a declaracao, o posicionamento e os

eventos dos elementos Swing (Java)

Caracteristicas do Groovy inexistente Caracteristicas do Groovy inexistente no javano java• Closure.• Sintaxe nativa para listas e mapas.• Interação polifórmica no switch-case.• Tipo dinâmico ou estático são aceitáveis, por isso pode-se

omitir o tipo na hora de declarar métodos ou variáveis.• Pode-se embutir expressões lógicas dentro de um String.• Sintaxe simplificada para escrever beans, com facilidade de

adição e manipulação nas propriedades de eventos listeners.

Frameworks (utilizaçao)Frameworks (utilizaçao)

• Grails: heavyweight web framework (MVC)    http://grails.org/• Griffon: desktop framework (MVC)    http://griffon.codehaus.org/• Gaelyk: lightweight web framework pra Google App Engine    http://gaelyk.appspot.com/

Exemplo aplicação GrailsExemplo aplicação Grails

"Como fazer um Twitter em 5 minutos"

“I can honestly say if someone had shown me the Programming Scala book by Martin Odersky, Lex Spoon & Bill Venners back in 2003 I’d probably have never created Groovy.” –James Strachan.

ReferênciasReferências

http://groovy.codehaus.org/http://groovyconsole.appspot.com/

Recommended