SlideShare uma empresa Scribd logo
1 de 36
Baixar para ler offline
De OO para FP
ou por que decidi trabalhar com
Ander, quem é você na
fila do pão?
Coordenador ELUG-RS
Desenvolvedor na
Eng. de Computação /99
@anderkonzen
anderkonzen.com
Aviso
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent blandit sem at sollicitudin efficitur. Nunc malesuada
ligula quam, a pharetra tortor efficitur id. Phasellus tempus viverra metus, nec ultrices risus ornare ut. Fusce ac dapibus
augue. Vestibulum vestibulum elit non dapibus hendrerit. Proin in molestie nisi. In maximus mattis nulla eget
venenatis. Aliquam eget risus et magna scelerisque auctor eget in massa.
Duis et feugiat justo, eget auctor dolor. Suspendisse sed enim leo. Sed ac erat vehicula, tempus sem sit amet, posuere
orci. Proin mi mauris, convallis ac aliquet ac, interdum ut turpis. Etiam tincidunt tellus turpis, nec imperdiet elit molestie
ut. Vivamus aliquam pulvinar nisi, vitae mollis orci euismod in. Proin fermentum semper eros, et convallis sapien
suscipit eu. Proin eleifend velit vitae nulla porttitor condimentum. Suspendisse sed aliquet urna, sit amet feugiat purus.
In nec vulputate ligula. Morbi justo magna, rhoncus at rutrum sed, imperdiet tempus velit. Pellentesque convallis
sapien justo, sit amet aliquet dui egestas ac. Morbi tincidunt massa ut nulla tincidunt volutpat.
Ut vel felis non mauris rhoncus hendrerit. Integer rhoncus quam egestas aliquet condimentum. Donec interdum eros
lectus, non facilisis lorem efficitur sit amet. Curabitur eget placerat libero, nec sollicitudin urna. Quisque maximus
viverra neque vel lacinia. Proin ultrices sem nec mi dignissim, a pulvinar tellus volutpat. Nulla congue ultrices dui, ut
tempor eros mattis et. Suspendisse vulputate interdum orci, et gravida sapien ullamcorper in. Nulla dictum ipsum at
aliquam cursus.
elixir
elixir
elixir
elixir
elixir
elixir
Aviso (2)
A esta altura vocês já devem saber a resposta
para a vida, o universo e tudo mais, certo?
Aviso (2)
A esta altura vocês já devem saber a resposta
para a vida, o universo e tudo mais, certo?
Resposta:
Parte 1:
Pensamento Funcional
Primeiro estalo
Pré-processamento Calcula Notifica e Armazena
Input Output
Primeiro estalo
Pré-processamento Calcula Notifica e Armazena
Input Output
State A State B
Primeiro estalo
Pré-processamento Calcula Notifica e Armazena
Input Output
State A State B
Dado
Transformações
Saída
Pré-processamento Calcula Notifica e Armazena
Input Output
State A State B
Para mim faz mais sentido pensar em
estruturas de dados mais simples, e
que estes dados sofrem mudanças ao
longo do pipeline…
… do que usar objetos complexos
(classes), que podem ter seu estado
alterado em qualquer parte.
Pré-processamento Calcula Notifica e Armazena
Input Output
State A State B
Para mim faz mais sentido pensar em
estruturas de dados mais simples, e
que estes dados sofrem mudanças ao
longo do pipeline…
… do que usar objetos complexos
(classes), que podem ter seu estado
alterado em qualquer parte.
funções
imutabilidade
Imutabilidade
list = [1, 2, 3]
=> [1, 2, 3]
list.pop
=> 3
list.push(4)
=> [1, 2, 4]
list.inspect
=> "[1, 2, 4]"
iex(4)> list = [1, 2, 3]
[1, 2, 3]
iex(5)> List.delete_at(list, -1)
[1, 2]
iex(6)> list ++ [4]
[1, 2, 3, 4]
iex(7)> list
[1, 2, 3]
Incomodações
Um aspecto que me incomodava era
saber onde o estado de um objeto foi
modificado.
Da mesma forma, em uma classe
grande (sistema legado), quantos
estados internos podemos ter?
Pensamento Funcional
Funções são o building block
Valores são sempre imutáveis
O código é declarativo
λ
λ
λ
E perf? Qual o ganho?
Imutabilidade + processos leves + memória
não compartilhada + otimizações
=
E perf? Qual o ganho?
https://phoenixframework.org/blog/the-road-to-2-million-websocket-connections
Imutabilidade + processos leves + memória
não compartilhada + otimizações
=
E perf? Qual o ganho?
https://phoenixframework.org/blog/the-road-to-2-million-websocket-connections
MASNÃOSEILUDA!
Parte 2:
Por quê Elixir?
Por quê Elixir?
public static void detectText(String filePath, PrintStream out) throws Exception, IOException {
  List<AnnotateImageRequest> requests = new ArrayList<>();
  ByteString imgBytes = ByteString.readFrom(new FileInputStream(filePath));
  Image img = Image.newBuilder().setContent(imgBytes).build();
  Feature feat = Feature.newBuilder().setType(Type.TEXT_DETECTION).build();
  AnnotateImageRequest request =
      AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build();
  requests.add(request);
  try (ImageAnnotatorClient client = ImageAnnotatorClient.create()) {
    BatchAnnotateImagesResponse response = client.batchAnnotateImages(requests);
    List<AnnotateImageResponse> responses = response.getResponsesList();
    for (AnnotateImageResponse res : responses) {
      if (res.hasError()) {
        out.printf("Error: %sn", res.getError().getMessage());
        return;
      }
      // For full list of available annotations, see http://g.co/cloud/vision/docs
      for (EntityAnnotation annotation : res.getTextAnnotationsList()) {
        out.printf("Text: %sn", annotation.getDescription());
        out.printf("Position : %sn", annotation.getBoundingPoly());
      }
    }
  }
}
https://cloud.google.com/vision/docs/ocr
Por quê Elixir?
https://cloud.google.com/vision/docs/ocr
# image_path = "Path to local image file, eg. './image.png'"
require "google/cloud/vision"
image_annotator = Google::Cloud::Vision::ImageAnnotator.new
response = image_annotator.text_detection(
  image:       image_path,
  max_results: 1 # optional, defaults to 10
)
response.responses.each do |res|
  res.text_annotations.each do |text|
    puts text.description
  end
end
Por quê Elixir?
😔 🥰
Assim como ruby, é
dinâmica, pragmática e
sua sintaxe é clean
Por quê Elixir?
À medida que fui estudando a
linguagem, me deparei com:
Erlang, OTP, BEAMλ
Por quê Elixir?
À medida que fui estudando a
linguagem, me deparei com:
Erlang, OTP, BEAMλ
Linguagem de programação
Por quê Elixir?
À medida que fui estudando a
linguagem, me deparei com:
Erlang, OTP, BEAMλ
Open Telecom Platform: standard library + design
principles
Por quê Elixir?
À medida que fui estudando a
linguagem, me deparei com:
Erlang, OTP, BEAMλ
BEAM: virtual machine
Por quê Elixir?
À medida que fui estudando a
linguagem, me deparei com:
Erlang, OTP, BEAM
Pattern Matching
λ
λ
Por quê Elixir?
À medida que fui estudando a
linguagem, me deparei com:
Erlang, OTP, BEAM
Pattern Matching
Pipe operator |>
λ
λ
λ
Por quê Elixir?
À medida que fui estudando a
linguagem, me deparei com:
Comunidade incrívelλ
Por quê Elixir?
À medida que fui estudando a
linguagem, me deparei com:
Comunidade incrívelλ
30 anos de VMλ
Por quê Elixir?
À medida que fui estudando a
linguagem, me deparei com:
Comunidade incrívelλ
30 anos de VMλ
Tooling (mix, observer, etc)λ
Aviso Final
Ainda resta alguma dúvida quanto à resposta
para a vida, o universo e tudo mais?
Aviso Final
Resposta:
Ainda resta alguma dúvida quanto à resposta
para a vida, o universo e tudo mais?
Sugestões
The Soul of Erlang and Elixir • Saša Jurić
https://youtu.be/JvBT4XBdoUE
Elixir: A Mini-Documentary
https://doc.honeypot.io/elixir-documentary-2018/
Sugestões
https://pragtob.wordpress.com/2017/07/26/choosing-elixir-for-
the-code-not-the-performance/
http://www.akitaonrails.com/2015/12/01/the-obligatory-
why-elixir-personal-take
http://www.akitaonrails.com/2015/10/28/personal-thoughts-
on-the-current-functional-programming-bandwagon
Obrigado!
@anderkonzen
anderkonzen.com
@elugrs
https://www.meetup.com/elugrs/
@elugrs https://t.me/elugrs

Mais conteúdo relacionado

Semelhante a De OO para FP

A lógica do Python e seus termos
A lógica do Python e seus termosA lógica do Python e seus termos
A lógica do Python e seus termosValore I/O
 
Desenvolvimento de aplicações embarcadas utilizando Python
Desenvolvimento de aplicações embarcadas utilizando PythonDesenvolvimento de aplicações embarcadas utilizando Python
Desenvolvimento de aplicações embarcadas utilizando PythonFlávio Ribeiro
 
Análise Numérica Aplicada, ou "Mamãe, Excel dá Errado!"
Análise Numérica Aplicada, ou "Mamãe, Excel dá Errado!"Análise Numérica Aplicada, ou "Mamãe, Excel dá Errado!"
Análise Numérica Aplicada, ou "Mamãe, Excel dá Errado!"Alejandro Frery
 
Aula 01 python
Aula 01 pythonAula 01 python
Aula 01 pythonTiago
 
Aprenda a programar-luciano_ramalho
Aprenda a programar-luciano_ramalhoAprenda a programar-luciano_ramalho
Aprenda a programar-luciano_ramalhoFelipeDi
 
Aprenda a programar-luciano_ramalho
Aprenda a programar-luciano_ramalhoAprenda a programar-luciano_ramalho
Aprenda a programar-luciano_ramalhoWeldir Fernando Dias
 
Iniciando em Python
Iniciando em PythonIniciando em Python
Iniciando em PythonRober Guerra
 
Apostila algorítimos
Apostila algorítimosApostila algorítimos
Apostila algorítimosLuis Luisao
 
Apostila algorítimos
Apostila algorítimosApostila algorítimos
Apostila algorítimosMarcos Nori
 
AULA 06 - REVISÃO DE CONCEITOS INICIAIS DE ALGORITMOS
AULA 06 - REVISÃO DE CONCEITOS INICIAIS DE ALGORITMOSAULA 06 - REVISÃO DE CONCEITOS INICIAIS DE ALGORITMOS
AULA 06 - REVISÃO DE CONCEITOS INICIAIS DE ALGORITMOSprofjotamarcosduarte
 
Aprenda a programar-luciano_ramalho
Aprenda a programar-luciano_ramalhoAprenda a programar-luciano_ramalho
Aprenda a programar-luciano_ramalhoandreluizlugon
 
Aprenda a programar-luciano_ramalho
Aprenda a programar-luciano_ramalhoAprenda a programar-luciano_ramalho
Aprenda a programar-luciano_ramalhoUbirajara Cavaco
 
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!Intel Software Brasil
 
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!Luciano Palma
 

Semelhante a De OO para FP (20)

A lógica do Python e seus termos
A lógica do Python e seus termosA lógica do Python e seus termos
A lógica do Python e seus termos
 
Java - Primeiros passos
Java - Primeiros passosJava - Primeiros passos
Java - Primeiros passos
 
EaD sem Dor
EaD sem DorEaD sem Dor
EaD sem Dor
 
Desenvolvimento de aplicações embarcadas utilizando Python
Desenvolvimento de aplicações embarcadas utilizando PythonDesenvolvimento de aplicações embarcadas utilizando Python
Desenvolvimento de aplicações embarcadas utilizando Python
 
Aula2
Aula2Aula2
Aula2
 
Python, CPython, Pythonico, Cython
Python, CPython, Pythonico, CythonPython, CPython, Pythonico, Cython
Python, CPython, Pythonico, Cython
 
Análise Numérica Aplicada, ou "Mamãe, Excel dá Errado!"
Análise Numérica Aplicada, ou "Mamãe, Excel dá Errado!"Análise Numérica Aplicada, ou "Mamãe, Excel dá Errado!"
Análise Numérica Aplicada, ou "Mamãe, Excel dá Errado!"
 
Aula 01 python
Aula 01 pythonAula 01 python
Aula 01 python
 
Aprenda a programar-luciano_ramalho
Aprenda a programar-luciano_ramalhoAprenda a programar-luciano_ramalho
Aprenda a programar-luciano_ramalho
 
Aprenda a programar-luciano_ramalho
Aprenda a programar-luciano_ramalhoAprenda a programar-luciano_ramalho
Aprenda a programar-luciano_ramalho
 
Iniciando em Python
Iniciando em PythonIniciando em Python
Iniciando em Python
 
Apostila algorítimos
Apostila algorítimosApostila algorítimos
Apostila algorítimos
 
Apostila algorítimos
Apostila algorítimosApostila algorítimos
Apostila algorítimos
 
Apostila algoritimos
Apostila algoritimosApostila algoritimos
Apostila algoritimos
 
AULA 06 - REVISÃO DE CONCEITOS INICIAIS DE ALGORITMOS
AULA 06 - REVISÃO DE CONCEITOS INICIAIS DE ALGORITMOSAULA 06 - REVISÃO DE CONCEITOS INICIAIS DE ALGORITMOS
AULA 06 - REVISÃO DE CONCEITOS INICIAIS DE ALGORITMOS
 
Algoritmos com java script
Algoritmos com java scriptAlgoritmos com java script
Algoritmos com java script
 
Aprenda a programar-luciano_ramalho
Aprenda a programar-luciano_ramalhoAprenda a programar-luciano_ramalho
Aprenda a programar-luciano_ramalho
 
Aprenda a programar-luciano_ramalho
Aprenda a programar-luciano_ramalhoAprenda a programar-luciano_ramalho
Aprenda a programar-luciano_ramalho
 
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
 
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
 

De OO para FP

  • 1. De OO para FP ou por que decidi trabalhar com
  • 2. Ander, quem é você na fila do pão? Coordenador ELUG-RS Desenvolvedor na Eng. de Computação /99 @anderkonzen anderkonzen.com
  • 3. Aviso Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent blandit sem at sollicitudin efficitur. Nunc malesuada ligula quam, a pharetra tortor efficitur id. Phasellus tempus viverra metus, nec ultrices risus ornare ut. Fusce ac dapibus augue. Vestibulum vestibulum elit non dapibus hendrerit. Proin in molestie nisi. In maximus mattis nulla eget venenatis. Aliquam eget risus et magna scelerisque auctor eget in massa. Duis et feugiat justo, eget auctor dolor. Suspendisse sed enim leo. Sed ac erat vehicula, tempus sem sit amet, posuere orci. Proin mi mauris, convallis ac aliquet ac, interdum ut turpis. Etiam tincidunt tellus turpis, nec imperdiet elit molestie ut. Vivamus aliquam pulvinar nisi, vitae mollis orci euismod in. Proin fermentum semper eros, et convallis sapien suscipit eu. Proin eleifend velit vitae nulla porttitor condimentum. Suspendisse sed aliquet urna, sit amet feugiat purus. In nec vulputate ligula. Morbi justo magna, rhoncus at rutrum sed, imperdiet tempus velit. Pellentesque convallis sapien justo, sit amet aliquet dui egestas ac. Morbi tincidunt massa ut nulla tincidunt volutpat. Ut vel felis non mauris rhoncus hendrerit. Integer rhoncus quam egestas aliquet condimentum. Donec interdum eros lectus, non facilisis lorem efficitur sit amet. Curabitur eget placerat libero, nec sollicitudin urna. Quisque maximus viverra neque vel lacinia. Proin ultrices sem nec mi dignissim, a pulvinar tellus volutpat. Nulla congue ultrices dui, ut tempor eros mattis et. Suspendisse vulputate interdum orci, et gravida sapien ullamcorper in. Nulla dictum ipsum at aliquam cursus. elixir elixir elixir elixir elixir elixir
  • 4. Aviso (2) A esta altura vocês já devem saber a resposta para a vida, o universo e tudo mais, certo?
  • 5. Aviso (2) A esta altura vocês já devem saber a resposta para a vida, o universo e tudo mais, certo? Resposta:
  • 7. Primeiro estalo Pré-processamento Calcula Notifica e Armazena Input Output
  • 8. Primeiro estalo Pré-processamento Calcula Notifica e Armazena Input Output State A State B
  • 9. Primeiro estalo Pré-processamento Calcula Notifica e Armazena Input Output State A State B Dado Transformações Saída
  • 10. Pré-processamento Calcula Notifica e Armazena Input Output State A State B Para mim faz mais sentido pensar em estruturas de dados mais simples, e que estes dados sofrem mudanças ao longo do pipeline… … do que usar objetos complexos (classes), que podem ter seu estado alterado em qualquer parte.
  • 11. Pré-processamento Calcula Notifica e Armazena Input Output State A State B Para mim faz mais sentido pensar em estruturas de dados mais simples, e que estes dados sofrem mudanças ao longo do pipeline… … do que usar objetos complexos (classes), que podem ter seu estado alterado em qualquer parte. funções imutabilidade
  • 12. Imutabilidade list = [1, 2, 3] => [1, 2, 3] list.pop => 3 list.push(4) => [1, 2, 4] list.inspect => "[1, 2, 4]" iex(4)> list = [1, 2, 3] [1, 2, 3] iex(5)> List.delete_at(list, -1) [1, 2] iex(6)> list ++ [4] [1, 2, 3, 4] iex(7)> list [1, 2, 3]
  • 13. Incomodações Um aspecto que me incomodava era saber onde o estado de um objeto foi modificado. Da mesma forma, em uma classe grande (sistema legado), quantos estados internos podemos ter?
  • 14. Pensamento Funcional Funções são o building block Valores são sempre imutáveis O código é declarativo λ λ λ
  • 15. E perf? Qual o ganho?
  • 16. Imutabilidade + processos leves + memória não compartilhada + otimizações = E perf? Qual o ganho? https://phoenixframework.org/blog/the-road-to-2-million-websocket-connections
  • 17. Imutabilidade + processos leves + memória não compartilhada + otimizações = E perf? Qual o ganho? https://phoenixframework.org/blog/the-road-to-2-million-websocket-connections MASNÃOSEILUDA!
  • 18. Parte 2: Por quê Elixir?
  • 19. Por quê Elixir? public static void detectText(String filePath, PrintStream out) throws Exception, IOException {   List<AnnotateImageRequest> requests = new ArrayList<>();   ByteString imgBytes = ByteString.readFrom(new FileInputStream(filePath));   Image img = Image.newBuilder().setContent(imgBytes).build();   Feature feat = Feature.newBuilder().setType(Type.TEXT_DETECTION).build();   AnnotateImageRequest request =       AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build();   requests.add(request);   try (ImageAnnotatorClient client = ImageAnnotatorClient.create()) {     BatchAnnotateImagesResponse response = client.batchAnnotateImages(requests);     List<AnnotateImageResponse> responses = response.getResponsesList();     for (AnnotateImageResponse res : responses) {       if (res.hasError()) {         out.printf("Error: %sn", res.getError().getMessage());         return;       }       // For full list of available annotations, see http://g.co/cloud/vision/docs       for (EntityAnnotation annotation : res.getTextAnnotationsList()) {         out.printf("Text: %sn", annotation.getDescription());         out.printf("Position : %sn", annotation.getBoundingPoly());       }     }   } } https://cloud.google.com/vision/docs/ocr
  • 20. Por quê Elixir? https://cloud.google.com/vision/docs/ocr # image_path = "Path to local image file, eg. './image.png'" require "google/cloud/vision" image_annotator = Google::Cloud::Vision::ImageAnnotator.new response = image_annotator.text_detection(   image:       image_path,   max_results: 1 # optional, defaults to 10 ) response.responses.each do |res|   res.text_annotations.each do |text|     puts text.description   end end
  • 21. Por quê Elixir? 😔 🥰 Assim como ruby, é dinâmica, pragmática e sua sintaxe é clean
  • 22. Por quê Elixir? À medida que fui estudando a linguagem, me deparei com: Erlang, OTP, BEAMλ
  • 23. Por quê Elixir? À medida que fui estudando a linguagem, me deparei com: Erlang, OTP, BEAMλ Linguagem de programação
  • 24. Por quê Elixir? À medida que fui estudando a linguagem, me deparei com: Erlang, OTP, BEAMλ Open Telecom Platform: standard library + design principles
  • 25. Por quê Elixir? À medida que fui estudando a linguagem, me deparei com: Erlang, OTP, BEAMλ BEAM: virtual machine
  • 26. Por quê Elixir? À medida que fui estudando a linguagem, me deparei com: Erlang, OTP, BEAM Pattern Matching λ λ
  • 27. Por quê Elixir? À medida que fui estudando a linguagem, me deparei com: Erlang, OTP, BEAM Pattern Matching Pipe operator |> λ λ λ
  • 28. Por quê Elixir? À medida que fui estudando a linguagem, me deparei com: Comunidade incrívelλ
  • 29. Por quê Elixir? À medida que fui estudando a linguagem, me deparei com: Comunidade incrívelλ 30 anos de VMλ
  • 30. Por quê Elixir? À medida que fui estudando a linguagem, me deparei com: Comunidade incrívelλ 30 anos de VMλ Tooling (mix, observer, etc)λ
  • 31. Aviso Final Ainda resta alguma dúvida quanto à resposta para a vida, o universo e tudo mais?
  • 32. Aviso Final Resposta: Ainda resta alguma dúvida quanto à resposta para a vida, o universo e tudo mais?
  • 33. Sugestões The Soul of Erlang and Elixir • Saša Jurić https://youtu.be/JvBT4XBdoUE Elixir: A Mini-Documentary https://doc.honeypot.io/elixir-documentary-2018/