Upload
lorena-portanova
View
220
Download
4
Embed Size (px)
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/