SlideShare uma empresa Scribd logo
Groovy & Grails
Desenvolvimento ágil para
    plataforma Java




       Luís Bruno P. Nascimento
         luisbrunu@gmail.com
Enucomp 2010
●   Groovy e Grails – Parte I




Introdução ao Groovy
O Projeto Groovy
●   Tudo começou em 29 de
    Agosto de 2003, com uma
    publicação no blog de
    James       Strachan,     o
    primeiro artigo sobre o que
    seria o groovy.
O Projeto Groovy

  Segundo James:

“Minha idéia inicial é fazer uma pequena linguagem
dinâmica, 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, fundação do GroovyOne;



●   Mais desenvolvedores se uniram ao projeto

              Entre eles Guillaume Laforge, hoje é o
              gerente oficial do projeto Groovy e líder do
              Expert Group que padroniza Groovy.
Groovy Hoje
●   Linguagem com ascenção mais rápida no
    indice do Tiobe Index;
●   Do limbo para o 38° lugar entre 200 linguagens
    em 2 anos e meio de vida;
    ●   Hoje ocupa a 44° posição;
    ●   http://www.tiobe.com/index.php/content/
        paperinfo/tpci/index.html
    ●   1° lugar entre as linguagens da JVM.
Alternativas ao Groovy
●   Existem cerca de 240 linguagens compatíveis à
    JVM;
●   Funcionam junto ao código Java ou são
    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 extensão .java para .groovy funciona
        exatamente como o tal;
Tratamento com a JVM


file.java                     file.groovy




bytecode                        bytecode



            Máquina Virtual Java
Introdução ao Groovy
●   Linguagem ágil e dinâmica 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;
Introdução ao Groovy
●   Totalmente OO;
    ●   Não há tipos primitivos;
    ●   TUDO é objetos;
        –   O número 1 é um objeto;
        –   1.class >> java.lang.Integer;
    ●


●   Meta-Programação;
    ●   Adicionar funcionalidades em tempo de execução.
        –   Criar um novo comportamento para classe String.
Instalação
●   Pré-requisitos:
    ●   JDK - http://java.sun.com/javase/downloads
●   1° Passo: Download do Groovy:
    ●   GDK - http://groovy.codehaus.org/Download
    ●   Descompactar os binários do Groovy - Qualquer diretório;
●   2° Passo: Definir as variáveis de ambiente e o PATH:
    ●   Variáveis de Ambiente
        –   GROOVY_HOME
    ●   Definir o PATH:
        –   GROOVY_HOME/bin
Instalação no Windows
●   Definir variáveis de ambiente:
    ●   Vá em Painel de Controle >> Propriedades do
        Sistema >> Vá na aba Avançado, e clique no botão
        Variáveis de Ambiente.
        –   Em Variáveis de usuário, crie uma nova com:
             ●   Variável: GROOVY_HOME
             ●   Valor: C:groovy-1.3.4
        –   Em Variáveis do sistema, edite a variável PATH:
             ●   Adicione no final ;C:groovy-1.3.4bin
Instalação no Windows
Instalação no Linux
●   Usando um editor de texto, abra o arquivo
    /etc/environment, e adicione os segintes
    valores:
        –   JAVA_HOME = "/usr/lib/jvm/java-6-sun"
        –   GROOVY_HOME = "/opt/groovy-1.7.5"
    ●   Adicione ao fim da linha PATH:
        –   /usr/lib/jvm/java-6-sun/bin
        –   /opt/groovy-1.7.5/bin
Groovy - Características
●   Alguns Importes já implícitos;
    ●   java.io.*
    ●   java.lang.*
    ●   java.math.BigDecimal
    ●   java.math.BigInteger
    ●   java.net.*
    ●   java.util.*
    ●   groovy.lang.*
    ●   groovy.util.*
Groovy - Características
●   Ponto e vírgula e comando return são opcionais;
●   Métodos e Classes são public por default, por isso
    também é opcional o uso dos modificadores;
●   Pode ser omitido o tipo das variáveis, atributos, assim
    como o tipo de retorno dos métodos.
●   Parênteses opcionais em chamadas de métodos com
    um parâmetro.

    print "hello"                //==>hello
    5.plus 5                     //==>10
    'Bruno'.concat ' Nascimento' //==> Bruno Nascimento
Ferramentas Groovy
>>groovysh
      ●   Groovy shell;
      ●   Executa um código iterativamente.
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
                  gráfica escrito em Groovy pra
                  executar códigos
                  instantaneamente.

                  ● Classes, instancias,
                  methodos soltos, códigos em
                  java...
Ferramentas Groovy
>>groovy
●   Usado para executar programas e scripts em Groovy;
●   Roda programas em Groovy na forma de arquivos,
    passando o nome do arquivo.



//programa.groovy
println "Hello, Bruno!"

groovy:000>groovy programa.groovy
groovy:000>Hello, Bruno!
Ferramentas Groovy
Suporte às IDEs
  –   Netbeans – Groovy e Grails nativo;
  –   Eclipse plug-in
Eclipse + Groovy
●   Vá no site:
    ●   http://groovy.codehaus.org/Eclipse+Plugin
●   Escolha a sua versão do eclipse e pegue a url
    correspondente;
●   Adicione em Help >> Install New Software
●   Colar a url e fazer o download
Operadores
●   Aritméticos: +, -, *, /, %, **, ... etc
●   Comparação: >, <, >=,==, !=,<=> … etc
●   Atribuição: =, +=, +=, <<, <<=, ... etc.
●   Lógicos: &&, ||, ! … etc
●   Ternário: a == 2 ? “Dois” : “Outro”
●   Elvis Operator: ?:
●   Safe Navigation Operator: ?.
Operadores
●   (<=>)
    ●    Operador de comparação que retorna -1, 0 ou 1 se
         for menor, igual ou maior que seu argumento.
●   (?:) - Elvis Operator
        String a;
        a?:"A variável a é nula" //em Groovy

        String a; //em Java
        a != null ? a : "A variável a é nula";

    ●    Se a variável não for nula, retorna ela mesma,
         senão, retorna a String.
Operadores
●   (?.) - Safe Navigation Operator
    ●   Acessa um método ou propriedade se o objeto não
        for nulo.

        obj?.facaAlgo() //em Groovy

         //em Java
         if(obj != null){
            obj.facaAlgo();
         }
Variáveis
●   São objetos das classes das quais foram
    tipadas;
    ●   Podem ser tipadas dinamicamente através da
        palavra def;
          String str = 'String tipada'
          def s = 'String dinâmica'

    ●   Atribuição Múltipla:
          def (a,b,c) = [2, 4, 6]
          print a     //===> 2
Números
●   Em Groovy, os números são tipados através do
    seu tamanho:
    1.class                  //java.lang.Integer
    1.class.superclass       //java.lang.Number

    1000000000.class         //java.lang.Long
    (100**100).class         //java.math.BigInteger

    ●   Groovy suporta números de tamanhos imensos. Os
        números da classe BigInteger se restringem apenas à
        memória e ao processador da máquina.
Números
●   Alguns métodos da classe Number:
    ●   times(Closure closure)
          5.times {print 'k'}
          //kkkkk
    ●   upto(Number to, Closure closure)
          1.upto 5, {print it }
          //12345
    ●   step(Number to, Number stepNumber, Closure c)
          0.step( 10, 2 ) {print it}
          //2,4,6,8,10
Strings
●   String é um conjunto de caracteres.
●   Strings Groovy são completamente
    MUTÁVEIS.
●   Pode ser delimitado por aspas 'simples' ou
    "duplas"
●   Pode ocupar uma ou várias linhas.
●   Pode ser injetada a ela operações, variáveis...
●   Métodos destrutivos e não destrutivos
Strings
●   Strings
        'String de aspas simples'
        "Olá, sou uma 'String'!"
●   GStrings – Groovy Strings
    ●   Strings interpoladas. Permitem adicionar pedaços de
        código dentro delas.
          "1 + 1 = ${1+1}" // 1 + 1 = 2
    ●   Strings com múltiplas linhas.
          """String de
             Multiplas
             linhas"""
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
●   Brincando com os Operadores
    s = 'Bem vindos ao Enucomp'

    s + ' com Groovy'    /*Bem vindos ao Enucomp com
    Groovy*/

    s - 'Enucomp' + 'Groovy'   /*Bem vindos ao Groovy*/

    s = 'k'
    s * 3      /* kkk */
●   Obs.: Os operadores são métodos não-
    destrutivos.
Strings
●   Outros métodos interessantes:

     s = 'hello, Groovy'

     s.capitalize()        /*Hello, Groovy*/
     s.center(15)          /* hello, Groovy */
     s.padLeft(16, '-')    /*---hello, Groovy*/
     s.padRight(16, '-')   /*hello, Groovy---*/
     s.reverse()           /*yvoorG ,olleh*/

     ....
Strings
●   Interpolação de valores em Strings;
    ●   Possível apenas em Strings com aspas duplas.
        def nome = 'João'
        //===>João

        print "Olá, ${nome}, bem vindo ao curso!"
        //===>Olá, João, bem vindo ao curso!'
Coleções
●   List – Coleção de objetos;
    def numeros = [1, 2, 3.5]
    def string = ["1", '2', "3"]
    def tudo = [10, "50", """Hello"""]

    def list = [numeros, string, tudo]


    list.each{println it}

    [1, 2, 3.5]
    [1, 2, 3]
    [1, 2, 3]
Coleções
●   List - Alguns métodos úteis:
    def list = [1,2,3,9,5]
    list.each {print it } //123495
    list.reverse()        //[5,9,3,2,1]
    list.putAt(3,4)       //[1,2,3,4,5]
    list << 6             //[1,2,3,9,5,6]
    list.pop()            //[1,2,3,9,5]

    list + 10          //1,2,3,4,9,5,10
    list - 9           //1,2,3,4,5
Coleções
●   Range
    ●   Representa um intervalo de valores;
         def range = (1..4)

         range.each {print "$it "}
         //1 2 3 4===> 1..4

         ('a'..'c').each {print "$it "}
          //a b c ===> a..c

         for (i in 1..10) {println i}
Coleções
●   Map
    ●    O mesmo que array associativo, dicionários 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
●   Para brincar recebendo valores do usuário em
    Groovy, use isso:
     System.in.withReader {
        print "Digite algo: "
        valor = it.readLine()
        println "Você me disse: ${valor.toUpperCase()}"
     }
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, faça:
  ●   Some todos os elementos;
  ●   Mostre o maior e o meno elemento;
  ●   Mostre os elementos invertidos;
  ●   Ordene todos os elementos;
Estruturas de Controle
●   O que é verdadeiro em Groovy?
    ●   Objetos não-nulos;
    ●   Números diferentes de 0;
    ●   Strings, GStrings, coleções não-vazias;
        assert    !'';                assert 'Olá'
        assert    !0;                 assert 50
        assert    ![];                assert [2,'a']
        assert    !false;            assert true
        assert    !null;             assert new Object()

        –   Método assert é um método para testes unitários. Se
            retornar algo false, gera uma exceção.
Estruturas de Controle
●   Estruturas de decisão:
    ●   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'     :   println   'Rails'    ;break
        case 'Groovy'   :   println   'Grails'   ;break
        case 'PHP'      :   println   'Cake'     ;break
        default         :   println   'Outra'    ;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
    ●   Em Groovy, o switch suporta vários tipos, e não só
        chars.
           switch (10) {
             case 0           : assert   false   ;break
             case 0..9        : assert   false   ;break
             case [8,9,11]    : assert   false   ;break
             case Float       : assert   false   ;break
             case {it%3 == 0} : assert   false   ;break
             case ~/../       : assert   true    ;break
             default          : assert   false   ;break
            }
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')   store += i
     assert store == 'abc'


     def j = 0
     for (i in 0..10) {
       j += i
     }
     print j     //55
Exceções
●   O tratamento de exceções é igual ao do Java.
    A única diferença em termos de exceção é que
    no Groovy é opcional colocar o throws na
    assinatura do método, tanto para exceções
    checadas quanto em não-checadas;
    ●   Com isso, podemos escolher como e quando tratar
        essas exceções.
Exceções

def myMethod() {
   'string'.toLong()
}

def log = []
try {
   myMethod()
} catch (Exception e) {
   log << e.toString()
} finally {
   log << 'finally'
}

log.each{println it}
Métodos
●   Em Groovy, todo método retorna alguma coisa.
    Quando nenhum valor é explicitamente
    mostrado, ele retorna null.
●   O return opcional

    def hello(nome){
      println 'Hello, meu nome é: ${nome}'
    }

    hello('Bruno')   //Hello, meu nome é: Bruno
    ou
    hello 'Bruno'    //Hello, meu nome é: Bruno
Métodos
●   Podemos declarar métodos com parâmetros
    com valores default
     def soma(a,b = 2){ println a + b }
     soma 2      //4
     soma 2,3    //5
●   Métodos com parâmetros opcionais
     int sum(a, Object[] optionals){
       for(o in optionals)
         a+=o
       a
     }
     sum(1) //1
     sum(20, 1, 10, 4) //35
Closures
●   Um bloco de código reutilizável delimitado por chaves.
    ●   Semelhante a uma classe interna;
    ●   Podem ser declarados não só dentro das classes
    ●   Não é executado quando definido, apenas quando for
        chamado;
    ●   Apenas agem como métodos, mas são objetos
        normais(groovy.lang.Closure).
    ●   Para entender melhor esse recurso, acesse:
        http://groovy.codehaus.org/Closures+-+Formal+Definition
Closures
●   Pode conter parâmetros;
●   Modifica variáveis declaradas fora da closure;
●   Invocados pelo método
    ●   call();
    ●   doCall();
    ●   ou simplesmente pela seu nome;
●   Se tiver apenas um parâmetro, não é
    necessário defini-lo, basta usar a palavra
    reservada it para referenciá-lo.
Closures
 Closure cloj1 = {println 'Hello, World!'}
// Sem parâmetro

def cloj2 = { obj -> println "Hello, $obj!"}
// Parâmetro sem tipo definido

def cloj3 = {println "Hello, $it!"}
 // Parâmetro acessado pela palavra-chave 'it'


cloj2.call('Groovy')     //===> Hello, Groovy
cloj3.doCall('Groovy')   //===> Hello, Groovy
cloj3('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        //[a, b, c, d, ...]
      println letrasUpper   //[aa, bb, cc, ...]
Praticando...
●   Fazer um programinha que receba um número,
     imprima-o o número de vezes que o
    representa de 0 até ele mesmo.
      Entrada: 6
      Saída: 1
             2 2
             3 3   3
             4 4   4 4
             5 5   5 5 5
             6 6   6 6 6 6
Orientação à 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 são instancias das classes;
    ●   Objetos possuem dados em comportamentos;
        –   Os dados são os atributos;
        –   Comportamentos são os métodos;
    ●   1, 50, 999 são instancias da classe Integer;
Orientação à Objetos
●   Classes e Objetos
    ●   “Oi”, 'Groovy', '8' são instancias da classe String;
    ●   Instanciando uma classe:
         p = new Pessoa()
    ●   Para os tipos básicos basta fazer isso:
          s = "String"
          i = 50
          array = [10,20,60]

    ●   Ou do modo brutal...
          i = new Integer(25)
          s = new String('Sou uma String')
Orientação à Objetos
●   Herança:
    ●   Classes tem a capacidade de herdar
        comportamento de outras classes;
    ●   As classes que provêm os comportamentos
        herdados são chamadas de super-classes;
         1.class              //java.lang.Integer
         1.class.superclass   //java.lang.Number

    ●   Para herdar de outras classes usa-se o extends
          class Integer extends Number {
             ...
          }
Meta-Programação
●   MOP – Meta-Object Protocol
●   Mágica da programação;
●   Adicionar comportamento às classes em tempo
    de execução;
    ●   Adicionar métodos às classes;
    ●   Adicionar propriedades;
●   Todas as classes escritas em Groovy herdam
    de Object e implementam a interface
    GroovyObject;
Meta-Programação
●   Meta Classes
    ●   As classes definem o comportamento dos objetos;
    ●   As meta classes definem o comportamento de
        certas classes ou de suas instancias;
         –   De certa forma até as classes são objetos...

        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-Programação
●   Adicionando um método à classe String
    String.metaClass.digaOla = { lang ->
      if(lang == 'English') println 'Hello'
      else
      if(lang == 'Swedish') println 'Hej'
    }
    'Chamando o diga Olá por uma String'.digaOla('Swedish')

    class Pessoa{
      String nome, sobrenome
    }
    Pessoa.metaClass.getNomeCompleto = {
       nome + ", " + sobrebome }
    println new Pessoa(nome:'groovy',
       sobrenome : 'Grails').getNomeCompleto()
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 são public;
●   Métodos modificadores dos atributos são
    gerados dinamicamente;
●   Não é necessário criar um método construtor:

       p = new Pessoa(nome:'Bruno')
Groovy Bean
class HelloWorld {           Getters e Setters gerados
                             automaticamente
    String nome

    String digaHello(){              Strings Groovy
       "Hello, ${nome}."             (GString)
    }

    static void main(args) {
       def hw = new HelloWorld(nome:"Groovy")
       print hw.digaHello()
    }
}
                                 Parâmetro do construtor
Groovy Bean
class HelloWorld {                ”Duky Typing”
                                  Tipagem dinâmica
  def nome

  def digaHello(){
     "Hello, $nome"
  }
}
print new HelloWorld(nome:"Groovy").digaHello()


                           ”Script” Groovy solto/livre
Totalmente em Groovy
                                 Closure com parâmetro
class HelloWorld {
  def digaHello = {nome-> "Hello ${nome}"}
}
print new HelloWorld().digaHello.call("Bruno")


           Chamada da Closure
● Em todos esses exemplos têm o mesmo resultado:
>>Hello, Bruno
Java vs Groovy
public class HelloWorld {

    private String nome;                         Em java: 18 linhas
    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: 4 linhas
}


class HelloWorld {
  def digaHello = {nome-> "Hello ${nome}"}
}
print new HelloWorld().digaHello.call("Bruno")
Referências
●   Groovy in Action;
●   Introduction to Groovy and Grails
    ●   Mohamed Seifeddine
●   Getting Started Guide
    ●   http://groovy.codehaus.org/Getting+Started+Guide
●   Em Busca do Grails
    ●   Fernando Anselmo
●   Groovy Documentation
    ●   Oficial docs
●   Básico do Groovy para quem for aprender Grails
    ●   http://www.itexto.net/devkico/?p=231
Referências
●   Um pouco de Groovy
    ●   Artigo Dev-Media – Java Magazine - Marcelo Castellani
●   Slide curso_ruby do ENUCOMP 2008
    ●   Regis Pires Magalhães

Mais conteúdo relacionado

PPTX
DART.pptx
IdrissaDembl
 
PDF
Administration des base de donnees sous oracle 10g
noble Bajoli
 
PDF
NodeJs, une introduction
Toxicode
 
PDF
Formation JPA Avancé / Hibernate gratuite par Ippon 2014
Ippon
 
PDF
Correction examen-java-avancé-1
vangogue
 
PDF
Android Treble: Blessing or Trouble?
Opersys inc.
 
PDF
Cours design pattern m youssfi partie 7 facade bridge flyweight
ENSET, Université Hassan II Casablanca
 
PDF
JAVA, JDBC et liaison base de données
Jean David Olekhnovitch
 
DART.pptx
IdrissaDembl
 
Administration des base de donnees sous oracle 10g
noble Bajoli
 
NodeJs, une introduction
Toxicode
 
Formation JPA Avancé / Hibernate gratuite par Ippon 2014
Ippon
 
Correction examen-java-avancé-1
vangogue
 
Android Treble: Blessing or Trouble?
Opersys inc.
 
Cours design pattern m youssfi partie 7 facade bridge flyweight
ENSET, Université Hassan II Casablanca
 
JAVA, JDBC et liaison base de données
Jean David Olekhnovitch
 

Mais procurados (19)

PPTX
Chromium wayland
Gyuyoung Kim
 
PPTX
Modele mvc
Soulef riahi
 
PDF
Développement informatique : Programmation réseau
ECAM Brussels Engineering School
 
PDF
Inside Android's UI
Opersys inc.
 
PDF
Android is NOT just 'Java on Linux'
Tetsuyuki Kobayashi
 
PDF
Présentation Flutter
Appstud
 
PDF
Support de cours Spring M.youssfi
ENSET, Université Hassan II Casablanca
 
PDF
Applications Android - cours 3 : Android Studio (Outil de développement)
Ahmed-Chawki Chaouche
 
PDF
prof.Calazans(Mat. e suas tecnologias)-Simulado comentado 01
ProfCalazans
 
PDF
IBM Health Center Details
Rohit Kelapure
 
PDF
Programmation sous Android
Olivier Le Goaër
 
ODP
Q4.11: Porting Android to new Platforms
Linaro
 
PPSX
Méthode d'Agile: Scrum
ChaymaMghazli
 
PPTX
Upgrade Ubuntu 18.04 Security with Secureboot
Jonathan MICHEL-VILLAZ
 
PPTX
Student faculty document sharing | SFDS | Ajay Balava
Ajay Balava
 
PDF
Introduction a Flutter
Christian SUMBANG
 
PDF
De 0 à Angular en 1h30! (french)
Laurent Duveau
 
PPTX
Adama Coulibaly.pptx
IdrissaDembl
 
PDF
HTML5 Apps on AGL Platform with the Web Application Manager (Automotive Grade...
Igalia
 
Chromium wayland
Gyuyoung Kim
 
Modele mvc
Soulef riahi
 
Développement informatique : Programmation réseau
ECAM Brussels Engineering School
 
Inside Android's UI
Opersys inc.
 
Android is NOT just 'Java on Linux'
Tetsuyuki Kobayashi
 
Présentation Flutter
Appstud
 
Support de cours Spring M.youssfi
ENSET, Université Hassan II Casablanca
 
Applications Android - cours 3 : Android Studio (Outil de développement)
Ahmed-Chawki Chaouche
 
prof.Calazans(Mat. e suas tecnologias)-Simulado comentado 01
ProfCalazans
 
IBM Health Center Details
Rohit Kelapure
 
Programmation sous Android
Olivier Le Goaër
 
Q4.11: Porting Android to new Platforms
Linaro
 
Méthode d'Agile: Scrum
ChaymaMghazli
 
Upgrade Ubuntu 18.04 Security with Secureboot
Jonathan MICHEL-VILLAZ
 
Student faculty document sharing | SFDS | Ajay Balava
Ajay Balava
 
Introduction a Flutter
Christian SUMBANG
 
De 0 à Angular en 1h30! (french)
Laurent Duveau
 
Adama Coulibaly.pptx
IdrissaDembl
 
HTML5 Apps on AGL Platform with the Web Application Manager (Automotive Grade...
Igalia
 
Anúncio

Destaque (6)

PPT
Groovy for Java Developers
Andres Almiray
 
PDF
An Introduction to Groovy for Java Developers
Kostas Saidis
 
PDF
Arduino e Python: Do It Yourself
Bruno Nascimento
 
PDF
Minicurso groovy grails
Victor Hugo Germano
 
PDF
Cisco ccna modulo 02
Vitor Albuquerque
 
PDF
Groovy for java developers
Puneet Behl
 
Groovy for Java Developers
Andres Almiray
 
An Introduction to Groovy for Java Developers
Kostas Saidis
 
Arduino e Python: Do It Yourself
Bruno Nascimento
 
Minicurso groovy grails
Victor Hugo Germano
 
Cisco ccna modulo 02
Vitor Albuquerque
 
Groovy for java developers
Puneet Behl
 
Anúncio

Semelhante a Curso de Groovy (20)

PDF
Programando em Go
David Robert Camargo de Campos
 
ODP
Overview de Grails: O Java em alta produtividade
Cleórbete Santos
 
PDF
Template method pattern
Eriko Morais
 
PDF
Usando QUnit para testes unitários em JavaScript
Zigotto Tecnologia
 
PDF
Curso de Grails
Bruno Nascimento
 
PDF
Palestra Desenvolvimento Ágil para Web com ROR UVA
Thiago Cifani
 
PDF
Oficina groovy grails - infoway
Lucas Aquiles
 
PDF
Qual linguagem escolher?
COTIC-PROEG (UFPA)
 
PDF
Groovy na plataforma Java
João Lourenço
 
PPT
Groovy: graxa nas engrenagens de Java
Marcos Pereira
 
PDF
Tutorial java script orientado à objeto e jquery
Luan Campos
 
ODP
Groovy
Lucas Aquiles
 
PPT
Utilize Groovy nos seus futuros projetos
marciowferreira
 
PDF
_Aula 1 - Introdução à Linguagem Java.pdf
crashhhcrushhh
 
PDF
Esta começando a programar para a web? Então começe com Rails
ismaelstahelin
 
PDF
Introdução a linguagem Python
Luciano Ramalho
 
KEY
Django e MongoDB - Python Brasil 7
Christiano Anderson
 
PPTX
Programação Orientada a Objetos com Java
Álvaro Farias Pinheiro
 
PDF
Linguagens de Script: Caso de Estudo Lua
Sérgio Souza Costa
 
PDF
Seminário sobre GO
gptavares
 
Overview de Grails: O Java em alta produtividade
Cleórbete Santos
 
Template method pattern
Eriko Morais
 
Usando QUnit para testes unitários em JavaScript
Zigotto Tecnologia
 
Curso de Grails
Bruno Nascimento
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Thiago Cifani
 
Oficina groovy grails - infoway
Lucas Aquiles
 
Qual linguagem escolher?
COTIC-PROEG (UFPA)
 
Groovy na plataforma Java
João Lourenço
 
Groovy: graxa nas engrenagens de Java
Marcos Pereira
 
Tutorial java script orientado à objeto e jquery
Luan Campos
 
Utilize Groovy nos seus futuros projetos
marciowferreira
 
_Aula 1 - Introdução à Linguagem Java.pdf
crashhhcrushhh
 
Esta começando a programar para a web? Então começe com Rails
ismaelstahelin
 
Introdução a linguagem Python
Luciano Ramalho
 
Django e MongoDB - Python Brasil 7
Christiano Anderson
 
Programação Orientada a Objetos com Java
Álvaro Farias Pinheiro
 
Linguagens de Script: Caso de Estudo Lua
Sérgio Souza Costa
 
Seminário sobre GO
gptavares
 

Último (20)

PDF
DIVERSOS SINAIS EM LIBRAS DE ALIMENTOS EM PDF
TatianaGomes93
 
PDF
Dinâmicas do Clima - Geografia física teoria
brunavitoriaos24
 
PPTX
Slides Lição 4, CG, Pedro, A Epístola Da Esperança, 3Tr25.pptx
LuizHenriquedeAlmeid6
 
PPT
AVALIAÇÕES DE SISTEMA DE ENSINO.ppt reformas
SANDRAMENDES689114
 
PPT
PNE BASE NACIONAL, currículo e reformas educacionais
SANDRAMENDES689114
 
DOCX
Planilha Campos de Experiência 2025- Ed. Infantil Trimestral.docx
GesieleBatistadaSilv
 
PPTX
Slides Lição 6, Betel, O Grande “Eu Sou” – Declarações Poderosas de Jesus, 3T...
LuizHenriquedeAlmeid6
 
PPTX
Slides Lição 6, CPAD, Uma Igreja Não Conivente Com A Mentira, 3Tr25.pptx
LuizHenriquedeAlmeid6
 
DOCX
tabela semanal de planejamento escolar de aulas
alessandroomniavinci
 
PPTX
PowerPoint_24_A_defini____o_institucional_de_arte.pptx
16aliceduarte
 
PDF
A História do Insper - Por Lister Ogusuku Ribeiro
Lister Ogusuku Ribeiro
 
PDF
2008_2_4_riçlsdçakfskçfaaçlsdfçchard.pdf
winstonchurchillfu
 
PPTX
Filosofia Ocidental Antiga - IFRN Mossoró
Euza Raquel
 
PDF
Apresentação do nep de todas asAtividades realizada
Luis Santos
 
DOCX
Mapa das Áreas Culturais Indígenas da América Central.docx
Doug Caesar
 
PDF
Morango do amor texto com atividades para trabalhar no Dia do Estudante
Letras Mágicas
 
PPTX
2021_EM_ART_2ªSERIE_SLIDES_ULaaA 01.pptx
AnnaPaulaAires1
 
PPTX
7º ano formação das monarquias nacionais.pptx
taylorjeronimo49
 
PDF
Meu Pai, Razão da Minha História...
Mary Alvarenga
 
PDF
2do. Período - Fase 4 - Aula 1 del GEM CCB
Juan957557
 
DIVERSOS SINAIS EM LIBRAS DE ALIMENTOS EM PDF
TatianaGomes93
 
Dinâmicas do Clima - Geografia física teoria
brunavitoriaos24
 
Slides Lição 4, CG, Pedro, A Epístola Da Esperança, 3Tr25.pptx
LuizHenriquedeAlmeid6
 
AVALIAÇÕES DE SISTEMA DE ENSINO.ppt reformas
SANDRAMENDES689114
 
PNE BASE NACIONAL, currículo e reformas educacionais
SANDRAMENDES689114
 
Planilha Campos de Experiência 2025- Ed. Infantil Trimestral.docx
GesieleBatistadaSilv
 
Slides Lição 6, Betel, O Grande “Eu Sou” – Declarações Poderosas de Jesus, 3T...
LuizHenriquedeAlmeid6
 
Slides Lição 6, CPAD, Uma Igreja Não Conivente Com A Mentira, 3Tr25.pptx
LuizHenriquedeAlmeid6
 
tabela semanal de planejamento escolar de aulas
alessandroomniavinci
 
PowerPoint_24_A_defini____o_institucional_de_arte.pptx
16aliceduarte
 
A História do Insper - Por Lister Ogusuku Ribeiro
Lister Ogusuku Ribeiro
 
2008_2_4_riçlsdçakfskçfaaçlsdfçchard.pdf
winstonchurchillfu
 
Filosofia Ocidental Antiga - IFRN Mossoró
Euza Raquel
 
Apresentação do nep de todas asAtividades realizada
Luis Santos
 
Mapa das Áreas Culturais Indígenas da América Central.docx
Doug Caesar
 
Morango do amor texto com atividades para trabalhar no Dia do Estudante
Letras Mágicas
 
2021_EM_ART_2ªSERIE_SLIDES_ULaaA 01.pptx
AnnaPaulaAires1
 
7º ano formação das monarquias nacionais.pptx
taylorjeronimo49
 
Meu Pai, Razão da Minha História...
Mary Alvarenga
 
2do. Período - Fase 4 - Aula 1 del GEM CCB
Juan957557
 

Curso de Groovy

  • 1. Groovy & Grails Desenvolvimento ágil para plataforma Java Luís Bruno P. Nascimento [email protected]
  • 2. Enucomp 2010 ● Groovy e Grails – Parte I Introdução ao Groovy
  • 3. O Projeto Groovy ● Tudo começou em 29 de Agosto de 2003, com uma publicação no blog de James Strachan, o primeiro artigo sobre o que seria o groovy.
  • 4. O Projeto Groovy Segundo James: “Minha idéia inicial é fazer uma pequena linguagem dinâmica, que seja compilada diretamente em classes Java e que tenha toda a produtividade e elegante encontrada em Ruby e Python”
  • 5. O Projeto Groovy ● James uniu-se com Bob McWhirter, e juntos, em 2003 fundaram oficialmente o projeto Groovy. ● Em 2004, fundação do GroovyOne; ● Mais desenvolvedores se uniram ao projeto Entre eles Guillaume Laforge, hoje é o gerente oficial do projeto Groovy e líder do Expert Group que padroniza Groovy.
  • 6. Groovy Hoje ● Linguagem com ascenção mais rápida no indice do Tiobe Index; ● Do limbo para o 38° lugar entre 200 linguagens em 2 anos e meio de vida; ● Hoje ocupa a 44° posição; ● http://www.tiobe.com/index.php/content/ paperinfo/tpci/index.html ● 1° lugar entre as linguagens da JVM.
  • 7. Alternativas ao Groovy ● Existem cerca de 240 linguagens compatíveis à JVM; ● Funcionam junto ao código Java ou são compiladas para formar bytecodes; ● Mais sobre o assunto: http://www.is-research.de/info/vmlanguages
  • 9. 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 extensão .java para .groovy funciona exatamente como o tal;
  • 10. Tratamento com a JVM file.java file.groovy bytecode bytecode Máquina Virtual Java
  • 11. Introdução ao Groovy ● Linguagem ágil e dinâmica 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;
  • 12. Introdução ao Groovy ● Totalmente OO; ● Não há tipos primitivos; ● TUDO é objetos; – O número 1 é um objeto; – 1.class >> java.lang.Integer; ● ● Meta-Programação; ● Adicionar funcionalidades em tempo de execução. – Criar um novo comportamento para classe String.
  • 13. Instalação ● Pré-requisitos: ● JDK - http://java.sun.com/javase/downloads ● 1° Passo: Download do Groovy: ● GDK - http://groovy.codehaus.org/Download ● Descompactar os binários do Groovy - Qualquer diretório; ● 2° Passo: Definir as variáveis de ambiente e o PATH: ● Variáveis de Ambiente – GROOVY_HOME ● Definir o PATH: – GROOVY_HOME/bin
  • 14. Instalação no Windows ● Definir variáveis de ambiente: ● Vá em Painel de Controle >> Propriedades do Sistema >> Vá na aba Avançado, e clique no botão Variáveis de Ambiente. – Em Variáveis de usuário, crie uma nova com: ● Variável: GROOVY_HOME ● Valor: C:groovy-1.3.4 – Em Variáveis do sistema, edite a variável PATH: ● Adicione no final ;C:groovy-1.3.4bin
  • 16. Instalação no Linux ● Usando um editor de texto, abra o arquivo /etc/environment, e adicione os segintes valores: – JAVA_HOME = "/usr/lib/jvm/java-6-sun" – GROOVY_HOME = "/opt/groovy-1.7.5" ● Adicione ao fim da linha PATH: – /usr/lib/jvm/java-6-sun/bin – /opt/groovy-1.7.5/bin
  • 17. Groovy - Características ● Alguns Importes já implícitos; ● java.io.* ● java.lang.* ● java.math.BigDecimal ● java.math.BigInteger ● java.net.* ● java.util.* ● groovy.lang.* ● groovy.util.*
  • 18. Groovy - Características ● Ponto e vírgula e comando return são opcionais; ● Métodos e Classes são public por default, por isso também é opcional o uso dos modificadores; ● Pode ser omitido o tipo das variáveis, atributos, assim como o tipo de retorno dos métodos. ● Parênteses opcionais em chamadas de métodos com um parâmetro. print "hello" //==>hello 5.plus 5 //==>10 'Bruno'.concat ' Nascimento' //==> Bruno Nascimento
  • 19. Ferramentas Groovy >>groovysh ● Groovy shell; ● Executa um código iterativamente. Groovy Shell ------------------------------------------------------------------ groovy:000> print 'Olá, eu sou Groovy!’ hello, world===> null groovy:000> System.out.println("Olá, sou do Java!"); hello, world===> null
  • 20. Ferramentas Groovy >>groovyConsole ● Console com interface gráfica escrito em Groovy pra executar códigos instantaneamente. ● Classes, instancias, methodos soltos, códigos em java...
  • 21. Ferramentas Groovy >>groovy ● Usado para executar programas e scripts em Groovy; ● Roda programas em Groovy na forma de arquivos, passando o nome do arquivo. //programa.groovy println "Hello, Bruno!" groovy:000>groovy programa.groovy groovy:000>Hello, Bruno!
  • 22. Ferramentas Groovy Suporte às IDEs – Netbeans – Groovy e Grails nativo; – Eclipse plug-in
  • 23. Eclipse + Groovy ● Vá no site: ● http://groovy.codehaus.org/Eclipse+Plugin ● Escolha a sua versão do eclipse e pegue a url correspondente; ● Adicione em Help >> Install New Software ● Colar a url e fazer o download
  • 24. Operadores ● Aritméticos: +, -, *, /, %, **, ... etc ● Comparação: >, <, >=,==, !=,<=> … etc ● Atribuição: =, +=, +=, <<, <<=, ... etc. ● Lógicos: &&, ||, ! … etc ● Ternário: a == 2 ? “Dois” : “Outro” ● Elvis Operator: ?: ● Safe Navigation Operator: ?.
  • 25. Operadores ● (<=>) ● Operador de comparação que retorna -1, 0 ou 1 se for menor, igual ou maior que seu argumento. ● (?:) - Elvis Operator String a; a?:"A variável a é nula" //em Groovy String a; //em Java a != null ? a : "A variável a é nula"; ● Se a variável não for nula, retorna ela mesma, senão, retorna a String.
  • 26. Operadores ● (?.) - Safe Navigation Operator ● Acessa um método ou propriedade se o objeto não for nulo. obj?.facaAlgo() //em Groovy //em Java if(obj != null){ obj.facaAlgo(); }
  • 27. Variáveis ● São objetos das classes das quais foram tipadas; ● Podem ser tipadas dinamicamente através da palavra def; String str = 'String tipada' def s = 'String dinâmica' ● Atribuição Múltipla: def (a,b,c) = [2, 4, 6] print a //===> 2
  • 28. Números ● Em Groovy, os números são tipados através do seu tamanho: 1.class //java.lang.Integer 1.class.superclass //java.lang.Number 1000000000.class //java.lang.Long (100**100).class //java.math.BigInteger ● Groovy suporta números de tamanhos imensos. Os números da classe BigInteger se restringem apenas à memória e ao processador da máquina.
  • 29. Números ● Alguns métodos da classe Number: ● times(Closure closure) 5.times {print 'k'} //kkkkk ● upto(Number to, Closure closure) 1.upto 5, {print it } //12345 ● step(Number to, Number stepNumber, Closure c) 0.step( 10, 2 ) {print it} //2,4,6,8,10
  • 30. Strings ● String é um conjunto de caracteres. ● Strings Groovy são completamente MUTÁVEIS. ● Pode ser delimitado por aspas 'simples' ou "duplas" ● Pode ocupar uma ou várias linhas. ● Pode ser injetada a ela operações, variáveis... ● Métodos destrutivos e não destrutivos
  • 31. Strings ● Strings 'String de aspas simples' "Olá, sou uma 'String'!" ● GStrings – Groovy Strings ● Strings interpoladas. Permitem adicionar pedaços de código dentro delas. "1 + 1 = ${1+1}" // 1 + 1 = 2 ● Strings com múltiplas linhas. """String de Multiplas linhas"""
  • 32. Strings ● Strings como Arrays s = 'Bem vindos ao Enucomp' s.getAt(1) /* e */ s[1] /* e */ s[0,20] /* Bp */ s[4..9] /* vindos */
  • 33. Strings ● Brincando com os Operadores s = 'Bem vindos ao Enucomp' s + ' com Groovy' /*Bem vindos ao Enucomp com Groovy*/ s - 'Enucomp' + 'Groovy' /*Bem vindos ao Groovy*/ s = 'k' s * 3 /* kkk */ ● Obs.: Os operadores são métodos não- destrutivos.
  • 34. Strings ● Outros métodos interessantes: s = 'hello, Groovy' s.capitalize() /*Hello, Groovy*/ s.center(15) /* hello, Groovy */ s.padLeft(16, '-') /*---hello, Groovy*/ s.padRight(16, '-') /*hello, Groovy---*/ s.reverse() /*yvoorG ,olleh*/ ....
  • 35. Strings ● Interpolação de valores em Strings; ● Possível apenas em Strings com aspas duplas. def nome = 'João' //===>João print "Olá, ${nome}, bem vindo ao curso!" //===>Olá, João, bem vindo ao curso!'
  • 36. Coleções ● List – Coleção de objetos; def numeros = [1, 2, 3.5] def string = ["1", '2', "3"] def tudo = [10, "50", """Hello"""] def list = [numeros, string, tudo] list.each{println it} [1, 2, 3.5] [1, 2, 3] [1, 2, 3]
  • 37. Coleções ● List - Alguns métodos úteis: def list = [1,2,3,9,5] list.each {print it } //123495 list.reverse() //[5,9,3,2,1] list.putAt(3,4) //[1,2,3,4,5] list << 6 //[1,2,3,9,5,6] list.pop() //[1,2,3,9,5] list + 10 //1,2,3,4,9,5,10 list - 9 //1,2,3,4,5
  • 38. Coleções ● Range ● Representa um intervalo de valores; def range = (1..4) range.each {print "$it "} //1 2 3 4===> 1..4 ('a'..'c').each {print "$it "} //a b c ===> a..c for (i in 1..10) {println i}
  • 39. Coleções ● Map ● O mesmo que array associativo, dicionários 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
  • 40. Receber do teclado ● Para brincar recebendo valores do usuário em Groovy, use isso: System.in.withReader { print "Digite algo: " valor = it.readLine() println "Você me disse: ${valor.toUpperCase()}" }
  • 41. 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, faça: ● Some todos os elementos; ● Mostre o maior e o meno elemento; ● Mostre os elementos invertidos; ● Ordene todos os elementos;
  • 42. Estruturas de Controle ● O que é verdadeiro em Groovy? ● Objetos não-nulos; ● Números diferentes de 0; ● Strings, GStrings, coleções não-vazias; assert !''; assert 'Olá' assert !0; assert 50 assert ![]; assert [2,'a'] assert !false; assert true assert !null; assert new Object() – Método assert é um método para testes unitários. Se retornar algo false, gera uma exceção.
  • 43. Estruturas de Controle ● Estruturas de decisão: ● If else If(10 > 5){ print 'Groovy' } else{ print 'Java' } ● Operador condicional - ?: def retorno = (1==1) ? "Iguais" : "Diferentes"
  • 44. Estruturas de Controle ● Switch switch(ling) { case 'Ruby' : println 'Rails' ;break case 'Groovy' : println 'Grails' ;break case 'PHP' : println 'Cake' ;break default : println 'Outra' ;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
  • 45. Estruturas de Controle ● Switch ● Em Groovy, o switch suporta vários tipos, e não só chars. switch (10) { case 0 : assert false ;break case 0..9 : assert false ;break case [8,9,11] : assert false ;break case Float : assert false ;break case {it%3 == 0} : assert false ;break case ~/../ : assert true ;break default : assert false ;break }
  • 46. 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]
  • 47. Estruturas de Controle ● for for (variable in iterable) { body } def store = '' for (String i in 'a'..'c') store += i assert store == 'abc' def j = 0 for (i in 0..10) { j += i } print j //55
  • 48. Exceções ● O tratamento de exceções é igual ao do Java. A única diferença em termos de exceção é que no Groovy é opcional colocar o throws na assinatura do método, tanto para exceções checadas quanto em não-checadas; ● Com isso, podemos escolher como e quando tratar essas exceções.
  • 49. Exceções def myMethod() { 'string'.toLong() } def log = [] try { myMethod() } catch (Exception e) { log << e.toString() } finally { log << 'finally' } log.each{println it}
  • 50. Métodos ● Em Groovy, todo método retorna alguma coisa. Quando nenhum valor é explicitamente mostrado, ele retorna null. ● O return opcional def hello(nome){ println 'Hello, meu nome é: ${nome}' } hello('Bruno') //Hello, meu nome é: Bruno ou hello 'Bruno' //Hello, meu nome é: Bruno
  • 51. Métodos ● Podemos declarar métodos com parâmetros com valores default def soma(a,b = 2){ println a + b } soma 2 //4 soma 2,3 //5 ● Métodos com parâmetros opcionais int sum(a, Object[] optionals){ for(o in optionals) a+=o a } sum(1) //1 sum(20, 1, 10, 4) //35
  • 52. Closures ● Um bloco de código reutilizável delimitado por chaves. ● Semelhante a uma classe interna; ● Podem ser declarados não só dentro das classes ● Não é executado quando definido, apenas quando for chamado; ● Apenas agem como métodos, mas são objetos normais(groovy.lang.Closure). ● Para entender melhor esse recurso, acesse: http://groovy.codehaus.org/Closures+-+Formal+Definition
  • 53. Closures ● Pode conter parâmetros; ● Modifica variáveis declaradas fora da closure; ● Invocados pelo método ● call(); ● doCall(); ● ou simplesmente pela seu nome; ● Se tiver apenas um parâmetro, não é necessário defini-lo, basta usar a palavra reservada it para referenciá-lo.
  • 54. Closures Closure cloj1 = {println 'Hello, World!'} // Sem parâmetro def cloj2 = { obj -> println "Hello, $obj!"} // Parâmetro sem tipo definido def cloj3 = {println "Hello, $it!"} // Parâmetro acessado pela palavra-chave 'it' cloj2.call('Groovy') //===> Hello, Groovy cloj3.doCall('Groovy') //===> Hello, Groovy cloj3('Groovy') //===> Hello, Groovy
  • 55. 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 //[a, b, c, d, ...] println letrasUpper //[aa, bb, cc, ...]
  • 56. Praticando... ● Fazer um programinha que receba um número, imprima-o o número de vezes que o representa de 0 até ele mesmo. Entrada: 6 Saída: 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 6 6 6 6 6 6
  • 57. Orientação à 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 são instancias das classes; ● Objetos possuem dados em comportamentos; – Os dados são os atributos; – Comportamentos são os métodos; ● 1, 50, 999 são instancias da classe Integer;
  • 58. Orientação à Objetos ● Classes e Objetos ● “Oi”, 'Groovy', '8' são instancias da classe String; ● Instanciando uma classe: p = new Pessoa() ● Para os tipos básicos basta fazer isso: s = "String" i = 50 array = [10,20,60] ● Ou do modo brutal... i = new Integer(25) s = new String('Sou uma String')
  • 59. Orientação à Objetos ● Herança: ● Classes tem a capacidade de herdar comportamento de outras classes; ● As classes que provêm os comportamentos herdados são chamadas de super-classes; 1.class //java.lang.Integer 1.class.superclass //java.lang.Number ● Para herdar de outras classes usa-se o extends class Integer extends Number { ... }
  • 60. Meta-Programação ● MOP – Meta-Object Protocol ● Mágica da programação; ● Adicionar comportamento às classes em tempo de execução; ● Adicionar métodos às classes; ● Adicionar propriedades; ● Todas as classes escritas em Groovy herdam de Object e implementam a interface GroovyObject;
  • 61. Meta-Programação ● Meta Classes ● As classes definem o comportamento dos objetos; ● As meta classes definem o comportamento de certas classes ou de suas instancias; – De certa forma até as classes são objetos... 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); }
  • 62. Meta-Programação ● Adicionando um método à classe String String.metaClass.digaOla = { lang -> if(lang == 'English') println 'Hello' else if(lang == 'Swedish') println 'Hej' } 'Chamando o diga Olá por uma String'.digaOla('Swedish') class Pessoa{ String nome, sobrenome } Pessoa.metaClass.getNomeCompleto = { nome + ", " + sobrebome } println new Pessoa(nome:'groovy', sobrenome : 'Grails').getNomeCompleto()
  • 63. 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()); } }
  • 64. 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()); } }
  • 65. Groovy Bean ● Por defaulf as classes são public; ● Métodos modificadores dos atributos são gerados dinamicamente; ● Não é necessário criar um método construtor: p = new Pessoa(nome:'Bruno')
  • 66. Groovy Bean class HelloWorld { Getters e Setters gerados automaticamente String nome String digaHello(){ Strings Groovy "Hello, ${nome}." (GString) } static void main(args) { def hw = new HelloWorld(nome:"Groovy") print hw.digaHello() } } Parâmetro do construtor
  • 67. Groovy Bean class HelloWorld { ”Duky Typing” Tipagem dinâmica def nome def digaHello(){ "Hello, $nome" } } print new HelloWorld(nome:"Groovy").digaHello() ”Script” Groovy solto/livre
  • 68. Totalmente em Groovy Closure com parâmetro class HelloWorld { def digaHello = {nome-> "Hello ${nome}"} } print new HelloWorld().digaHello.call("Bruno") Chamada da Closure ● Em todos esses exemplos têm o mesmo resultado: >>Hello, Bruno
  • 69. Java vs Groovy public class HelloWorld { private String nome; Em java: 18 linhas 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: 4 linhas } class HelloWorld { def digaHello = {nome-> "Hello ${nome}"} } print new HelloWorld().digaHello.call("Bruno")
  • 70. Referências ● Groovy in Action; ● Introduction to Groovy and Grails ● Mohamed Seifeddine ● Getting Started Guide ● http://groovy.codehaus.org/Getting+Started+Guide ● Em Busca do Grails ● Fernando Anselmo ● Groovy Documentation ● Oficial docs ● Básico do Groovy para quem for aprender Grails ● http://www.itexto.net/devkico/?p=231
  • 71. Referências ● Um pouco de Groovy ● Artigo Dev-Media – Java Magazine - Marcelo Castellani ● Slide curso_ruby do ENUCOMP 2008 ● Regis Pires Magalhães