Professional Documents
Culture Documents
Enucomp 2010
Introduo ao Groovy
O Projeto Groovy
Tudo comeou em 29 de Agosto de 2003, com uma publicao no blog de James Strachan, o primeiro artigo sobre o que seria o groovy.
O Projeto Groovy
Segundo James:
Minha idia inicial fazer uma pequena linguagem dinmica, que seja compilada diretamente em classes Java e que tenha toda a produtividade e elegante encontrada em Ruby e Python
O Projeto Groovy
James uniu-se com Bob McWhirter, e juntos, em 2003 fundaram oficialmente o projeto Groovy. Em 2004, fundao do GroovyOne;
Groovy Hoje
Linguagem com asceno mais rpida no indice do Tiobe Index; Do limbo para o 38 lugar entre 200 linguagens em 2 anos e meio de vida;
Alternativas ao Groovy
Existem cerca de 240 linguagens compatveis JVM; Funcionam junto ao cdigo Java ou so compiladas para formar bytecodes; Mais sobre o assunto:
http://www.is-research.de/info/vmlanguages
Alternativas ao Groovy
Groovy ou JRuby
Sintax do Groovy bem similar Java; Possui todas as vantagens do Ruby; Interpolaridade entre Groovy e Java;
Arquivos .groovy compilados tornam-se .class; Se trocar a extenso .java para .groovy funciona exatamente como o tal;
file.java
file.groovy
bytecode
bytecode
Introduo ao Groovy
Linguagem gil e dinmica para java; Muitos recursos foram inspirados em linguagens como Ruby, Python e Smalltalk; Sintaxe simples, enxuta e similar linguagem Java; Interpretada ou Compilada para bytecode; Linguagem de Scripts; Open Source;
Introduo ao Groovy
Totalmente OO;
Meta-Programao;
Instalao
Pr-requisitos:
JDK - http://java.sun.com/javase/downloads GDK - http://groovy.codehaus.org/Download Descompactar os binrios do Groovy - Qualquer diretrio; Variveis de Ambiente
GROOVY_HOME GROOVY_HOME/bin
Definir o PATH:
Instalao no Windows
V em Painel de Controle >> Propriedades do Sistema >> V na aba Avanado, e clique no boto Variveis de Ambiente.
Instalao no Windows
Instalao no Linux
Groovy - Caractersticas
Groovy - Caractersticas
Ponto e vrgula e comando return so opcionais; Mtodos e Classes so public por default, por isso tambm opcional o uso dos modificadores; Pode ser omitido o tipo das variveis, atributos, assim como o tipo de retorno dos mtodos. Parnteses opcionais em chamadas de mtodos com um parmetro.
print "hello" 5.plus 5 //==>hello //==>10
Ferramentas Groovy
>>groovysh
Groovy Shell
------------------------------------------------------------------
groovy:000> print 'Ol, eu sou Groovy! hello, world===> null groovy:000> System.out.println("Ol, sou do Java!"); hello, world===> null
Ferramentas Groovy
>>groovyConsole
Console com interface grfica escrito em Groovy pra executar cdigos instantaneamente.
Ferramentas Groovy
>>groovy
Usado para executar programas e scripts em Groovy; Roda programas em Groovy na forma de arquivos, passando o nome do arquivo.
Ferramentas Groovy
Suporte s IDEs
Eclipse + Groovy
V no site:
http://groovy.codehaus.org/Eclipse+Plugin
Escolha a sua verso do eclipse e pegue a url correspondente; Adicione em Help >> Install New Software Colar a url e fazer o download
Operadores
Aritmticos: +, -, *, /, %, **, ... etc Comparao: >, <, >=,==, !=,<=> etc Atribuio: =, +=, +=, <<, <<=, ... etc. Lgicos: &&, ||, ! etc Ternrio: a == 2 ? Dois : Outro Elvis Operator: ?: Safe Navigation Operator: ?.
Operadores
(<=>)
Operador de comparao que retorna -1, 0 ou 1 se for menor, igual ou maior que seu argumento.
String a; a?:"A varivel a nula" //em Groovy String a; //em Java a != null ? a : "A varivel a nula";
Operadores
Variveis
Atribuio Mltipla:
def (a,b,c) = [2, 4, 6] print a //===> 2
Nmeros
Groovy suporta nmeros de tamanhos imensos. Os nmeros da classe BigInteger se restringem apenas memria e ao processador da mquina.
Nmeros
times(Closure closure)
5.times {print 'k'} //kkkkk
Strings
String um conjunto de caracteres. Strings Groovy so completamente MUTVEIS. Pode ser delimitado por aspas 'simples' ou
"duplas" Pode ocupar uma ou vrias linhas. Pode ser injetada a ela operaes, variveis... Mtodos destrutivos e no destrutivos
Strings
Strings
'String de aspas simples' "Ol, sou uma 'String'!"
Strings
Strings como Arrays s = 'Bem vindos ao Enucomp' s.getAt(1) /* e */ s[1] /* e */ s[0,20] /* Bp */ s[4..9] /* vindos */
Strings
/* kkk */
Strings
....
Strings
Colees
Colees
Colees
Range
Colees
Map
O mesmo que array associativo, dicionrios ou hashes; Cada entrada composta por uma chave e um valor;
def frameworks = [groovy: "Grails", ruby: "Rails"] def map = [a:(1..4), 10:"Dez"] print framework.groovy //===>Grails print map.a //===>1..4 print map[10] //===>Dez
Receber do teclado
Praticando...
1. Imprimir uma String na vertical; 2. Imprimir uma String em formato de escada; 3. Receber uma linguagem, retorna uma framework; 4. Dado um determinado vetor, faa:
Some todos os elementos; Mostre o maior e o meno elemento; Mostre os elementos invertidos; Ordene todos os elementos;
Estruturas de Controle
assert 'Ol' assert 50 assert [2,'a'] assert true assert new Object()
Mtodo assert um mtodo para testes unitrios. Se retornar algo false, gera uma exceo.
Estruturas de Controle
Estruturas de deciso:
If else
If(10 > 5){ print 'Groovy' } else{ print 'Java' }
Operador condicional - ?:
def retorno = (1==1) ? "Iguais" : "Diferentes"
Estruturas de Controle
Switch
switch(ling) { case 'Ruby' case 'Groovy' case 'PHP' default } : : : : println println println println 'Rails' 'Grails' 'Cake' 'Outra' ;break ;break ;break ;break
if(ling.isCase('Ruby')) println 'Rails' else if (ling.isCase('Groovy')) println 'Grails' else if (ling.isCase('PHP')) println'Cake' else 'Outra' //Rails //Rails
Estruturas de Controle
Switch
Estruturas de Controle
while
def list = [1,2,3] while (list) { list.remove(0) } assert list == [] while (list.size() < 3) list << list.size()+1 assert list == [1,2,3]
Estruturas de Controle
for
for (variable in iterable) { body } def store = '' for (String i in 'a'..'c') assert store == 'abc' def j = 0 for (i in 0..10) { j += i } print j //55
store += i
Excees
O tratamento de excees igual ao do Java. A nica diferena em termos de exceo que no Groovy opcional colocar o throws na assinatura do mtodo, tanto para excees checadas quanto em no-checadas;
Excees
def myMethod() { 'string'.toLong() } def log = [] try { myMethod() } catch (Exception e) { log << e.toString() } finally { log << 'finally' } log.each{println it}
Mtodos
Em Groovy, todo mtodo retorna alguma coisa. Quando nenhum valor explicitamente mostrado, ele retorna null. O return opcional
def hello(nome){ println 'Hello, meu nome : ${nome}' } hello('Bruno') ou hello 'Bruno'
Mtodos
Closures
Semelhante a uma classe interna; Podem ser declarados no s dentro das classes No executado quando definido, apenas quando for chamado; Apenas agem como mtodos, mas so objetos normais(groovy.lang.Closure). Para entender melhor esse recurso, acesse: http://groovy.codehaus.org/Closures+-+Formal+Definition
Closures
Pode conter parmetros; Modifica variveis declaradas fora da closure; Invocados pelo mtodo
Se tiver apenas um parmetro, no necessrio defini-lo, basta usar a palavra reservada it para referenci-lo.
Closures
Closure cloj1 = {println 'Hello, World!'} // Sem parmetro def cloj2 = { obj -> println "Hello, $obj!"} // Parmetro sem tipo definido def cloj3 = {println "Hello, $it!"} // Parmetro acessado pela palavra-chave 'it' cloj2.call('Groovy') cloj3.doCall('Groovy') cloj3('Groovy') //===> Hello, Groovy //===> Hello, Groovy //===> Hello, Groovy
Closures
Outros exemplos:
def soma = { a, b -> print "A soma : ${a+b}" } map = ['a':1, 'b':2] map.each{ key, value -> map[key] = value * 2 } print map //[a:2, b:4]
letras = 'a'..'z' letrasUpper=[] letras.collect (letrasUpper){it * 2 } println letras println letrasUpper
Praticando...
Fazer um programinha que receba um nmero, imprima-o o nmero de vezes que o representa de 0 at ele mesmo.
Entrada: 6 Sada: 1 2 2 3 3 4 4 5 5 6 6
3 4 4 5 5 5 6 6 6 6
Orientao Objetos
Classes e Objetos
Classes uma estrutura que abstrai coisas do mundo real para o mundo computacional; Define o tipo dos objetos;
Se classes fossem formas de bolo, os objetos seriam os bolos; Objetos so instancias das classes; Os dados so os atributos; Comportamentos so os mtodos;
Orientao Objetos
Classes e Objetos
Ou do modo brutal...
i = new Integer(25) s = new String('Sou uma String')
Orientao Objetos
Herana:
Classes tem a capacidade de herdar comportamento de outras classes; As classes que provm os comportamentos herdados so chamadas de super-classes;
1.class 1.class.superclass //java.lang.Integer //java.lang.Number
Meta-Programao
MOP Meta-Object Protocol Mgica da programao; Adicionar comportamento s classes em tempo de execuo;
Meta-Programao
Meta Classes
As classes definem o comportamento dos objetos; As meta classes definem o comportamento de certas classes ou de suas instancias;
public interface GroovyObject { Object invokeMethod(String name, Object args); Object getProperty(String property); void setProperty(String property, Object newValue); MetaClass getMetaClass(); void setMetaClass(MetaClass metaClass); }
Meta-Programao
Java Bean
public class HelloWorld { private String nome; public void setNome(String nome) { this.nome = nome; } public String digaHello(){ return "Hello " + nome + "."; } public static void main(String[] args) { HelloWorld hw = new HelloWorld(); hw.setNome("Bruno"); System.out.println(hw.digaHello()); } }
Em Groovy
public class HelloWorld { private String nome; public void setNome(String nome) { this.nome = nome; } public String digaHello(){ return "Hello " + nome + "."; } public static void main(String[] args) { HelloWorld hw = new HelloWorld(); hw.setNome("Bruno"); System.out.println(hw.digaHello()); } }
Groovy Bean
Por defaulf as classes so public; Mtodos modificadores dos atributos so gerados dinamicamente; No necessrio criar um mtodo construtor:
p = new Pessoa(nome:'Bruno')
Groovy Bean
class HelloWorld { String nome String digaHello(){ "Hello, ${nome}." }
Parmetro do construtor
Groovy Bean
class HelloWorld { def nome def digaHello(){ "Hello, $nome" } } print new HelloWorld(nome:"Groovy").digaHello()
Totalmente em Groovy
Closure com parmetro
class HelloWorld { def digaHello = {nome-> "Hello ${nome}"} } print new HelloWorld().digaHello.call("Bruno")
Java vs Groovy
public class HelloWorld { private String nome; public void setNome(String nome) { this.nome = nome; } public String digaHello(){ return "Hello " + nome + "."; } public static void main(String[] args) { HelloWorld hw = new HelloWorld(); hw.setNome("Bruno"); System.out.println(hw.digaHello()); }
Em java: 18 linhas
Em Groovy: 4 linhas
class HelloWorld { def digaHello = {nome-> "Hello ${nome}"} } print new HelloWorld().digaHello.call("Bruno")
Referncias
Em Busca do Grails
Groovy Documentation
Referncias
Um pouco de Groovy