SlideShare uma empresa Scribd logo
1 de 57
Baixar para ler offline
Scala
Unindo programação funcional
e orientação a objetos
Felipe Hummel
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
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
Scala, quem usa?
Scala, quem usa?
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
Scala
sudo apt-get install scala
Val e Var
val soma = 1 + 1

Val e Var
val soma = 1 + 1

soma = 10 //error: reassignment to val
Val e Var
var soma = 1 + 1

Val e Var
var soma = 1 + 1

soma = soma + 1 //OK!
Inferência de tipos
val soma = 1 + 1

Inferência de tipos


val soma: Int = 1 + 1

soma.substring(0)

//error: value substring is not a member of Int
Inferência de tipos


val soma = 1 + 1

soma.substring(0)

//error: value substring is not a member of Int
Inferência de tipos
val soma: Int = 1 + 1

val nome: String = “teste"

val lista: List[String] = List(“teste”)

Inferência de tipos
val soma = 1 + 1

val nome = “teste"

val lista = List(“teste”)

Funções


def add1(n: Int) = n + 1

// ^ inferência de tipo de retorno
Funções


def add1(n: Int): Int = n + 1

// ^ tipo de retorno explícito
Funções


def add1(n: Int): Int = { 

println(“adicionando 1”)

n + 1 // última expressão: retorno automático

}

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

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

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
Classes
class Curso(id: Int, nome: String)

class Aluno(id: Int, curso: Curso, idade: Int)
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

}

}
Classes
// ISSO É SCALA CORRETO! 

class Curso(id: Int, nome: String)









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
Classes




class Curso(val id: Int, val nome: String)



val computacao = new Curso(1,“Computação”)



println(computacao.nome) 

// Computação

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)
case classes










case class Curso(id: Int, nome: String)



val computacao = Curso(1,“Computação”)



println(computacao) 

// Curso(1, Computação)
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)
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);

}

}
case class Person(firstName: String, lastName: String)
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



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)

Coleções!
Mão na massa
Scala é isso
80% de Scala é isso
Scala
mudou a forma
como programamos
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)
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)
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
!!!!!!!!!
Null Pointer Exc… NÃO
• Uso de Option[MeuTipo] quando necessário
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
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
Scala é a melhor coisa do
mundo?
Scala é a melhor coisa do
mundo?
A minha
linguagem/framework/biblioteca
não é a melhor possível
Mais conciso e expressivo
que Scala é impossível
Mais conciso e expressivo
que Haskell é impossível
Programação é sempre um
comando seguido do outro
Programação pode ser só
(funções (chamando (funções ‘!’)))
em Clojure
Ou damos free() na mão
ou usamos Garbage Collector
Ou damos free() na mão
ou usamos Garbage Collector
ou usamos Rust
e o seu sistema de ownership
Sempre dá pra melhorar
Obrigado!
Dúvidas?
@felipehummel
felipehummel@gmail.com

Mais conteúdo relacionado

Mais procurados

Iteraveis e geradores em Python
Iteraveis e geradores em PythonIteraveis e geradores em Python
Iteraveis e geradores em PythonLuciano Ramalho
 
Python e django na prática
Python e django na práticaPython e django na prática
Python e django na práticaRafael Cassau
 
Programação orientada a objetos - IV
Programação orientada a objetos - IVProgramação orientada a objetos - IV
Programação orientada a objetos - IVGabriel Faustino
 
Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)Luciano Ramalho
 
Programação orientada a objetos – III
Programação orientada a objetos – IIIProgramação orientada a objetos – III
Programação orientada a objetos – IIIGabriel Faustino
 
Programando para web com python - Introdução a Python
Programando para web com python - Introdução a PythonProgramando para web com python - Introdução a Python
Programando para web com python - Introdução a PythonAlvaro Oliveira
 
Python: a primeira mordida
Python: a primeira mordidaPython: a primeira mordida
Python: a primeira mordidaLuciano Ramalho
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOWesley Lemos
 
Python: programação divertida novamente
Python: programação divertida novamentePython: programação divertida novamente
Python: programação divertida novamenteRodrigo Amaral
 
Desenvolvimento iOS - Aula 1
Desenvolvimento iOS - Aula 1Desenvolvimento iOS - Aula 1
Desenvolvimento iOS - Aula 1Saulo Arruda
 
JavaScript for Beginners
JavaScript for BeginnersJavaScript for Beginners
JavaScript for BeginnersSAPO Sessions
 
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...tdc-globalcode
 
Arduino e Python: Do It Yourself
Arduino e Python: Do It YourselfArduino e Python: Do It Yourself
Arduino e Python: Do It YourselfBruno Nascimento
 

Mais procurados (20)

Iteraveis e geradores em Python
Iteraveis e geradores em PythonIteraveis e geradores em Python
Iteraveis e geradores em Python
 
Python e django na prática
Python e django na práticaPython e django na prática
Python e django na prática
 
Programação orientada a objetos - IV
Programação orientada a objetos - IVProgramação orientada a objetos - IV
Programação orientada a objetos - IV
 
Javafx Introdução
Javafx IntroduçãoJavafx Introdução
Javafx Introdução
 
Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)
 
Programação orientada a objetos – III
Programação orientada a objetos – IIIProgramação orientada a objetos – III
Programação orientada a objetos – III
 
Java Básico
Java BásicoJava Básico
Java Básico
 
Programando para web com python - Introdução a Python
Programando para web com python - Introdução a PythonProgramando para web com python - Introdução a Python
Programando para web com python - Introdução a Python
 
Python: a primeira mordida
Python: a primeira mordidaPython: a primeira mordida
Python: a primeira mordida
 
Introdução ao paradigma funcional com scala
Introdução ao paradigma funcional com scalaIntrodução ao paradigma funcional com scala
Introdução ao paradigma funcional com scala
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POO
 
Migrando pra Scala
Migrando pra ScalaMigrando pra Scala
Migrando pra Scala
 
Python: programação divertida novamente
Python: programação divertida novamentePython: programação divertida novamente
Python: programação divertida novamente
 
Java para iniciantes
Java para iniciantesJava para iniciantes
Java para iniciantes
 
Desenvolvimento iOS - Aula 1
Desenvolvimento iOS - Aula 1Desenvolvimento iOS - Aula 1
Desenvolvimento iOS - Aula 1
 
JavaScript for Beginners
JavaScript for BeginnersJavaScript for Beginners
JavaScript for Beginners
 
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...
 
Arduino e Python: Do It Yourself
Arduino e Python: Do It YourselfArduino e Python: Do It Yourself
Arduino e Python: Do It Yourself
 
Programando com Python
Programando com PythonProgramando com Python
Programando com Python
 
Aprendendo ruby
Aprendendo rubyAprendendo ruby
Aprendendo ruby
 

Semelhante a Unindo programação funcional e orientação a objetos em Scala

Semelhante a Unindo programação funcional e orientação a objetos em Scala (20)

Turbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com KotlinTurbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com Kotlin
 
Slide_Python.pdf
Slide_Python.pdfSlide_Python.pdf
Slide_Python.pdf
 
Python2.5.ppt
Python2.5.pptPython2.5.ppt
Python2.5.ppt
 
Usando POP com Programação Funcional
Usando POP com Programação FuncionalUsando POP com Programação Funcional
Usando POP com Programação Funcional
 
Python para desenvolvedores - material apoio (parte I)
Python para desenvolvedores - material apoio (parte I)Python para desenvolvedores - material apoio (parte I)
Python para desenvolvedores - material apoio (parte I)
 
Matando o Java e Mostrando o Python
Matando o Java e Mostrando o PythonMatando o Java e Mostrando o Python
Matando o Java e Mostrando o Python
 
JavaScript - A Linguagem
JavaScript - A LinguagemJavaScript - A Linguagem
JavaScript - A Linguagem
 
Java - Visão geral e Exercícios
Java - Visão geral e ExercíciosJava - Visão geral e Exercícios
Java - Visão geral e Exercícios
 
JAVA - Introdução
JAVA - IntroduçãoJAVA - Introdução
JAVA - Introdução
 
Java Desktop
Java DesktopJava Desktop
Java Desktop
 
Python: Iteraveis, geradores etc
Python: Iteraveis, geradores etcPython: Iteraveis, geradores etc
Python: Iteraveis, geradores etc
 
Minicurso Python
Minicurso PythonMinicurso Python
Minicurso Python
 
Aula python
Aula pythonAula python
Aula python
 
05 poo-ii
05   poo-ii05   poo-ii
05 poo-ii
 
Introdução ao Java 5
Introdução ao Java 5Introdução ao Java 5
Introdução ao Java 5
 
Cap10
Cap10Cap10
Cap10
 
Aula3PythonBasico (1).ppt
Aula3PythonBasico (1).pptAula3PythonBasico (1).ppt
Aula3PythonBasico (1).ppt
 
Aula3PythonBasico.ppt
Aula3PythonBasico.pptAula3PythonBasico.ppt
Aula3PythonBasico.ppt
 
C#4 – O que há de novo
C#4 – O que há de novoC#4 – O que há de novo
C#4 – O que há de novo
 
Introducao Google GO
Introducao Google GOIntroducao Google GO
Introducao Google GO
 

Unindo programação funcional e orientação a objetos em Scala

  • 1. Scala Unindo programação funcional e orientação a objetos Felipe Hummel
  • 2. 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
  • 3. 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
  • 6. 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
  • 9. Val e Var val soma = 1 + 1

  • 10. Val e Var val soma = 1 + 1
 soma = 10 //error: reassignment to val
  • 11. Val e Var var soma = 1 + 1

  • 12. Val e Var var soma = 1 + 1
 soma = soma + 1 //OK!
  • 13. Inferência de tipos val soma = 1 + 1

  • 14. Inferência de tipos 
 val soma: Int = 1 + 1
 soma.substring(0)
 //error: value substring is not a member of Int
  • 15. Inferência de tipos 
 val soma = 1 + 1
 soma.substring(0)
 //error: value substring is not a member of Int
  • 16. Inferência de tipos val soma: Int = 1 + 1
 val nome: String = “teste"
 val lista: List[String] = List(“teste”)

  • 17. Inferência de tipos val soma = 1 + 1
 val nome = “teste"
 val lista = List(“teste”)

  • 18. Funções 
 def add1(n: Int) = n + 1
 // ^ inferência de tipo de retorno
  • 19. Funções 
 def add1(n: Int): Int = n + 1
 // ^ tipo de retorno explícito
  • 20. Funções 
 def add1(n: Int): Int = { 
 println(“adicionando 1”)
 n + 1 // última expressão: retorno automático
 }

  • 21. 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

  • 22. 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

  • 23. 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
  • 24. Classes class Curso(id: Int, nome: String)
 class Aluno(id: Int, curso: Curso, idade: Int)
  • 25. 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
 }
 }
  • 26. Classes // ISSO É SCALA CORRETO! 
 class Curso(id: Int, nome: String)
 
 
 
 

  • 27. 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
  • 28. Classes 
 
 class Curso(val id: Int, val nome: String)
 
 val computacao = new Curso(1,“Computação”)
 
 println(computacao.nome) 
 // Computação

  • 29. 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)
  • 30. case classes 
 
 
 
 
 case class Curso(id: Int, nome: String)
 
 val computacao = Curso(1,“Computação”)
 
 println(computacao) 
 // Curso(1, Computação)
  • 31. 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)
  • 32. 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);
 }
 }
  • 33. case class Person(firstName: String, lastName: String)
  • 34. 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
 

  • 35. 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)

  • 39. 80% de Scala é isso
  • 41. 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)
  • 42. 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)
  • 43. 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 !!!!!!!!!
  • 44. Null Pointer Exc… NÃO • Uso de Option[MeuTipo] quando necessário
  • 45. 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
  • 46. 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
  • 47. Scala é a melhor coisa do mundo?
  • 48. Scala é a melhor coisa do mundo?
  • 50. Mais conciso e expressivo que Scala é impossível
  • 51. Mais conciso e expressivo que Haskell é impossível
  • 52. Programação é sempre um comando seguido do outro
  • 53. Programação pode ser só (funções (chamando (funções ‘!’))) em Clojure
  • 54. Ou damos free() na mão ou usamos Garbage Collector
  • 55. Ou damos free() na mão ou usamos Garbage Collector ou usamos Rust e o seu sistema de ownership
  • 56. Sempre dá pra melhorar