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

Programação funcional com Ruby, potencialize e simplifique qualquer codebase

Programação funcional com Ruby, potencialize e simplifique qualquer codebase

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 proposta orientada a objetos e 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 uma aplicação Rails na prática do OOP ao FP.

Rodrigo Serradura

July 21, 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. 1. Testes automatizados visam garantir as regras de negócios. ﹡

    Testes seguem a estrutura de uma função. Ex: (Arrange, Act, Assert) 2. Linters servem de input para um código padronizado. 3. Retrospectivas ágeis avaliam o output para melhorar o próximo input. 4. UX - Discovery > Delivery Princípios funcionais para a vida
  5. "Most of the biggest problems in software are problems of

    misconception. — Rich Hickey (Criador da linguagem Closure)
  6. 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²
  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. 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:
  9. 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.
  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. 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...
  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?
  13. 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
  14. 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.
  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!
  16. 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.
  17. Type Systems (2 de 2) Assim como um Hash, lambdas

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

    de 4) Em Ruby, podemos invocar qualquer callable com .()
  19. 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)
  20. Functional objects (Parte 1 de 2) Sua classe é um

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

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

    objetos Ruby Contém as regras de validação de estado dos objetos
  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
  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)
  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.
  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.
  27. 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. Potencializar + simplificar = Código expressivo, sequencialmente lógico e modular.
  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 == Design by contract
  30. Single responsibility principle Open/closed principle Liskov substitution principle Interface segregation

    principle Dependency inversion principle CreateUser CreateUser.new(UserRepository) .call == 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 == Design by contract Composition over Inheritance CreateUser é abstrato por não ter implementar o Repository
  32. 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?
  33. 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!
  34. A simplicidade do paradigma funcional. O poder do Functional First

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

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

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

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

    Que tal canalizar, modularizar e maximizar todo o potencial? λ, .( )
  39. "The cost of adding a feature isn’t just the time

    it takes to code it. The cost also includes the addition of an obstacle to future expansion. The trick is to pick the features that don’t fight each other." — John Carmack