scala: unindo programação funcional e orientação a objetos
TRANSCRIPT
![Page 1: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/1.jpg)
Scala Unindo programação funcional
e orientação a objetos
Felipe Hummel
![Page 2: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/2.jpg)
Quem?• Graduação (2008) e Mestrado (2011) pela UFAM
• NewsMonitor
• Desde 2012, morando em São Paulo nos últimos 2 anos
• Site profissional para monitoramento de notícias em tempo real
• 170M de notícias
• 5M/mês
• ~30K linhas de código Scala (2 Devs back-end)
• Maiores desafios estão na coleta, processamento e busca de notícias
![Page 3: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/3.jpg)
Scala, o quê?• Relativamente “nova" (2004) começando a ganhar tração
depois de 2010
• Linguagem com tipagem forte e estática (“mais" do que outras)
• “Multiparadigma”: funcional + OO
• Open Source
• Compila para bytecode da JVM (Java Virtual Machine)
• Facilmente interoperável com código e libs Java
![Page 4: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/4.jpg)
Scala, quem usa?
![Page 5: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/5.jpg)
Scala, quem usa?
![Page 6: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/6.jpg)
Scala, por quê?• Consegue ser roazavelmente familiar mas ainda introduz conceitos
funcionais que mudam a forma como programamos
• Concisão de código sem perca de legibilidade
• Inferência de tipos (local, diferente de Haskell/ML)
• Coleções muito ricas em funcionalidades
• 90% da rotina é lidar com coleções de objetos
• Preferência por imutabilidade
• Quase tudo faz parte da biblioteca e não é sintaxe especial da linguagem
• Poder para expressar muita coisa
![Page 7: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/7.jpg)
Scala
![Page 8: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/8.jpg)
sudo apt-get install scala
![Page 9: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/9.jpg)
Val e Var
val soma = 1 + 1
![Page 10: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/10.jpg)
Val e Var
val soma = 1 + 1 soma = 10 //error: reassignment to val
![Page 11: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/11.jpg)
Val e Var
var soma = 1 + 1
![Page 12: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/12.jpg)
Val e Var
var soma = 1 + 1 soma = soma + 1 //OK!
![Page 13: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/13.jpg)
Inferência de tipos
val soma = 1 + 1
![Page 14: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/14.jpg)
Inferência de tipos
val soma: Int = 1 + 1 soma.substring(0) //error: value substring is not a member of Int
![Page 15: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/15.jpg)
Inferência de tipos
val soma = 1 + 1 soma.substring(0) //error: value substring is not a member of Int
![Page 16: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/16.jpg)
Inferência de tipos
val soma: Int = 1 + 1 val nome: String = “teste" val lista: List[String] = List(“teste”)
![Page 17: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/17.jpg)
Inferência de tipos
val soma = 1 + 1 val nome = “teste" val lista = List(“teste”)
![Page 18: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/18.jpg)
Funções
def add1(n: Int) = n + 1 // ^ inferência de tipo de retorno
![Page 19: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/19.jpg)
Funções
def add1(n: Int): Int = n + 1 // ^ tipo de retorno explícito
![Page 20: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/20.jpg)
Funções
def add1(n: Int): Int = { println(“adicionando 1”) n + 1 // última expressão: retorno automático }
![Page 21: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/21.jpg)
Funções anônimas
val f = (n: Int) => n + 1 // ^ inferindo tipo de retorno f(1) // retorna 2 val g: (Int => Int) = n => n * 2 val h: (Int => Int) = _ * 2
![Page 22: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/22.jpg)
Funções anônimas
val f = (n: Int) => n + 1 val g: (Int => Int) = n => n * 2 val fg = f.andThen(g) fg(10) // retorna 22
![Page 23: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/23.jpg)
Lazy vals
lazy val usuários = todosUsuarios() // todosUsuarios() ainda não foi chamada!! val result = usuarios // todosUsuarios() foi chamada agora println(usuarios)// não precisou recomputar
![Page 24: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/24.jpg)
Classes
class Curso(id: Int, nome: String) class Aluno(id: Int, curso: Curso, idade: Int)
![Page 25: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/25.jpg)
Classes
// ISSO NÃO É SCALA CORRETO! class Curso { private val id: Int private val nome: String def constructor(_id: Int, _nome: String) { id = _id nome = _nome } }
![Page 26: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/26.jpg)
Classes
// ISSO É SCALA CORRETO! class Curso(id: Int, nome: String)
![Page 27: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/27.jpg)
Classes
class Curso(id: Int, nome: String) val computacao = new Curso(1,“Computação”) println(computacao.nome) //error: value nome is not a member of Curso // nome não é acessível publicamente
![Page 28: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/28.jpg)
Classes
class Curso(val id: Int, val nome: String) val computacao = new Curso(1,“Computação”) println(computacao.nome) // Computação
![Page 29: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/29.jpg)
Classes
class Curso(id: Int, nome: String) { def comoString(): String = s”Curso($id, $nome)“ } val computacao = new Curso(1,“Computação”) println(computacao.comoString()) // Curso(1, Computação)
![Page 30: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/30.jpg)
case classes
case class Curso(id: Int, nome: String) val computacao = Curso(1,“Computação”) println(computacao) // Curso(1, Computação)
![Page 31: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/31.jpg)
case classes// implementa pra mim: // - toString() bonitinho // - equals() e hashCode() // - atributos são públicos e imutáveis por padrão // - não precisa do new para instanciar objeto case class Curso(id: Int, nome: String) val computacao = Curso(1,“Computação”) println(computacao) // Curso(1, Computação)
![Page 32: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/32.jpg)
public class Person { private final String firstName; private final String lastName;
String getFirstName() { return firstName; } String getLastName() { return lastName; } public Person(String first, String last) { this.firstName = first; this.lastName = last; } public int hashCode() { return goodHashCode(firstName, lastName); } public boolean equals(Object o) { if ( this == aThat ) return true; if ( !(aThat instanceof Person) ) return false; Person that = (Person)aThat; return EqualsUtil.areEqual(this.firstName, that.firstName) & EqualsUtil.areEqual(this.lastName, that.lastName); } }
![Page 33: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/33.jpg)
case class Person(firstName: String, lastName: String)
![Page 34: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/34.jpg)
objects// um "singleton" object ContadorGlobal { var contador = 0 def incrementaERetorna() = { contador += 1 contador } }
// apesar do exemplo, por favor não criem vars globais :)ContadorGlobal.incrementaERetorna() // 1 ContadorGlobal.incrementaERetorna() // 2 ContadorGlobal.incrementaERetorna() // 3
![Page 35: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/35.jpg)
parâmetros de tipo (generics)
val cursos: List[String] = List(“Computação”, “Matemática”, "Física") val cursosPorNome: Map[String, Int] = Map("Computação" -> 1234, "Matemática" -> 423, "Física" -> 5322, "Biologia" -> 1312)
![Page 36: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/36.jpg)
Coleções!
![Page 37: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/37.jpg)
Mão na massa
![Page 38: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/38.jpg)
Scala é isso
![Page 39: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/39.jpg)
80% de Scala é isso
![Page 40: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/40.jpg)
Scala mudou a forma
como programamos
![Page 41: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/41.jpg)
Parar de acessar o que não está lá
• NullPointerException (Java)
• Segmentation Fault (C/C++)
• undefined is not a function (Javascript)
• AttributeError: 'NoneType' object has no attribute (Python)
• Call to a member function on a non-object (PHP)
![Page 42: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/42.jpg)
Parar de acessar o que não está lá
• NullPointerException (Java)
• undefined is not a function (Javascript)
• AttributeError: 'NoneType' object has no attribute (Python)
• Call to a member function on a non-object (PHP)
![Page 43: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/43.jpg)
Null Pointer Exc… NÃO
• NullPointerException (Java)
• undefined is not a function (Javascript)
• AttributeError: 'NoneType' object has no attribute (Python)
• Call to a member function on a non-object (PHP)
SCALA
NÃO TEM
!!!!!!!!!
![Page 44: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/44.jpg)
Null Pointer Exc… NÃO
• Uso de Option[MeuTipo] quando necessário
![Page 45: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/45.jpg)
Tipagem Estática!• Linguagens com tipagem estáticas pegaram fama de serem
verbosas
• Não necessariamente
• Scala consegue ser tão concisa quanto as linguagens dinâmicas
• Tendência de adicionar tipos opcionais nas linguagens dinâmicas
• Javascript, PHP, Python
• Difícil viver sem um compilador me ajudando
![Page 46: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/46.jpg)
Imutabilidade
• Coisas a menos pra guardar na sua cabeça
• Não me preocupo se alguém pode ou vai mudar meu objeto
• Você pode passar objetos imutáveis pra lá e pra cá de boa
• Thread-safe por padrão
![Page 47: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/47.jpg)
Scala é a melhor coisa do mundo?
![Page 48: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/48.jpg)
Scala é a melhor coisa do mundo?
![Page 49: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/49.jpg)
A minha linguagem/framework/biblioteca
não é a melhor possível
![Page 50: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/50.jpg)
Mais conciso e expressivo que Scala é impossível
![Page 51: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/51.jpg)
Mais conciso e expressivo que Haskell é impossível
![Page 52: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/52.jpg)
Programação é sempre um comando seguido do outro
![Page 53: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/53.jpg)
Programação pode ser só (funções (chamando (funções ‘!’)))
em Clojure
![Page 54: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/54.jpg)
Ou damos free() na mão ou usamos Garbage Collector
![Page 55: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/55.jpg)
Ou damos free() na mão ou usamos Garbage Collector
ou usamos Rust e o seu sistema de ownership
![Page 56: Scala: unindo programação funcional e orientação a objetos](https://reader035.vdocuments.mx/reader035/viewer/2022081515/58ef40a51a28abca578b4589/html5/thumbnails/56.jpg)
Sempre dá pra melhorar