Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Programação funcional em Ruby - Rubyconf Brasil 2018

Programação funcional em Ruby - Rubyconf Brasil 2018

Pergunta: Quantos problemas você já teve de lidar por conta de abstrações complexas e pouco coesas? Ruby é uma linguagem multiparadigma, ou seja, permite o desenvolvimento de aplicações em uma abordagem orientada a objetos e/ou funcional. Nessa talk iremos entender como reduzir a complexidade e potencializar resultados ao fazer uso dos recursos funcionais que o Ruby suporta. Tópicos que serão abordados: Introdução aos princípios funcionais, Functional first development e como refatorar aplicações Ruby na prática do Procedural/OOP ao FP.

Rodrigo Serradura

December 14, 2018
Tweet

More Decks by Rodrigo Serradura

Other Decks in Programming

Transcript

  1. O que é uma função? É o mapeamento de uma

    entrada para uma saída. Exemplo: f(x) = x + 1
  2. O que é uma função? É o mapeamento de uma

    entrada para uma saída. Exemplo: f(x) = x + 1 f(2) == 3 f(3) == 4
  3. O que é uma função? É o mapeamento de uma

    entrada para uma saída. Exemplo: f(x) = x + 1 f(2) == 3 f(3) == 4 O output é determinado pelo input!
  4. "Most of the biggest problems in software are problems of

    misconception. — Rich Hickey (Criador da linguagem Closure)
  5. Lambda Calculus • Criada em 1930 (88 anos atrás). •

    Representa computações matemáticas através de funções anônimas. • Exemplos de funções: quadrado = (x) ↦ x * x soma_dos_quadrados = (x, y) ↦ x² + y²
  6. Lisp • Criada em 1958 (60 anos atrás). • Segunda

    linguagem de programação mais antiga. (Fortran - imperativa - é por apenas um ano, há mais antiga. • Sintaxe influenciada pelo λ-calculus. • Exemplos de funções:
  7. Lisp • Criada em 1958 (60 anos atrás). • Segunda

    linguagem de programação mais antiga. (Fortran - imperativa - é por apenas um ano, há mais antiga. • Sintaxe influenciada pelo λ-calculus. • Exemplos de funções:
  8. Resumo até aqui... 1. Programação funcional tem origem na matemática.

    2. λ-calculus: Representa computações matemáticas através de funções anônimas. 3. LISP (a primeira linguagem funcional) tem influência do λ-calculus.
  9. Desse ponto em diante, todos os conceitos poderão ser aplicados

    em qualquer linguagem que suporte princípios funcionais. Ex: Javascript, Python, Java (8+), Kotlin, Swift...
  10. Desse ponto em diante, todos os conceitos poderão ser aplicados

    em qualquer linguagem que suporte princípios funcionais. Ex: Javascript, Python, Java (8+), Kotlin, Swift...
  11. Pure functions (1 de 4) Operações sem side-effects (memória ou

    I/O) Como a função tem acesso a variável counter?
  12. Pure functions (1 de 4) Operações sem side-effects (memória ou

    I/O) Como a função tem acesso a variável counter? Resposta: closure
  13. Pure functions (1 de 4) Operações sem side-effects (memória ou

    I/O) O que significa closure? R: Capacidade da função em "lembrar" do escopo em que foi declarada.
  14. O que é uma função? É o mapeamento de uma

    entrada para uma saída. Exemplo: f(x) = x + 1 f(2) == 3 f(3) == 4 O output é determinado pelo input!
  15. O que é uma função? É o mapeamento de uma

    entrada para uma saída. Exemplo: f(x) = x + 1 f(2) == 3 f(3) == 4 O output é determinado pelo input! Quanto mais garantido o input melhores serão as garantias (corretude) do output.
  16. Type Systems (2 de 2) Assim como um Hash, lambdas

    podem ser invocadas com colchetes
  17. Operações sem side-effects (memória ou I/O) Imutabilidade Referential transparency (4

    de 4) Em Ruby, podemos invocar qualquer callable com .()
  18. Operações sem side-effects (memória ou I/O) Imutabilidade Referential transparency (4

    de 4) Em Ruby, podemos invocar qualquer callable com .() sum.call(1, 1) sum.(1, 1)
  19. Functional objects (Parte 1 de 2) Sua classe/objeto é um

    verbo e faz uma única coisa? Então ela se comporta como uma função!
  20. "So much complexity in software comes from trying to make

    one thing do two things." — Ryan Singer
  21. ActiveRecord model Mapeia os registros do banco de dados para

    objetos Ruby Contém as regras de validação de estado dos objetos
  22. ActiveRecord model Mapeia os registros do banco de dados para

    objetos Ruby Contém as regras de validação de estado dos objetos Gerencia as operações de CRUD
  23. ActiveRecord model Mapeia os registros do banco de dados para

    objetos Ruby Contém as regras de validação de estado dos objetos Gerencia as operações de CRUD Permite criar comandos para serem executados antes e depois das operações de CRUD. (callbacks)
  24. ActiveRecord model Mapeia os registros do banco de dados para

    objetos Ruby Contém as regras de validação de estado dos objetos Gerencia as operações de CRUD Permite criar comandos para serem executados antes e depois das operações de CRUD. (callbacks) Encapsula a construção de queries complexas.
  25. ActiveRecord model Mapeia os registros do banco de dados para

    objetos Ruby Contém as regras de validação de estado dos objetos Gerencia as operações de CRUD Permite criar comandos para serem executados antes e depois das operações de CRUD. (callbacks) Encapsula a construção de queries complexas. Encapsula as regras de negócio da sua aplicação.
  26. ActiveRecord model Mapeia os registros do banco de dados para

    objetos Ruby Contém as regras de validação de estado dos objetos Gerencia as operações de CRUD Permite criar comandos para serem executados antes e depois das operações de CRUD. (callbacks) Encapsula a construção de queries complexas. Encapsula as regras de negócio da sua aplicação. Desafio: Como obter um código expressivo, sequencialmente lógico e modular?
  27. Sua classe/objeto é um verbo e faz uma única coisa?

    Então ela se comporta como uma função!
  28. Single responsibility principle Open/closed principle Liskov substitution principle Interface segregation

    principle Dependency inversion principle CreateUser CreateUser.new(UserRepository)
  29. Single responsibility principle Open/closed principle Liskov substitution principle Interface segregation

    principle Dependency inversion principle CreateUser CreateUser.new(UserRepository) .call(input) == Design by contract
  30. Single responsibility principle Open/closed principle Liskov substitution principle Interface segregation

    principle Dependency inversion principle CreateUser CreateUser.new(UserRepository) .call(input) == Design by contract Composition over Inheritance
  31. Single responsibility principle Open/closed principle Liskov substitution principle Interface segregation

    principle Dependency inversion principle CreateUser CreateUser.new(UserRepository) .call(input) == Design by contract Composition over Inheritance CreateUser é uma abstração por não ter de implementar o Repository
  32. SOLID + Princípios Funcionais 1. Uma função faz uma única

    coisa e muito bem. 2. Use uma composição de funções para atender requisitos complexos. 3. Atenção: A composição tem que ser sequencialmente lógica e expressiva. 4. Dica: Modularize apenas o necessário. 5.
  33. SOLID + Princípios Funcionais 1. Uma função faz uma única

    coisa e muito bem. 2. Use uma composição de funções para atender requisitos complexos. 3. Atenção: A composição tem que ser sequencialmente lógica e expressiva. 4. Dica: Modularize apenas o necessário. 5. Troque função por objeto no texto acima e tudo irá funcionar.
  34. ActiveRecord model Mapeia os registros do banco de dados para

    objetos Ruby Contém as regras de validação de estado dos objetos Gerencia as operações de CRUD Permite criar comandos para serem executados antes e depois das operações de CRUD. (callbacks) Encapsula a construção de queries complexas. Encapsula as regras de negócio da sua aplicação. Pensando no ActiveRecord… Como ser SOLID já que o mesmo tem tantas funcionalidades / responsabilidades?
  35. ActiveRecord model Mapeia os registros do banco de dados para

    objetos Ruby Contém as regras de validação de estado dos objetos Gerencia as operações de CRUD Permite criar comandos para serem executados antes e depois das operações de CRUD. (callbacks) Encapsula a construção de queries complexas. Encapsula as regras de negócio da sua aplicação. Pensando no ActiveRecord… Como ser SOLID já que o mesmo tem tantas funcionalidades / responsabilidades? Resposta: Crie implementações para cada uma dessas responsabilidades!
  36. A simplicidade do paradigma funcional. O poder do Functional First

    Development. Opa! Calma aí… E aquela parada de Functional First Development?
  37. First, code everything you can without using any side effects.

    Then, code your side effects. Functional First Development
  38. Mecanismo de entrega: HTTP Outros tipos: Tasks (ETL), Background jobs

    Domínio Operações: R(ead) Operações: CRUD
  39. M V C ActiveRecord, Rails... tem um enorme poder contido.

    Que tal canalizar, modularizar e maximizar todo o potencial?
  40. M V C ActiveRecord, Rails... tem um enorme poder contido.

    Que tal canalizar, modularizar e maximizar todo o potencial? λ, .( )
  41. "Sometimes, the elegant implementation is just a function. Not a

    method. Not a class. Not a framework. Just a function." — John Carmack