SlideShare a Scribd company logo
1 of 71
Download to read offline
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

More Related Content

What's hot

The Path Towards Spring Boot Native Applications
The Path Towards Spring Boot Native ApplicationsThe Path Towards Spring Boot Native Applications
The Path Towards Spring Boot Native ApplicationsVMware Tanzu
 
FOSDEM 2017: GitLab CI
FOSDEM 2017:  GitLab CIFOSDEM 2017:  GitLab CI
FOSDEM 2017: GitLab CIOlinData
 
Introduction to GitHub Actions
Introduction to GitHub ActionsIntroduction to GitHub Actions
Introduction to GitHub ActionsKnoldus Inc.
 
Cultura DevOps e integração entre infra e devel
Cultura DevOps e integração entre infra e develCultura DevOps e integração entre infra e devel
Cultura DevOps e integração entre infra e develJose Augusto Carvalho
 
Principles and Practices in Continuous Deployment at Etsy
Principles and Practices in Continuous Deployment at EtsyPrinciples and Practices in Continuous Deployment at Etsy
Principles and Practices in Continuous Deployment at EtsyMike Brittain
 
Container based CI/CD on GitHub Actions
Container based CI/CD on GitHub ActionsContainer based CI/CD on GitHub Actions
Container based CI/CD on GitHub ActionsCasey Lee
 
Apresentação Docker
Apresentação DockerApresentação Docker
Apresentação DockerAndré Justi
 
PharoJS: Hijack the JavaScript Ecosystem
PharoJS: Hijack the JavaScript EcosystemPharoJS: Hijack the JavaScript Ecosystem
PharoJS: Hijack the JavaScript EcosystemESUG
 
containerd the universal container runtime
containerd the universal container runtimecontainerd the universal container runtime
containerd the universal container runtimeDocker, Inc.
 
DevOps with GitHub Actions
DevOps with GitHub ActionsDevOps with GitHub Actions
DevOps with GitHub ActionsNilesh Gule
 
DDD Tactical Design with Clean Architecture - Ivan Paulovich
DDD Tactical Design with Clean Architecture - Ivan PaulovichDDD Tactical Design with Clean Architecture - Ivan Paulovich
DDD Tactical Design with Clean Architecture - Ivan PaulovichIvan Paulovich
 
Introduction to GitHub Actions
Introduction to GitHub ActionsIntroduction to GitHub Actions
Introduction to GitHub ActionsBo-Yi Wu
 
Introdução a Containers Docker
Introdução a Containers DockerIntrodução a Containers Docker
Introdução a Containers DockerMatheus Fidelis
 
Intro to Github Actions @likecoin
Intro to Github Actions @likecoinIntro to Github Actions @likecoin
Intro to Github Actions @likecoinWilliam Chong
 
Git and GitHub workflows
Git and GitHub workflowsGit and GitHub workflows
Git and GitHub workflowsArthur Shvetsov
 

What's hot (20)

The Path Towards Spring Boot Native Applications
The Path Towards Spring Boot Native ApplicationsThe Path Towards Spring Boot Native Applications
The Path Towards Spring Boot Native Applications
 
POO - 17 - Interfaces
POO - 17 - InterfacesPOO - 17 - Interfaces
POO - 17 - Interfaces
 
FOSDEM 2017: GitLab CI
FOSDEM 2017:  GitLab CIFOSDEM 2017:  GitLab CI
FOSDEM 2017: GitLab CI
 
Introduction to GitHub Actions
Introduction to GitHub ActionsIntroduction to GitHub Actions
Introduction to GitHub Actions
 
Cultura DevOps e integração entre infra e devel
Cultura DevOps e integração entre infra e develCultura DevOps e integração entre infra e devel
Cultura DevOps e integração entre infra e devel
 
Principles and Practices in Continuous Deployment at Etsy
Principles and Practices in Continuous Deployment at EtsyPrinciples and Practices in Continuous Deployment at Etsy
Principles and Practices in Continuous Deployment at Etsy
 
Container based CI/CD on GitHub Actions
Container based CI/CD on GitHub ActionsContainer based CI/CD on GitHub Actions
Container based CI/CD on GitHub Actions
 
Apresentação Docker
Apresentação DockerApresentação Docker
Apresentação Docker
 
PharoJS: Hijack the JavaScript Ecosystem
PharoJS: Hijack the JavaScript EcosystemPharoJS: Hijack the JavaScript Ecosystem
PharoJS: Hijack the JavaScript Ecosystem
 
containerd the universal container runtime
containerd the universal container runtimecontainerd the universal container runtime
containerd the universal container runtime
 
CI CD Basics
CI CD BasicsCI CD Basics
CI CD Basics
 
Git Init (Introduction to Git)
Git Init (Introduction to Git)Git Init (Introduction to Git)
Git Init (Introduction to Git)
 
DevOps & SRE at Google Scale
DevOps & SRE at Google ScaleDevOps & SRE at Google Scale
DevOps & SRE at Google Scale
 
DevOps with GitHub Actions
DevOps with GitHub ActionsDevOps with GitHub Actions
DevOps with GitHub Actions
 
DDD Tactical Design with Clean Architecture - Ivan Paulovich
DDD Tactical Design with Clean Architecture - Ivan PaulovichDDD Tactical Design with Clean Architecture - Ivan Paulovich
DDD Tactical Design with Clean Architecture - Ivan Paulovich
 
Introduction to GitHub Actions
Introduction to GitHub ActionsIntroduction to GitHub Actions
Introduction to GitHub Actions
 
Introdução a Containers Docker
Introdução a Containers DockerIntrodução a Containers Docker
Introdução a Containers Docker
 
Intro to Github Actions @likecoin
Intro to Github Actions @likecoinIntro to Github Actions @likecoin
Intro to Github Actions @likecoin
 
Git tutorial
Git tutorialGit tutorial
Git tutorial
 
Git and GitHub workflows
Git and GitHub workflowsGit and GitHub workflows
Git and GitHub workflows
 

Viewers also liked

Groovy for Java Developers
Groovy for Java DevelopersGroovy for Java Developers
Groovy for Java DevelopersAndres Almiray
 
An Introduction to Groovy for Java Developers
An Introduction to Groovy for Java DevelopersAn Introduction to Groovy for Java Developers
An Introduction to Groovy for Java DevelopersKostas Saidis
 
Arduino e Python: Do It Yourself
Arduino e Python: Do It YourselfArduino e Python: Do It Yourself
Arduino e Python: Do It YourselfBruno Nascimento
 
Groovy for java developers
Groovy for java developersGroovy for java developers
Groovy for java developersPuneet Behl
 

Viewers also liked (6)

Groovy for Java Developers
Groovy for Java DevelopersGroovy for Java Developers
Groovy for Java Developers
 
An Introduction to Groovy for Java Developers
An Introduction to Groovy for Java DevelopersAn Introduction to Groovy for Java Developers
An Introduction to Groovy for Java Developers
 
Arduino e Python: Do It Yourself
Arduino e Python: Do It YourselfArduino e Python: Do It Yourself
Arduino e Python: Do It Yourself
 
Minicurso groovy grails
Minicurso groovy grailsMinicurso groovy grails
Minicurso groovy grails
 
Cisco ccna modulo 02
Cisco ccna modulo 02Cisco ccna modulo 02
Cisco ccna modulo 02
 
Groovy for java developers
Groovy for java developersGroovy for java developers
Groovy for java developers
 

Similar to Curso de Groovy

Overview de Grails: O Java em alta produtividade
Overview de Grails: O Java em alta produtividadeOverview de Grails: O Java em alta produtividade
Overview de Grails: O Java em alta produtividadeCleórbete Santos
 
Template method pattern
Template method patternTemplate method pattern
Template method patternEriko Morais
 
Usando QUnit para testes unitários em JavaScript
Usando QUnit para testes unitários em JavaScriptUsando QUnit para testes unitários em JavaScript
Usando QUnit para testes unitários em JavaScriptZigotto Tecnologia
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAThiago Cifani
 
Oficina groovy grails - infoway
Oficina  groovy grails - infowayOficina  groovy grails - infoway
Oficina groovy grails - infowayLucas Aquiles
 
Groovy na plataforma Java
Groovy na plataforma JavaGroovy na plataforma Java
Groovy na plataforma JavaJoão Lourenço
 
Groovy: graxa nas engrenagens de Java
Groovy: graxa nas engrenagens de JavaGroovy: graxa nas engrenagens de Java
Groovy: graxa nas engrenagens de JavaMarcos Pereira
 
Tutorial java script orientado à objeto e jquery
Tutorial java script orientado à objeto e jqueryTutorial java script orientado à objeto e jquery
Tutorial java script orientado à objeto e jqueryLuan Campos
 
Utilize Groovy nos seus futuros projetos
Utilize Groovy nos seus futuros projetosUtilize Groovy nos seus futuros projetos
Utilize Groovy nos seus futuros projetosmarciowferreira
 
Esta começando a programar para a web? Então começe com Rails
Esta começando a programar para a web? Então começe com RailsEsta começando a programar para a web? Então começe com Rails
Esta começando a programar para a web? Então começe com Railsismaelstahelin
 
Introdução a linguagem Python
Introdução a linguagem PythonIntrodução a linguagem Python
Introdução a linguagem PythonLuciano Ramalho
 
Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7Christiano Anderson
 
Programação Orientada a Objetos com Java
Programação Orientada a Objetos com JavaProgramação Orientada a Objetos com Java
Programação Orientada a Objetos com JavaÁlvaro Farias Pinheiro
 
Linguagens de Script: Caso de Estudo Lua
Linguagens de Script: Caso de Estudo LuaLinguagens de Script: Caso de Estudo Lua
Linguagens de Script: Caso de Estudo LuaSérgio Souza Costa
 
Seminário sobre GO
Seminário sobre GOSeminário sobre GO
Seminário sobre GOgptavares
 
TypeScript - Campus party 2013
TypeScript - Campus party 2013TypeScript - Campus party 2013
TypeScript - Campus party 2013Giovanni Bassi
 

Similar to Curso de Groovy (20)

Programando em Go
Programando em GoProgramando em Go
Programando em Go
 
Overview de Grails: O Java em alta produtividade
Overview de Grails: O Java em alta produtividadeOverview de Grails: O Java em alta produtividade
Overview de Grails: O Java em alta produtividade
 
Template method pattern
Template method patternTemplate method pattern
Template method pattern
 
Usando QUnit para testes unitários em JavaScript
Usando QUnit para testes unitários em JavaScriptUsando QUnit para testes unitários em JavaScript
Usando QUnit para testes unitários em JavaScript
 
Curso de Grails
Curso de GrailsCurso de Grails
Curso de Grails
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVA
 
Oficina groovy grails - infoway
Oficina  groovy grails - infowayOficina  groovy grails - infoway
Oficina groovy grails - infoway
 
Qual linguagem escolher?
Qual linguagem escolher?Qual linguagem escolher?
Qual linguagem escolher?
 
Groovy na plataforma Java
Groovy na plataforma JavaGroovy na plataforma Java
Groovy na plataforma Java
 
Groovy: graxa nas engrenagens de Java
Groovy: graxa nas engrenagens de JavaGroovy: graxa nas engrenagens de Java
Groovy: graxa nas engrenagens de Java
 
Tutorial java script orientado à objeto e jquery
Tutorial java script orientado à objeto e jqueryTutorial java script orientado à objeto e jquery
Tutorial java script orientado à objeto e jquery
 
Groovy
GroovyGroovy
Groovy
 
Utilize Groovy nos seus futuros projetos
Utilize Groovy nos seus futuros projetosUtilize Groovy nos seus futuros projetos
Utilize Groovy nos seus futuros projetos
 
Esta começando a programar para a web? Então começe com Rails
Esta começando a programar para a web? Então começe com RailsEsta começando a programar para a web? Então começe com Rails
Esta começando a programar para a web? Então começe com Rails
 
Introdução a linguagem Python
Introdução a linguagem PythonIntrodução a linguagem Python
Introdução a linguagem Python
 
Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7
 
Programação Orientada a Objetos com Java
Programação Orientada a Objetos com JavaProgramação Orientada a Objetos com Java
Programação Orientada a Objetos com Java
 
Linguagens de Script: Caso de Estudo Lua
Linguagens de Script: Caso de Estudo LuaLinguagens de Script: Caso de Estudo Lua
Linguagens de Script: Caso de Estudo Lua
 
Seminário sobre GO
Seminário sobre GOSeminário sobre GO
Seminário sobre GO
 
TypeScript - Campus party 2013
TypeScript - Campus party 2013TypeScript - Campus party 2013
TypeScript - Campus party 2013
 

Recently uploaded

ATIVIDADE 3 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 3 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024ATIVIDADE 3 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 3 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024azulassessoria9
 
Missa catequese para o dia da mãe 2025.pdf
Missa catequese para o dia da mãe 2025.pdfMissa catequese para o dia da mãe 2025.pdf
Missa catequese para o dia da mãe 2025.pdfFbioFerreira207918
 
tensoes-etnicas-na-europa-template-1.pptx
tensoes-etnicas-na-europa-template-1.pptxtensoes-etnicas-na-europa-template-1.pptx
tensoes-etnicas-na-europa-template-1.pptxgia0123
 
AULÃO de Língua Portuguesa para o Saepe 2022
AULÃO de Língua Portuguesa para o Saepe 2022AULÃO de Língua Portuguesa para o Saepe 2022
AULÃO de Língua Portuguesa para o Saepe 2022LeandroSilva126216
 
Quiz | Dia da Europa 2024 (comemoração)
Quiz | Dia da Europa 2024  (comemoração)Quiz | Dia da Europa 2024  (comemoração)
Quiz | Dia da Europa 2024 (comemoração)Centro Jacques Delors
 
M0 Atendimento – Definição, Importância .pptx
M0 Atendimento – Definição, Importância .pptxM0 Atendimento – Definição, Importância .pptx
M0 Atendimento – Definição, Importância .pptxJustinoTeixeira1
 
Monoteísmo, Politeísmo, Panteísmo 7 ANO2.pptx
Monoteísmo, Politeísmo, Panteísmo 7 ANO2.pptxMonoteísmo, Politeísmo, Panteísmo 7 ANO2.pptx
Monoteísmo, Politeísmo, Panteísmo 7 ANO2.pptxFlviaGomes64
 
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024azulassessoria9
 
6ano variação linguística ensino fundamental.pptx
6ano variação linguística ensino fundamental.pptx6ano variação linguística ensino fundamental.pptx
6ano variação linguística ensino fundamental.pptxJssicaCassiano2
 
Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...
Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...
Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...azulassessoria9
 
O que é arte. Definição de arte. História da arte.
O que é arte. Definição de arte. História da arte.O que é arte. Definição de arte. História da arte.
O que é arte. Definição de arte. História da arte.denisecompasso2
 
apostila filosofia 1 ano 1s (1).pdf 1 ANO DO ENSINO MEDIO . CONCEITOSE CARAC...
apostila filosofia 1 ano  1s (1).pdf 1 ANO DO ENSINO MEDIO . CONCEITOSE CARAC...apostila filosofia 1 ano  1s (1).pdf 1 ANO DO ENSINO MEDIO . CONCEITOSE CARAC...
apostila filosofia 1 ano 1s (1).pdf 1 ANO DO ENSINO MEDIO . CONCEITOSE CARAC...SileideDaSilvaNascim
 
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024azulassessoria9
 
Sistema de Bibliotecas UCS - Cantos do fim do século
Sistema de Bibliotecas UCS  - Cantos do fim do séculoSistema de Bibliotecas UCS  - Cantos do fim do século
Sistema de Bibliotecas UCS - Cantos do fim do séculoBiblioteca UCS
 
Falando de Física Quântica apresentação introd
Falando de Física Quântica apresentação introdFalando de Física Quântica apresentação introd
Falando de Física Quântica apresentação introdLeonardoDeOliveiraLu2
 
Cartão de crédito e fatura do cartão.pptx
Cartão de crédito e fatura do cartão.pptxCartão de crédito e fatura do cartão.pptx
Cartão de crédito e fatura do cartão.pptxMarcosLemes28
 
Aula 25 - A america espanhola - colonização, exploraçãp e trabalho (mita e en...
Aula 25 - A america espanhola - colonização, exploraçãp e trabalho (mita e en...Aula 25 - A america espanhola - colonização, exploraçãp e trabalho (mita e en...
Aula 25 - A america espanhola - colonização, exploraçãp e trabalho (mita e en...MariaCristinaSouzaLe1
 
Apresentação | Símbolos e Valores da União Europeia
Apresentação | Símbolos e Valores da União EuropeiaApresentação | Símbolos e Valores da União Europeia
Apresentação | Símbolos e Valores da União EuropeiaCentro Jacques Delors
 
Sistema articular aula 4 (1).pdf articulações e junturas
Sistema articular aula 4 (1).pdf articulações e junturasSistema articular aula 4 (1).pdf articulações e junturas
Sistema articular aula 4 (1).pdf articulações e junturasrfmbrandao
 

Recently uploaded (20)

ATIVIDADE 3 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 3 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024ATIVIDADE 3 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 3 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
 
Missa catequese para o dia da mãe 2025.pdf
Missa catequese para o dia da mãe 2025.pdfMissa catequese para o dia da mãe 2025.pdf
Missa catequese para o dia da mãe 2025.pdf
 
tensoes-etnicas-na-europa-template-1.pptx
tensoes-etnicas-na-europa-template-1.pptxtensoes-etnicas-na-europa-template-1.pptx
tensoes-etnicas-na-europa-template-1.pptx
 
AULÃO de Língua Portuguesa para o Saepe 2022
AULÃO de Língua Portuguesa para o Saepe 2022AULÃO de Língua Portuguesa para o Saepe 2022
AULÃO de Língua Portuguesa para o Saepe 2022
 
Quiz | Dia da Europa 2024 (comemoração)
Quiz | Dia da Europa 2024  (comemoração)Quiz | Dia da Europa 2024  (comemoração)
Quiz | Dia da Europa 2024 (comemoração)
 
M0 Atendimento – Definição, Importância .pptx
M0 Atendimento – Definição, Importância .pptxM0 Atendimento – Definição, Importância .pptx
M0 Atendimento – Definição, Importância .pptx
 
Monoteísmo, Politeísmo, Panteísmo 7 ANO2.pptx
Monoteísmo, Politeísmo, Panteísmo 7 ANO2.pptxMonoteísmo, Politeísmo, Panteísmo 7 ANO2.pptx
Monoteísmo, Politeísmo, Panteísmo 7 ANO2.pptx
 
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
 
6ano variação linguística ensino fundamental.pptx
6ano variação linguística ensino fundamental.pptx6ano variação linguística ensino fundamental.pptx
6ano variação linguística ensino fundamental.pptx
 
Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...
Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...
Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...
 
Novena de Pentecostes com textos de São João Eudes
Novena de Pentecostes com textos de São João EudesNovena de Pentecostes com textos de São João Eudes
Novena de Pentecostes com textos de São João Eudes
 
O que é arte. Definição de arte. História da arte.
O que é arte. Definição de arte. História da arte.O que é arte. Definição de arte. História da arte.
O que é arte. Definição de arte. História da arte.
 
apostila filosofia 1 ano 1s (1).pdf 1 ANO DO ENSINO MEDIO . CONCEITOSE CARAC...
apostila filosofia 1 ano  1s (1).pdf 1 ANO DO ENSINO MEDIO . CONCEITOSE CARAC...apostila filosofia 1 ano  1s (1).pdf 1 ANO DO ENSINO MEDIO . CONCEITOSE CARAC...
apostila filosofia 1 ano 1s (1).pdf 1 ANO DO ENSINO MEDIO . CONCEITOSE CARAC...
 
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
 
Sistema de Bibliotecas UCS - Cantos do fim do século
Sistema de Bibliotecas UCS  - Cantos do fim do séculoSistema de Bibliotecas UCS  - Cantos do fim do século
Sistema de Bibliotecas UCS - Cantos do fim do século
 
Falando de Física Quântica apresentação introd
Falando de Física Quântica apresentação introdFalando de Física Quântica apresentação introd
Falando de Física Quântica apresentação introd
 
Cartão de crédito e fatura do cartão.pptx
Cartão de crédito e fatura do cartão.pptxCartão de crédito e fatura do cartão.pptx
Cartão de crédito e fatura do cartão.pptx
 
Aula 25 - A america espanhola - colonização, exploraçãp e trabalho (mita e en...
Aula 25 - A america espanhola - colonização, exploraçãp e trabalho (mita e en...Aula 25 - A america espanhola - colonização, exploraçãp e trabalho (mita e en...
Aula 25 - A america espanhola - colonização, exploraçãp e trabalho (mita e en...
 
Apresentação | Símbolos e Valores da União Europeia
Apresentação | Símbolos e Valores da União EuropeiaApresentação | Símbolos e Valores da União Europeia
Apresentação | Símbolos e Valores da União Europeia
 
Sistema articular aula 4 (1).pdf articulações e junturas
Sistema articular aula 4 (1).pdf articulações e junturasSistema articular aula 4 (1).pdf articulações e junturas
Sistema articular aula 4 (1).pdf articulações e junturas
 

Curso de Groovy

  • 1. Groovy & Grails Desenvolvimento ágil para plataforma Java Luís Bruno P. Nascimento luisbrunu@gmail.com
  • 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