Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Scala: paradigma objeto-funcional sobre a JVM

ar
June 07, 2012

Scala: paradigma objeto-funcional sobre a JVM

Aborda a linguagem de programação Scala, destacando seus aspectos de programação orientada a objetos bem como funcional. Além disso, será abordado suporte de IDE's como Eclipse e NetBeans, integração com frameworks e especificações, interoperabilidade com a linguagem Java, dentre outros.

ar

June 07, 2012
Tweet

More Decks by ar

Other Decks in Programming

Transcript

  1. Scala: paradigma objeto-funcional sobre a JVM Flisol 2012 Arthur Ronald

    F D Garcia Consultor Java EE, Spring, JBoss Seam, Google Guice Autor Java Persistence API: object-relational mapping from scratch to legacy systems (outubro/2012) ISBN-13: 978-1468104608 ISBN-10: 1468104608 Analista desenvolvedor Java, Scala, Groovy, Python, Clojure Stackoverflow user http://www.stackoverflow.com/users/127359
  2. Scala: paradigma objeto-funcional sobre a JVM Flisol 2012 Scala Scala

    é uma linguagem de programação concisa, elegante e segura que integra funcionalidade orientada a objetos e funcional.
  3. Scala: paradigma objeto-funcional sobre a JVM Flisol 2012 Características ∙

    Tipagem estática ∙ Programação orientada a objetos e funcional ∙ Mixins ∙ Generics ∙ Type inference
  4. Scala: paradigma objeto-funcional sobre a JVM Flisol 2012 Por que

    a Java Virtual Machine ? ∙ Padrão aberto ∙ Compatibilidade ∙ Solidez ∙ Ampla concorrência (IBM, Oracle, Apache)
  5. Scala: paradigma objeto-funcional sobre a JVM Flisol 2012 Java Virtual

    Machine Scala Java Groovy Linux Windows Mac .class Java runtime
  6. Scala: paradigma objeto-funcional sobre a JVM Flisol 2012 Classes –

    Uma simples classe class Pessoa >> val pessoa:Pessoa = new Pessoa(); >> val pessoa = new Pessoa(); // Type inference
  7. Scala: paradigma objeto-funcional sobre a JVM Flisol 2012 Classes –

    Adicionando propriedades I class Pessoa(var nome:String, var idade:Int) >> val pessoa:Pessoa = new Pessoa("Arthur Ronald", 32); >> val pessoa = new Pessoa("Arthur Ronald", 32); // Type inference >> val pessoa = new Pessoa(nome="Arthur Ronald", idade=32); // Parâmetro nomeado
  8. Scala: paradigma objeto-funcional sobre a JVM Flisol 2012 Classes –

    Adicionando propriedades II class Pessoa(var nome:String, var idade:Int) { var id:Int = _ } >> val pessoa:Pessoa = new Pessoa("Arthur Ronald", 32); >> val pessoa = new Pessoa("Arthur Ronald", 32); // Type inference >> val pessoa = new Pessoa(nome="Arthur Ronald", idade=32); // Parâmetro nomeado Nota: ao fazer uso da chamada via parâmetro nomeado, a ordem dos parâmetros não importa.
  9. Scala: paradigma objeto-funcional sobre a JVM Flisol 2012 Classes –

    Customizando propriedades class Pessoa(var nome:String, private var _idade:Int) { var id:Int = _ def idade = _idade def idade_=(novaIdade:Int) = { if(novaIdade < 0) throw new IllegalStateException("Idade não pode ser negativa"); _idade = novaIdade; } } Nota: Scala não permite propriedades write-only. Por causa disso, foi necessário adicionar o método get: def idade = _idade
  10. Scala: paradigma objeto-funcional sobre a JVM Flisol 2012 Classes –

    Adicionando outras funcionalidades case class Pessoa(nome:String, idade:Int) Case classes implementa automaticamente funcionalidades básicas • propriedades imutáveis a menos que seja prefixada com var • equals • hashcode • toString >> val pessoa1 = new Pessoa("Arthur Ronald", 32); >> val pessoa2 = new Pessoa("Arthur Ronald", 32); >> println(pessoa1 == pessoa2); true
  11. Scala: paradigma objeto-funcional sobre a JVM Flisol 2012 Construtor primário

    e auxiliares class Pessoa(var nome:String, var idade:Int) { def this() = { this("Arthur Ronald F D Garcia", 32); } println("Objeto Pessoa instanciado"); } >> val pessoa = new Pessoa(); "Objeto Pessoa instanciado" • Declarado inline ao definir a classe • Ao instanciar um objeto, deve-se sempre, direta ou indiretamente, invocar o construtor primário • Qualquer outro construtor auxiliar deve primeiramente invocar o construtor primário • Qualquer instrução no corpo da classe é executada pelo construtor primário
  12. Scala: paradigma objeto-funcional sobre a JVM Flisol 2012 Classes –

    Declarando métodos def main(args:Array[String]):Unit = println("Uma única instrução"); def main(args:Array[String]):Unit = { if(args.isEmpty) return; args.foreach((argumento:String) => println(argumento)); } • O uso da palavra reservada return, seja para controle de fluxo ou para retornar o valor especificado pela função, exige a declaração completa do método • Caso o método declare apenas uma instrução, o uso das chaves pode ser omitido
  13. Scala: paradigma objeto-funcional sobre a JVM Flisol 2012 Open diamond

    public class A { public void metodo() {} } public class B { public void metodo() {} } public class C extends A, B {} >> C c = new C(); >> c.metodo();
  14. Scala: paradigma objeto-funcional sobre a JVM Flisol 2012 Solução =

    Mixin class C extends A with B • Scala não permite herança múltipla. Você só pode herdar de uma classe, seja ela abstrata ou concreta. Nota: Mixins seguem o padrão Cake
  15. Scala: paradigma objeto-funcional sobre a JVM Flisol 2012 Caso de

    uso: IdentityEquality versus BusinessEquality case class Pessoa(nome:String, idade:Int) { var id:java.lang.Integer = _ } Como comparar duas instâncias da classe Pessoa usando IdentityEquality ?
  16. Scala: paradigma objeto-funcional sobre a JVM Flisol 2012 Caso de

    uso: IdentityEquality versus BusinessEquality – solução I /** * Scala */ val pessoa = new Pessoa("Arthur Ronald", 32) { override def equals(o:Any) = o match { case p:Pessoa => p.id.equals(id) case _ => false } } /** * Java */ Pessoa pessoa = new Pessoa() { @Override public boolean equals(Object o) { if(!(o instanceof Pessoa)) return false; Pessoa p = (Pessoa) o; return id.equals(p.id); } }
  17. Scala: paradigma objeto-funcional sobre a JVM Flisol 2012 Caso de

    uso: IdentityEquality versus BusinessEquality – solução II trait IdentityEquality[PRIMARY_KEY_CLASS] { var id:PRIMARY_KEY_CLASS; type TIPO = { var id:Any } override def equals(o:Any) = o match { case obj:TIPO => obj.id.equals(id) case _ => false } }
  18. Scala: paradigma objeto-funcional sobre a JVM Flisol 2012 Caso de

    uso: IdentityEquality versus BusinessEquality >> val p1 = new Pessoa("Arthur Ronald", 32); >> p1.id = 1; >> val p2 = new Pessoa("Arthur Ronald", 33) with IdentityEquality[java.lang.Integer]; >> p2.id = 1; >> println(p2 == p1) true
  19. Scala: paradigma objeto-funcional sobre a JVM Flisol 2012 Programação funcional

    No campo das ciências da computação, programação funcional é um paradigma que opera sobre funções matemáticas e evita mutabilidade. fonte:wikipedia Portanto, os princípios da programação funcional são: ∙ Funções matemáticas como objetos ∙ Imutabilidade ∙ Recursividade ao invés de loops
  20. Scala: paradigma objeto-funcional sobre a JVM Flisol 2012 Imutabilidade Opção

    1 - construtor define os atributos necessários à construção do objeto class Pessoa(val nome:String, val idade:Int) >> val pessoa = new Pessoa("Arthur Ronald", 32); • A palavra reservada val impede a mutabilidade da propriedade, ou seja, você não pode alterar o estado dela uma vez que seu valor for definido >> pessoa.idade = 33; error: reassignment to val Opção 2 - Padrão Builder - Útil ao construir objetos complexos >> Pessoa pessoa = PessoaBuilder() .com(nome("Arthur Ronald")) .com(idade(32)) .build();
  21. Scala: paradigma objeto-funcional sobre a JVM Flisol 2012 Imutabilidade versus

    Mutabilidade class Pessoa(val nome:String, val idade:Int) { def build(nome:String = nome, idade:Int = idade):Pessoa = { return new Pessoa(nome, idade); } } >> val pessoa = new Pessoa("Arthur Ronald", 32); >> val pessoaMutavel = pessoa.build(idade = 33);
  22. Scala: paradigma objeto-funcional sobre a JVM Flisol 2012 Definindo funções

    object FuncaoWrapper { def funcao(callback:() => Unit):Unit = { callback(); } } >> FuncaoWrapper.funcao(() => Console.println("Invocando via função anônima")); Invocando via função anônima
  23. Scala: paradigma objeto-funcional sobre a JVM Flisol 2012 Caso de

    uso: Somar uma lista de inteiros - Solução I List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); int somaTotal = 0; for (Integer integer : list) { somaTotal += integer; } System.out.println(somaTotal);
  24. Scala: paradigma objeto-funcional sobre a JVM Flisol 2012 Caso de

    uso: Somar uma lista de inteiros - Solução II List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); public static int sum(List<Integer> list) { if (list.isEmpty()) return 0; return list.get(0) + sum(list.subList(1, list.size())); } System.out.println(sum(list)); Nota: para outros exemplos, acesse http://www.cs.utah.edu/~germain/PPS/Topics/recursion.html
  25. Scala: paradigma objeto-funcional sobre a JVM Flisol 2012 Scala +

    Eclipse http://scala-ide.org/ ∙ Suporte para projetos Java/Scala ∙ Autocompletar ∙ Marcador de erro