SlideShare une entreprise Scribd logo
1  sur  71
Télécharger pour lire hors ligne
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

Contenu connexe

Tendances

프론트엔드 개발자를 위한 Layer Model
프론트엔드 개발자를 위한 Layer Model프론트엔드 개발자를 위한 Layer Model
프론트엔드 개발자를 위한 Layer ModelHan Lee
 
Groovy presentation
Groovy presentationGroovy presentation
Groovy presentationManav Prasad
 
Golang 101
Golang 101Golang 101
Golang 101宇 傅
 
Django Framework and Application Structure
Django Framework and Application StructureDjango Framework and Application Structure
Django Framework and Application StructureSEONGTAEK OH
 
Introduction to Go programming language
Introduction to Go programming languageIntroduction to Go programming language
Introduction to Go programming languageSlawomir Dorzak
 
Git e Github para Iniciantes
Git e Github para IniciantesGit e Github para Iniciantes
Git e Github para IniciantesLoiane Groner
 
Puppeteer - Headless Chrome Node API
Puppeteer - Headless Chrome Node APIPuppeteer - Headless Chrome Node API
Puppeteer - Headless Chrome Node APIubunturk
 
Django for Beginners
Django for BeginnersDjango for Beginners
Django for BeginnersJason Davies
 
Polimorfismo em java
Polimorfismo em javaPolimorfismo em java
Polimorfismo em javaManoel Afonso
 
Aula 01 - JavaScript: Introdução
Aula 01 - JavaScript: IntroduçãoAula 01 - JavaScript: Introdução
Aula 01 - JavaScript: IntroduçãoJessyka Lage
 
[Golang] 以 Mobile App 工程師視角,帶你進入 Golang 的世界 (Introduction of GoLang)
[Golang] 以 Mobile App 工程師視角,帶你進入 Golang 的世界 (Introduction of GoLang) [Golang] 以 Mobile App 工程師視角,帶你進入 Golang 的世界 (Introduction of GoLang)
[Golang] 以 Mobile App 工程師視角,帶你進入 Golang 的世界 (Introduction of GoLang) Johnny Sung
 
Hacking the browser with puppeteer sharp .NET conf AR 2018
Hacking the browser with puppeteer sharp .NET conf AR 2018Hacking the browser with puppeteer sharp .NET conf AR 2018
Hacking the browser with puppeteer sharp .NET conf AR 2018Darío Kondratiuk
 
PHPCon China 2016 - 從學徒變大師:談 Laravel 框架擴充與套件開發
PHPCon China 2016 - 從學徒變大師:談 Laravel 框架擴充與套件開發PHPCon China 2016 - 從學徒變大師:談 Laravel 框架擴充與套件開發
PHPCon China 2016 - 從學徒變大師:談 Laravel 框架擴充與套件開發Shengyou Fan
 
Network Protocol Testing Using Robot Framework
Network Protocol Testing Using Robot FrameworkNetwork Protocol Testing Using Robot Framework
Network Protocol Testing Using Robot FrameworkPayal Jain
 
Introduction to Django
Introduction to DjangoIntroduction to Django
Introduction to DjangoJames Casey
 

Tendances (20)

프론트엔드 개발자를 위한 Layer Model
프론트엔드 개발자를 위한 Layer Model프론트엔드 개발자를 위한 Layer Model
프론트엔드 개발자를 위한 Layer Model
 
Groovy presentation
Groovy presentationGroovy presentation
Groovy presentation
 
Golang 101
Golang 101Golang 101
Golang 101
 
Django Framework and Application Structure
Django Framework and Application StructureDjango Framework and Application Structure
Django Framework and Application Structure
 
Introduction to Go programming language
Introduction to Go programming languageIntroduction to Go programming language
Introduction to Go programming language
 
Unit testing with JUnit
Unit testing with JUnitUnit testing with JUnit
Unit testing with JUnit
 
Git e Github para Iniciantes
Git e Github para IniciantesGit e Github para Iniciantes
Git e Github para Iniciantes
 
Puppeteer - Headless Chrome Node API
Puppeteer - Headless Chrome Node APIPuppeteer - Headless Chrome Node API
Puppeteer - Headless Chrome Node API
 
Django for Beginners
Django for BeginnersDjango for Beginners
Django for Beginners
 
Polimorfismo em java
Polimorfismo em javaPolimorfismo em java
Polimorfismo em java
 
Flutter do zero a publicacao
Flutter do zero a publicacaoFlutter do zero a publicacao
Flutter do zero a publicacao
 
Vagrant
VagrantVagrant
Vagrant
 
Aula 01 - JavaScript: Introdução
Aula 01 - JavaScript: IntroduçãoAula 01 - JavaScript: Introdução
Aula 01 - JavaScript: Introdução
 
[Golang] 以 Mobile App 工程師視角,帶你進入 Golang 的世界 (Introduction of GoLang)
[Golang] 以 Mobile App 工程師視角,帶你進入 Golang 的世界 (Introduction of GoLang) [Golang] 以 Mobile App 工程師視角,帶你進入 Golang 的世界 (Introduction of GoLang)
[Golang] 以 Mobile App 工程師視角,帶你進入 Golang 的世界 (Introduction of GoLang)
 
Introdução ao HTML e CSS
Introdução ao HTML e CSSIntrodução ao HTML e CSS
Introdução ao HTML e CSS
 
Introdução ao HTML
Introdução ao HTMLIntrodução ao HTML
Introdução ao HTML
 
Hacking the browser with puppeteer sharp .NET conf AR 2018
Hacking the browser with puppeteer sharp .NET conf AR 2018Hacking the browser with puppeteer sharp .NET conf AR 2018
Hacking the browser with puppeteer sharp .NET conf AR 2018
 
PHPCon China 2016 - 從學徒變大師:談 Laravel 框架擴充與套件開發
PHPCon China 2016 - 從學徒變大師:談 Laravel 框架擴充與套件開發PHPCon China 2016 - 從學徒變大師:談 Laravel 框架擴充與套件開發
PHPCon China 2016 - 從學徒變大師:談 Laravel 框架擴充與套件開發
 
Network Protocol Testing Using Robot Framework
Network Protocol Testing Using Robot FrameworkNetwork Protocol Testing Using Robot Framework
Network Protocol Testing Using Robot Framework
 
Introduction to Django
Introduction to DjangoIntroduction to Django
Introduction to Django
 

En vedette

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
 

En vedette (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
 

Similaire à 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
 

Similaire à 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
 
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
 
Groovy stack
Groovy stackGroovy stack
Groovy stack
 

Dernier

Slides sobre as Funções da Linguagem.pptx
Slides sobre as Funções da Linguagem.pptxSlides sobre as Funções da Linguagem.pptx
Slides sobre as Funções da Linguagem.pptxMauricioOliveira258223
 
Revolução russa e mexicana. Slides explicativos e atividades
Revolução russa e mexicana. Slides explicativos e atividadesRevolução russa e mexicana. Slides explicativos e atividades
Revolução russa e mexicana. Slides explicativos e atividadesFabianeMartins35
 
2° ANO - ENSINO FUNDAMENTAL ENSINO RELIGIOSO
2° ANO - ENSINO FUNDAMENTAL ENSINO RELIGIOSO2° ANO - ENSINO FUNDAMENTAL ENSINO RELIGIOSO
2° ANO - ENSINO FUNDAMENTAL ENSINO RELIGIOSOLeloIurk1
 
Currículo - Ícaro Kleisson - Tutor acadêmico.pdf
Currículo - Ícaro Kleisson - Tutor acadêmico.pdfCurrículo - Ícaro Kleisson - Tutor acadêmico.pdf
Currículo - Ícaro Kleisson - Tutor acadêmico.pdfTutor de matemática Ícaro
 
PROJETO DE EXTENSÃO I - SERVIÇOS JURÍDICOS, CARTORÁRIOS E NOTARIAIS.pdf
PROJETO DE EXTENSÃO I - SERVIÇOS JURÍDICOS, CARTORÁRIOS E NOTARIAIS.pdfPROJETO DE EXTENSÃO I - SERVIÇOS JURÍDICOS, CARTORÁRIOS E NOTARIAIS.pdf
PROJETO DE EXTENSÃO I - SERVIÇOS JURÍDICOS, CARTORÁRIOS E NOTARIAIS.pdfHELENO FAVACHO
 
PRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEM
PRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEMPRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEM
PRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEMHELENO FAVACHO
 
Construção (C)erta - Nós Propomos! Sertã
Construção (C)erta - Nós Propomos! SertãConstrução (C)erta - Nós Propomos! Sertã
Construção (C)erta - Nós Propomos! SertãIlda Bicacro
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...azulassessoria9
 
Apresentação em Powerpoint do Bioma Catinga.pptx
Apresentação em Powerpoint do Bioma Catinga.pptxApresentação em Powerpoint do Bioma Catinga.pptx
Apresentação em Powerpoint do Bioma Catinga.pptxLusGlissonGud
 
CRUZADINHA - Leitura e escrita dos números
CRUZADINHA   -   Leitura e escrita dos números CRUZADINHA   -   Leitura e escrita dos números
CRUZADINHA - Leitura e escrita dos números Mary Alvarenga
 
ENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdf
ENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdfENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdf
ENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdfLeloIurk1
 
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdf
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdfProjeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdf
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdfHELENO FAVACHO
 
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdfLeloIurk1
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...azulassessoria9
 
Dicionário de Genealogia, autor Gilber Rubim Rangel
Dicionário de Genealogia, autor Gilber Rubim RangelDicionário de Genealogia, autor Gilber Rubim Rangel
Dicionário de Genealogia, autor Gilber Rubim RangelGilber Rubim Rangel
 
"É melhor praticar para a nota" - Como avaliar comportamentos em contextos de...
"É melhor praticar para a nota" - Como avaliar comportamentos em contextos de..."É melhor praticar para a nota" - Como avaliar comportamentos em contextos de...
"É melhor praticar para a nota" - Como avaliar comportamentos em contextos de...Rosalina Simão Nunes
 
About Vila Galé- Cadeia Empresarial de Hotéis
About Vila Galé- Cadeia Empresarial de HotéisAbout Vila Galé- Cadeia Empresarial de Hotéis
About Vila Galé- Cadeia Empresarial de Hotéisines09cachapa
 
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptxTeoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptxTailsonSantos1
 
Projeto_de_Extensão_Agronomia_adquira_ja_(91)_98764-0830.pdf
Projeto_de_Extensão_Agronomia_adquira_ja_(91)_98764-0830.pdfProjeto_de_Extensão_Agronomia_adquira_ja_(91)_98764-0830.pdf
Projeto_de_Extensão_Agronomia_adquira_ja_(91)_98764-0830.pdfHELENO FAVACHO
 
Apresentação ISBET Jovem Aprendiz e Estágio 2023.pdf
Apresentação ISBET Jovem Aprendiz e Estágio 2023.pdfApresentação ISBET Jovem Aprendiz e Estágio 2023.pdf
Apresentação ISBET Jovem Aprendiz e Estágio 2023.pdfcomercial400681
 

Dernier (20)

Slides sobre as Funções da Linguagem.pptx
Slides sobre as Funções da Linguagem.pptxSlides sobre as Funções da Linguagem.pptx
Slides sobre as Funções da Linguagem.pptx
 
Revolução russa e mexicana. Slides explicativos e atividades
Revolução russa e mexicana. Slides explicativos e atividadesRevolução russa e mexicana. Slides explicativos e atividades
Revolução russa e mexicana. Slides explicativos e atividades
 
2° ANO - ENSINO FUNDAMENTAL ENSINO RELIGIOSO
2° ANO - ENSINO FUNDAMENTAL ENSINO RELIGIOSO2° ANO - ENSINO FUNDAMENTAL ENSINO RELIGIOSO
2° ANO - ENSINO FUNDAMENTAL ENSINO RELIGIOSO
 
Currículo - Ícaro Kleisson - Tutor acadêmico.pdf
Currículo - Ícaro Kleisson - Tutor acadêmico.pdfCurrículo - Ícaro Kleisson - Tutor acadêmico.pdf
Currículo - Ícaro Kleisson - Tutor acadêmico.pdf
 
PROJETO DE EXTENSÃO I - SERVIÇOS JURÍDICOS, CARTORÁRIOS E NOTARIAIS.pdf
PROJETO DE EXTENSÃO I - SERVIÇOS JURÍDICOS, CARTORÁRIOS E NOTARIAIS.pdfPROJETO DE EXTENSÃO I - SERVIÇOS JURÍDICOS, CARTORÁRIOS E NOTARIAIS.pdf
PROJETO DE EXTENSÃO I - SERVIÇOS JURÍDICOS, CARTORÁRIOS E NOTARIAIS.pdf
 
PRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEM
PRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEMPRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEM
PRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEM
 
Construção (C)erta - Nós Propomos! Sertã
Construção (C)erta - Nós Propomos! SertãConstrução (C)erta - Nós Propomos! Sertã
Construção (C)erta - Nós Propomos! Sertã
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
 
Apresentação em Powerpoint do Bioma Catinga.pptx
Apresentação em Powerpoint do Bioma Catinga.pptxApresentação em Powerpoint do Bioma Catinga.pptx
Apresentação em Powerpoint do Bioma Catinga.pptx
 
CRUZADINHA - Leitura e escrita dos números
CRUZADINHA   -   Leitura e escrita dos números CRUZADINHA   -   Leitura e escrita dos números
CRUZADINHA - Leitura e escrita dos números
 
ENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdf
ENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdfENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdf
ENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdf
 
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdf
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdfProjeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdf
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdf
 
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
 
Dicionário de Genealogia, autor Gilber Rubim Rangel
Dicionário de Genealogia, autor Gilber Rubim RangelDicionário de Genealogia, autor Gilber Rubim Rangel
Dicionário de Genealogia, autor Gilber Rubim Rangel
 
"É melhor praticar para a nota" - Como avaliar comportamentos em contextos de...
"É melhor praticar para a nota" - Como avaliar comportamentos em contextos de..."É melhor praticar para a nota" - Como avaliar comportamentos em contextos de...
"É melhor praticar para a nota" - Como avaliar comportamentos em contextos de...
 
About Vila Galé- Cadeia Empresarial de Hotéis
About Vila Galé- Cadeia Empresarial de HotéisAbout Vila Galé- Cadeia Empresarial de Hotéis
About Vila Galé- Cadeia Empresarial de Hotéis
 
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptxTeoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
 
Projeto_de_Extensão_Agronomia_adquira_ja_(91)_98764-0830.pdf
Projeto_de_Extensão_Agronomia_adquira_ja_(91)_98764-0830.pdfProjeto_de_Extensão_Agronomia_adquira_ja_(91)_98764-0830.pdf
Projeto_de_Extensão_Agronomia_adquira_ja_(91)_98764-0830.pdf
 
Apresentação ISBET Jovem Aprendiz e Estágio 2023.pdf
Apresentação ISBET Jovem Aprendiz e Estágio 2023.pdfApresentação ISBET Jovem Aprendiz e Estágio 2023.pdf
Apresentação ISBET Jovem Aprendiz e Estágio 2023.pdf
 

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