Potencializar + simplificar =
Código expressivo, sequencialmente lógico e
modular.
Slide 6
Slide 6 text
Potencializar + simplificar =
Código expressivo, sequencialmente lógico e
modular.
Por que?
Slide 7
Slide 7 text
Potencializar + simplificar =
Código expressivo, sequencialmente lógico e
modular.
Por que?
Como?
Slide 8
Slide 8 text
A simplicidade do
paradigma
funcional.
Slide 9
Slide 9 text
A simplicidade do
paradigma
funcional.
O poder do
Functional First
Development.
Slide 10
Slide 10 text
λ Paradigma funcional
Slide 11
Slide 11 text
No content
Slide 12
Slide 12 text
O que é uma função?
Slide 13
Slide 13 text
O que é uma função?
É o mapeamento de uma entrada para uma saída.
Slide 14
Slide 14 text
O que é uma função?
É o mapeamento de uma entrada para uma saída.
Slide 15
Slide 15 text
O que é uma função?
É o mapeamento de uma entrada para uma saída.
Exemplo:
f(x) = x + 1
Slide 16
Slide 16 text
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
Slide 17
Slide 17 text
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!
Slide 18
Slide 18 text
No content
Slide 19
Slide 19 text
No content
Slide 20
Slide 20 text
No content
Slide 21
Slide 21 text
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
Slide 22
Slide 22 text
"Most of the biggest problems in
software are problems of
misconception.
— Rich Hickey
(Criador da linguagem Closure)
Slide 23
Slide 23 text
Programação funcional:
Dois fatos históricos
Slide 24
Slide 24 text
1. Lambda calculus
λ-calculus
Slide 25
Slide 25 text
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²
Slide 26
Slide 26 text
2. Linguagem
de programação Lisp
Slide 27
Slide 27 text
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:
Slide 28
Slide 28 text
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:
Slide 29
Slide 29 text
Lisp - Executando uma função anônima (λ)
Slide 30
Slide 30 text
Lisp - Executando uma função anônima (λ)
Slide 31
Slide 31 text
Lisp - Executando uma função anônima (λ)
Slide 32
Slide 32 text
Lisp - Executando uma função anônima (λ)
Slide 33
Slide 33 text
Resultado
Lisp - Executando uma função anônima (λ)
Slide 34
Slide 34 text
Lisp - Executando uma função anônima (λ)
Slide 35
Slide 35 text
Semelhanças entre
λ-calculus e LISP
Slide 36
Slide 36 text
No content
Slide 37
Slide 37 text
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.
Slide 38
Slide 38 text
Bacana, mas o que isso tudo tem
haver com Ruby?
Slide 39
Slide 39 text
https://www.ruby-lang.org/en/about
Slide 40
Slide 40 text
No content
Slide 41
Slide 41 text
No content
Slide 42
Slide 42 text
Semelhanças entre
λ-calculus, LISP e Ruby
Slide 43
Slide 43 text
No content
Slide 44
Slide 44 text
No content
Slide 45
Slide 45 text
Semelhanças entre
λ-calculus, LISP, Ruby e Javascript
(Rápida curiosidade)
Slide 46
Slide 46 text
No content
Slide 47
Slide 47 text
Para quem curtiu a introdução...
Slide 48
Slide 48 text
No content
Slide 49
Slide 49 text
No content
Slide 50
Slide 50 text
Alerta de Spoiler
Slide 51
Slide 51 text
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...
Slide 52
Slide 52 text
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...
First-class functions
Uma função é um tipo de dado
como qualquer outro.
Slide 64
Slide 64 text
First-class functions
Função é um tipo de dado
Slide 65
Slide 65 text
Higher-order functions
Funções podem receber e retornar
funções
Slide 66
Slide 66 text
Higher-order functions (1 de 3)
Funções podem receber e retornar funções
Slide 67
Slide 67 text
Higher-order functions (2 de 3)
Funções podem receber e retornar funções
Slide 68
Slide 68 text
Higher-order functions (3 de 3)
Funções podem receber e retornar funções
Slide 69
Slide 69 text
Higher-order functions (3 de 3)
Slide 70
Slide 70 text
Pure-functions
Operações sem side-effects
(memória ou I/O)
Slide 71
Slide 71 text
Pure functions (1 de 4)
Operações sem side-effects (memória ou I/O)
Slide 72
Slide 72 text
(...
Legenda: Abrindo um rápido parêntese
Slide 73
Slide 73 text
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?
Slide 74
Slide 74 text
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
Slide 75
Slide 75 text
Pure functions (1 de 4)
Operações sem side-effects (memória ou I/O)
O que significa closure?
Slide 76
Slide 76 text
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.
Slide 77
Slide 77 text
…)
Legenda: Fechando o parêntese
Slide 78
Slide 78 text
Pure functions (2 de 4)
Operações sem side-effects (memória ou I/O)
Slide 79
Slide 79 text
Pure functions (3 de 4)
Operações sem side-effects (memória ou I/O)
Slide 80
Slide 80 text
Pure functions (4 de 4)
Operações sem side-effects (memória ou I/O)
Slide 81
Slide 81 text
Pure functions (4 de 4)
Operações sem side-effects (memória ou I/O)
Slide 82
Slide 82 text
Recursion
Slide 83
Slide 83 text
Recursion
Slide 84
Slide 84 text
Recursion
Slide 85
Slide 85 text
Strict versus non-strict evaluation
Lazy evaluation = computar um
resultado apenas quando
necessário
Slide 86
Slide 86 text
Strict versus non-strict evaluation
Lazy evaluation = computar um resultado apenas quando necessário
Slide 87
Slide 87 text
Strict versus non-strict evaluation
Lazy evaluation = computar um resultado apenas quando necessário
Slide 88
Slide 88 text
Type systems
Slide 89
Slide 89 text
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!
Slide 90
Slide 90 text
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.
Slide 91
Slide 91 text
Type Systems (1 de 2)
Slide 92
Slide 92 text
Type Systems (2 de 2)
Slide 93
Slide 93 text
(...
Legenda: Abrindo um rápido parêntese
Slide 94
Slide 94 text
Type Systems (2 de 2)
Closures!
Slide 95
Slide 95 text
Type Systems (2 de 2)
Assim como um Hash, lambdas
podem ser invocadas com
colchetes
Slide 96
Slide 96 text
…)
Legenda: Fechando o parêntese
Slide 97
Slide 97 text
Type Systems (2 de 2)
Slide 98
Slide 98 text
Imutabilidade
Referential transparency
Slide 99
Slide 99 text
Referential transparency (1 de 4)
Imutabilidade
Slide 100
Slide 100 text
Operações sem side-effects (memória ou I/O)
Imutabilidade
Referential transparency (2 de 4)
Slide 101
Slide 101 text
Operações sem side-effects (memória ou I/O)
Referential transparency (3 de 4)
Imutabilidade
Slide 102
Slide 102 text
Operações sem side-effects (memória ou I/O)
Imutabilidade
Referential transparency (4 de 4)
Slide 103
Slide 103 text
(...
Legenda: Abrindo um rápido parêntese
Slide 104
Slide 104 text
Operações sem side-effects (memória ou I/O)
Imutabilidade
Referential transparency (4 de 4)
Slide 105
Slide 105 text
Operações sem side-effects (memória ou I/O)
Imutabilidade
Referential transparency (4 de 4)
Em Ruby, podemos invocar
qualquer callable com .()
Slide 106
Slide 106 text
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)
Slide 107
Slide 107 text
…)
Legenda: Fechando o parêntese
Slide 108
Slide 108 text
Referential transparency
Imutabilidade
Slide 109
Slide 109 text
Ruby é funcional?
λ + = ?%
Slide 110
Slide 110 text
Photo by Maarten van den Heuvel on Unsplash
Aplicação prática
Slide 111
Slide 111 text
Helping the Rails helpers
Slide 112
Slide 112 text
Helping the Rails helpers
Imã para código procedural
Slide 113
Slide 113 text
Helping the Rails helpers
Imã para código ruim
Slide 114
Slide 114 text
Lambda, Lambda, Lambda
Parte 1 de 2
Slide 115
Slide 115 text
No content
Slide 116
Slide 116 text
Lorem Lorem ipsum dolor sit amet, consectetur adipiscing elit. x
Functional objects (Parte 1 de 2)
Sua classe é um verbo e faz uma
única coisa?
Então ela se comporta como uma
função!
Slide 130
Slide 130 text
…)
Legenda: Fechando o parêntese
Slide 131
Slide 131 text
No content
Slide 132
Slide 132 text
No content
Slide 133
Slide 133 text
No content
Slide 134
Slide 134 text
No content
Slide 135
Slide 135 text
(...
Legenda: Abrindo um rápido parêntese
Slide 136
Slide 136 text
Currying
Slide 137
Slide 137 text
…)
Legenda: Fechando o parêntese
Slide 138
Slide 138 text
No content
Slide 139
Slide 139 text
Components, Components...
Parte 2 de 2
Slide 140
Slide 140 text
No content
Slide 141
Slide 141 text
No content
Slide 142
Slide 142 text
No content
Slide 143
Slide 143 text
Implementação do Components::Base
Slide 144
Slide 144 text
No content
Slide 145
Slide 145 text
56 LOC
Slide 146
Slide 146 text
rails console snippets
Slide 147
Slide 147 text
rails console snippets
Slide 148
Slide 148 text
https://github.com/serradura/rails-components
Slide 149
Slide 149 text
Legal… Mas, só tem exemplos com
Rails?
Slide 150
Slide 150 text
https://github.com/serradura/request_via
Slide 151
Slide 151 text
No content
Slide 152
Slide 152 text
No content
Slide 153
Slide 153 text
Potencializar + simplificar =
Código expressivo, sequencialmente lógico e
modular.
Por que?
Como?
Slide 154
Slide 154 text
λ O poder do Functional
First Development
Slide 155
Slide 155 text
"So much complexity in software
comes from trying to
make one thing do two things."
— Ryan Singer
Slide 156
Slide 156 text
No content
Slide 157
Slide 157 text
ActiveRecord model
Slide 158
Slide 158 text
ActiveRecord model
Slide 159
Slide 159 text
ActiveRecord model
Mapeia os registros do banco de dados para objetos Ruby
Slide 160
Slide 160 text
ActiveRecord model
Mapeia os registros do banco de dados para objetos Ruby
Contém as regras de validação de estado dos objetos
Slide 161
Slide 161 text
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
Slide 162
Slide 162 text
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)
Slide 163
Slide 163 text
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.
Slide 164
Slide 164 text
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.
Slide 165
Slide 165 text
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.
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
Slide 172
Slide 172 text
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
Slide 173
Slide 173 text
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?
Slide 174
Slide 174 text
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!
Slide 175
Slide 175 text
ou melhor...
Slide 176
Slide 176 text
seja DRY!
(Don’t Repeat Yourself)
Slide 177
Slide 177 text
No content
Slide 178
Slide 178 text
No content
Slide 179
Slide 179 text
No content
Slide 180
Slide 180 text
A simplicidade do
paradigma
funcional.
O poder do
Functional First
Development.
Opa! Calma aí…
E aquela parada de Functional First Development?
Slide 181
Slide 181 text
Functional First Development
Slide 182
Slide 182 text
First, code
everything you can
without using any
side effects.
Then, code your
side effects.
Functional First Development
Mecanismo de entrega: HTTP
Outros tipos: Tasks (ETL), Background jobs
Domínio
Operações: R(ead)
Operações: CRUD
Slide 192
Slide 192 text
V
M
C
ActiveRecord, Rails... tem
um enorme poder contido.
Slide 193
Slide 193 text
M
V
C
ActiveRecord, Rails... tem
um enorme poder contido.
Que tal canalizar,
modularizar e maximizar
todo o potencial?
Slide 194
Slide 194 text
M
V
C
ActiveRecord, Rails... tem
um enorme poder contido.
Que tal canalizar,
modularizar e maximizar
todo o potencial?
λ,
.( )
Slide 195
Slide 195 text
Potencializar + simplificar =
Código expressivo, sequencialmente lógico e
modular.
Por que?
Como?
Slide 196
Slide 196 text
"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