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

De OO para FP

  • 1.
    De OO paraFP 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 dolorsit 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 estaaltura vocês já devem saber a resposta para a vida, o universo e tudo mais, certo?
  • 5.
    Aviso (2) A estaaltura vocês já devem saber a resposta para a vida, o universo e tudo mais, certo? Resposta:
  • 6.
  • 7.
    Primeiro estalo Pré-processamento CalculaNotifica e Armazena Input Output
  • 8.
    Primeiro estalo Pré-processamento CalculaNotifica e Armazena Input Output State A State B
  • 9.
    Primeiro estalo Pré-processamento CalculaNotifica e Armazena Input Output State A State B Dado Transformações Saída
  • 10.
    Pré-processamento Calcula Notificae 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 Notificae 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 queme 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ãoo building block Valores são sempre imutáveis O código é declarativo λ λ λ
  • 15.
    E perf? Qualo ganho?
  • 16.
    Imutabilidade + processosleves + 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 + processosleves + 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.
  • 19.
    Por quê Elixir? publicstatic 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 restaalguma dúvida quanto à resposta para a vida, o universo e tudo mais?
  • 32.
    Aviso Final Resposta: Ainda restaalguma dúvida quanto à resposta para a vida, o universo e tudo mais?
  • 33.
    Sugestões The Soul ofErlang and Elixir • Saša Jurić https://youtu.be/JvBT4XBdoUE Elixir: A Mini-Documentary https://doc.honeypot.io/elixir-documentary-2018/
  • 34.
  • 35.
  • 36.