A simplicidade do
paradigma
funcional.
O poder do
Functional First
Development.
Slide 8
Slide 8 text
A simplicidade do
paradigma
funcional.
O poder do
Functional First
Development.
SOLID
Slide 9
Slide 9 text
λ Paradigma funcional
Slide 10
Slide 10 text
No content
Slide 11
Slide 11 text
O que é uma função?
Slide 12
Slide 12 text
O que é uma função?
É o mapeamento de uma entrada para uma saída.
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.
Exemplo:
f(x) = x + 1
Slide 15
Slide 15 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 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
O output é determinado pelo input!
Slide 17
Slide 17 text
No content
Slide 18
Slide 18 text
No content
Slide 19
Slide 19 text
No content
Slide 20
Slide 20 text
O output é determinado pelo input!
Slide 21
Slide 21 text
O output é determinado pelo input!
Slide 22
Slide 22 text
O output é determinado pelo input!
Discover Define Develop Deliver
Slide 23
Slide 23 text
O output é determinado pelo input!
Discover Define Develop Deliver
Slide 24
Slide 24 text
O output é determinado pelo input!
Discover Define Develop Deliver
Double Diamond = Design process
Slide 25
Slide 25 text
"Most of the biggest problems in
software are problems of
misconception.
— Rich Hickey
(Criador da linguagem Closure)
Slide 26
Slide 26 text
Programação funcional:
Dois fatos históricos
Slide 27
Slide 27 text
1. Lambda calculus
λ-calculus
Slide 28
Slide 28 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 29
Slide 29 text
2. Linguagem
de programação Lisp
Slide 30
Slide 30 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 31
Slide 31 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 32
Slide 32 text
Lisp - Executando uma função anônima (λ)
Slide 33
Slide 33 text
Lisp - Executando uma função anônima (λ)
Slide 34
Slide 34 text
Lisp - Executando uma função anônima (λ)
Slide 35
Slide 35 text
Lisp - Executando uma função anônima (λ)
Slide 36
Slide 36 text
Resultado
Lisp - Executando uma função anônima (λ)
Slide 37
Slide 37 text
Lisp - Executando uma função anônima (λ)
Slide 38
Slide 38 text
Semelhanças entre
λ-calculus e LISP
Slide 39
Slide 39 text
No content
Slide 40
Slide 40 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 41
Slide 41 text
Bacana, mas o que isso tudo tem
haver com Ruby?
Slide 42
Slide 42 text
https://www.ruby-lang.org/en/about
Slide 43
Slide 43 text
No content
Slide 44
Slide 44 text
No content
Slide 45
Slide 45 text
Semelhanças entre
λ-calculus, LISP e Ruby
Slide 46
Slide 46 text
No content
Slide 47
Slide 47 text
Semelhanças entre
λ-calculus, LISP, Ruby e Javascript
(Rápida curiosidade)
Slide 48
Slide 48 text
No content
Slide 49
Slide 49 text
Para quem curtiu a introdução...
Slide 50
Slide 50 text
No content
Slide 51
Slide 51 text
No content
Slide 52
Slide 52 text
Alerta de Spoiler
Slide 53
Slide 53 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 54
Slide 54 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 65
Slide 65 text
First-class functions
Função é um tipo de dado
Slide 66
Slide 66 text
Higher-order functions
Funções podem receber e retornar
funções
Slide 67
Slide 67 text
Higher-order functions (1 de 3)
Funções podem receber e retornar funções
Slide 68
Slide 68 text
Higher-order functions (2 de 3)
Funções podem receber e retornar funções
Slide 69
Slide 69 text
Higher-order functions (3 de 3)
Funções podem receber e retornar funções
Slide 70
Slide 70 text
Higher-order functions (3 de 3)
Slide 71
Slide 71 text
Pure-functions
Operações sem side-effects
(memória ou I/O)
Slide 72
Slide 72 text
Pure functions (1 de 4)
Operações sem side-effects (memória ou I/O)
Slide 73
Slide 73 text
(...
Legenda: Abrindo um rápido parêntese
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?
Slide 75
Slide 75 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 76
Slide 76 text
Pure functions (1 de 4)
Operações sem side-effects (memória ou I/O)
O que significa closure?
Slide 77
Slide 77 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 78
Slide 78 text
…)
Legenda: Fechando o parêntese
Slide 79
Slide 79 text
Pure functions (2 de 4)
Operações sem side-effects (memória ou I/O)
Slide 80
Slide 80 text
Pure functions (3 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
Pure functions (4 de 4)
Operações sem side-effects (memória ou I/O)
Slide 83
Slide 83 text
Recursion
Slide 84
Slide 84 text
Recursion
Slide 85
Slide 85 text
Recursion
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
Strict versus non-strict evaluation
Lazy evaluation = computar um resultado apenas quando necessário
Slide 89
Slide 89 text
Type systems
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!
Slide 91
Slide 91 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 92
Slide 92 text
Type Systems (1 de 2)
Slide 93
Slide 93 text
Type Systems (2 de 2)
Slide 94
Slide 94 text
(...
Legenda: Abrindo um rápido parêntese
Slide 95
Slide 95 text
Type Systems (2 de 2)
Closures!
Slide 96
Slide 96 text
Type Systems (2 de 2)
Assim como um Hash, lambdas
podem ser invocadas com
colchetes
Slide 97
Slide 97 text
…)
Legenda: Fechando o parêntese
Slide 98
Slide 98 text
Type Systems (2 de 2)
Slide 99
Slide 99 text
Imutabilidade
Referential transparency
Slide 100
Slide 100 text
Referential transparency (1 de 4)
Imutabilidade
Slide 101
Slide 101 text
Operações sem side-effects (memória ou I/O)
Imutabilidade
Referential transparency (2 de 4)
Slide 102
Slide 102 text
Operações sem side-effects (memória ou I/O)
Referential transparency (3 de 4)
Imutabilidade
Slide 103
Slide 103 text
Operações sem side-effects (memória ou I/O)
Imutabilidade
Referential transparency (4 de 4)
Slide 104
Slide 104 text
(...
Legenda: Abrindo um rápido parêntese
Slide 105
Slide 105 text
Operações sem side-effects (memória ou I/O)
Imutabilidade
Referential transparency (4 de 4)
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 .()
Slide 107
Slide 107 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 108
Slide 108 text
…)
Legenda: Fechando o parêntese
Slide 109
Slide 109 text
Referential transparency
Imutabilidade
Slide 110
Slide 110 text
Ruby é funcional?
λ + = ?%
Slide 111
Slide 111 text
Photo by Maarten van den Heuvel on Unsplash
Aplicação prática
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!
Slide 140
Slide 140 text
Photo by Maarten van den Heuvel on Unsplash
Aplicação prática
Slide 141
Slide 141 text
Rakefile
Functional Objects
bit.ly/2Qqsqq2
Slide 142
Slide 142 text
No content
Slide 143
Slide 143 text
No content
Slide 144
Slide 144 text
No content
Slide 145
Slide 145 text
No content
Slide 146
Slide 146 text
No content
Slide 147
Slide 147 text
No content
Slide 148
Slide 148 text
No content
Slide 149
Slide 149 text
No content
Slide 150
Slide 150 text
No content
Slide 151
Slide 151 text
No content
Slide 152
Slide 152 text
No content
Slide 153
Slide 153 text
No content
Slide 154
Slide 154 text
https://github.com/serradura/request_via
Slide 155
Slide 155 text
No content
Slide 156
Slide 156 text
λ O poder do Functional
First Development
Slide 157
Slide 157 text
"So much complexity in software
comes from trying to
make one thing do two things."
— Ryan Singer
Slide 158
Slide 158 text
ActiveRecord model
Slide 159
Slide 159 text
ActiveRecord model
Slide 160
Slide 160 text
ActiveRecord model
Mapeia os registros do banco de dados para objetos Ruby
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
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
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)
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.
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.
Slide 166
Slide 166 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.
Desafio:
Como obter um código expressivo,
sequencialmente lógico e modular?
Slide 167
Slide 167 text
SOLID
Slide 168
Slide 168 text
Functional Objects
Slide 169
Slide 169 text
Sua classe/objeto é um verbo e faz
uma única coisa?
Então ela se comporta como uma
função!
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
Slide 176
Slide 176 text
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
Slide 177
Slide 177 text
SOLID + Princípios Funcionais
Slide 178
Slide 178 text
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.
Slide 179
Slide 179 text
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.
Slide 180
Slide 180 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 181
Slide 181 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 182
Slide 182 text
ou melhor...
Slide 183
Slide 183 text
seja DRY!
(Don’t Repeat Yourself)
Slide 184
Slide 184 text
No content
Slide 185
Slide 185 text
No content
Slide 186
Slide 186 text
No content
Slide 187
Slide 187 text
A simplicidade do
paradigma
funcional.
O poder do
Functional First
Development.
Opa! Calma aí…
E aquela parada de Functional First Development?
Slide 188
Slide 188 text
Functional First Development
Slide 189
Slide 189 text
First, code
everything you can
without using any
side effects.
Then, code your
side effects.
Functional First Development
Slide 190
Slide 190 text
No content
Slide 191
Slide 191 text
No content
Slide 192
Slide 192 text
dry-transaction
Slide 193
Slide 193 text
Photo by Maarten van den Heuvel on Unsplash
Aplicação prática