Conheça ROP - Programação orientada e trilhos
Lucas Teles
@lucasteles42
@lucasteles
lucasteles.dev
https://lucasteles.dev
O que é?
Uma forma de lidar com
tratamento de erros...
Scott Wlaschin
https://fsharpforfunandprofit.com
Caminho feliz
Implementando um caso
de uso simples
Como usuário eu quero atualizar meu
nome e endereço de e-mail
Receber request
Validadar e formatar e-mail
Atualizar no banco
Enviar e-mail de verificação
Retornar resultado
Código imperativo – C#
Código funcional – F#
O que eu fazer quando algo dá errado?
Validações e mensagens de erro
Receber request
Validadar e formatar e-mail
Atualizar no banco
Enviar e-mail de verificação
Retornar resultado
Nome é branco
E-mail invalido
Usuário não encontrado
Erro no banco
Timeout
Erro de autenticação
Código imperativo
Código funcional – F#
Código funcional – F#
Request/response (non-functional) design
Data flow (functional) design
Como repassar falhas nas
funções em caso de erro?
Data flow (functional) design
Como uma função pode ter mais de uma saida?
Data flow (functional) design
Como uma função pode ter mais de uma saida?
Data flow (functional) design
Como uma função pode ter mais de uma saida?
Data flow (functional) design
• Cada caso é equivalente a uma função.
• A função ira retornar um union type com dois casos: "Success" e "Failure".
• A função do caso de uso sera construida a partir de varias funções menores, cada uma
representando um passo do fluxo.
• Os erros de cada passo serão combinadas em um caminho unico de falha
Como lidar com erros em um modelo
funcional?
Simples, só usar monad's 🤓
Mas o que são monads? 🤓
Simples, são monoids na categoria dos
endofunctors 👌
??😒
Qual o problema? 😕
Vamos ficar longe desses termos estranhos,
mas iremos discutir aqui sua essencia...
Recomendações:
https://www.lambda3.com.br/2020/11/lambda3-podcast-220-functors-e-monads
https://hipsters.tech/functions-monadas-e-programacao-funcional-hipsters-190
Programação orientada a trilhos 🚂
Analogia do trilho
>>
Analogia do trilho
• Nova funcão!
• Obtida por composição
• Impossivel de saber que é composta de funcoes menores
Analogia do trilho
Como modelar em formato "trilho"?
Introdução aos switches
Conectando switches
Conectando switches
Conectando switches
Conectando switches
Conectando switches
• Esse é o modelo de duas faixas!
• A base da programação orientada a trilhos!
Conectando switches
• As funções são caixa preta
• E estão ocupando as duas faixas do trilho
Conectando switches
• As funções são caixa preta
• E estão ocupando as duas faixas do trilho
• Elas encapsulam a logica de switch de trilhos
Compondo switches
• Compor funções com um trilho é tranquilo!
Compondo switches
• Compor funções com dois trilhos é tranquilo!
Compondo switches
• Mas compor switches nao rola 😕
Compondo switches
Criando um adapter
Criando um adapter
Criando um adapter
Criando um adapter
Criando um adapter
Criando um adapter
Criando um adapter
bind : ('a -> TwoTrack<'b>) -> TwoTrack<'a> -> TwoTrack<'b>
Criando um adapter
bind : ('a -> TwoTrack<'b>) -> TwoTrack<'a> -> TwoTrack<'b>
Exemplos
Exemplos
Exemplos
Exemplos
Exemplos
// validateRequest : TwoTrack<Request> -> TwoTrack<Request>
Exemplos
Exemplos
Exemplos
Exemplos
Adicionando mais tipos de funçoes
Funcoes de um trilho
map : ('a -> 'b) -> TwoTrack<'a> -> TwoTrack<'b>`
Funcoes sem retorno
Funcoes que lançam exceção
Bora colocar tudo junto!
input Saida?
input
input
Vamos olhar novamente pro codigo antes
e depois do tratamento de erro
Antes Depois
Esse framework é bom pra maioria dos
casos de uso!
Melhorando os erros!
IMPORTANTE!
• Não é bala de prata!
https://fsharpforfunandprofit.com/posts/against-railway-oriented-programming
IMPORTANTE!
https://fsharpforfunandprofit.com/rop
Não deixem de ver o video original!
https://github.com/swlaschin/Railway-Oriented-Programming-Example
Exemplos
Obrigado!
@lucasteles42
@lucasteles

Conheça ROP - Programação orientada e trilhos​

Notas do Editor

  • #2 Poderoso, não absorver os detalhes mas as capacidades