scala: unindo programação funcional e orientação a objetos

57
Scala Unindo programação funcional e orientação a objetos Felipe Hummel

Upload: felipe-hummel

Post on 13-Apr-2017

197 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Scala: unindo programação funcional e orientação a objetos

Scala Unindo programação funcional

e orientação a objetos

Felipe Hummel

Page 2: Scala: unindo programação funcional e orientação a objetos

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

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

Scala, quem usa?

Page 5: Scala: unindo programação funcional e orientação a objetos

Scala, quem usa?

Page 6: Scala: unindo programação funcional e orientação a objetos

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

Scala

Page 8: Scala: unindo programação funcional e orientação a objetos

sudo apt-get install scala

Page 9: Scala: unindo programação funcional e orientação a objetos

Val e Var

val soma = 1 + 1

Page 10: Scala: unindo programação funcional e orientação a objetos

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

Val e Var

var soma = 1 + 1

Page 12: Scala: unindo programação funcional e orientação a objetos

Val e Var

var soma = 1 + 1 soma = soma + 1 //OK!

Page 13: Scala: unindo programação funcional e orientação a objetos

Inferência de tipos

val soma = 1 + 1

Page 14: Scala: unindo programação funcional e orientação a objetos

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

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

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

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

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

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

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

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

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

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

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

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

Classes

// ISSO É SCALA CORRETO! class Curso(id: Int, nome: String)

Page 27: Scala: unindo programação funcional e orientação a objetos

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

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

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

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

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

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

case class Person(firstName: String, lastName: String)

Page 34: Scala: unindo programação funcional e orientação a objetos

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

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

Coleções!

Page 37: Scala: unindo programação funcional e orientação a objetos

Mão na massa

Page 38: Scala: unindo programação funcional e orientação a objetos

Scala é isso

Page 39: Scala: unindo programação funcional e orientação a objetos

80% de Scala é isso

Page 40: Scala: unindo programação funcional e orientação a objetos

Scala mudou a forma

como programamos

Page 41: Scala: unindo programação funcional e orientação a objetos

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

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

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

Null Pointer Exc… NÃO

• Uso de Option[MeuTipo] quando necessário

Page 45: Scala: unindo programação funcional e orientação a objetos

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

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

Scala é a melhor coisa do mundo?

Page 48: Scala: unindo programação funcional e orientação a objetos

Scala é a melhor coisa do mundo?

Page 49: Scala: unindo programação funcional e orientação a objetos

A minha linguagem/framework/biblioteca

não é a melhor possível

Page 50: Scala: unindo programação funcional e orientação a objetos

Mais conciso e expressivo que Scala é impossível

Page 51: Scala: unindo programação funcional e orientação a objetos

Mais conciso e expressivo que Haskell é impossível

Page 52: Scala: unindo programação funcional e orientação a objetos

Programação é sempre um comando seguido do outro

Page 53: Scala: unindo programação funcional e orientação a objetos

Programação pode ser só (funções (chamando (funções ‘!’)))

em Clojure

Page 54: Scala: unindo programação funcional e orientação a objetos

Ou damos free() na mão ou usamos Garbage Collector

Page 55: Scala: unindo programação funcional e orientação a objetos

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

Sempre dá pra melhorar

Page 57: Scala: unindo programação funcional e orientação a objetos

Obrigado! Dúvidas?

@felipehummel [email protected]