SlideShare uma empresa Scribd logo
1 de 94
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

Mais conteúdo relacionado

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

M5-Desenvolvimento-Paginas-Web
M5-Desenvolvimento-Paginas-WebM5-Desenvolvimento-Paginas-Web
M5-Desenvolvimento-Paginas-Webdiogoa21
 
Fabulous - Xamarin.Forms com Elmish
Fabulous - Xamarin.Forms com ElmishFabulous - Xamarin.Forms com Elmish
Fabulous - Xamarin.Forms com ElmishLucas Teles
 
Direto das Trincheiras: Boas e más práticas de aplicações Ruby em ambientes c...
Direto das Trincheiras: Boas e más práticas de aplicações Ruby em ambientes c...Direto das Trincheiras: Boas e más práticas de aplicações Ruby em ambientes c...
Direto das Trincheiras: Boas e más práticas de aplicações Ruby em ambientes c...Danilo Sato
 
Introdução a data warehouse e olap
Introdução a data warehouse e olapIntrodução a data warehouse e olap
Introdução a data warehouse e olapFlavia Martins Bispo
 
Introdução a data warehouse e olap
Introdução a data warehouse e olapIntrodução a data warehouse e olap
Introdução a data warehouse e olapFernando Palma
 
Arquitetura funcional em microservices, 4 anos depois
Arquitetura funcional em microservices, 4 anos depoisArquitetura funcional em microservices, 4 anos depois
Arquitetura funcional em microservices, 4 anos depoisLucas Cavalcanti dos Santos
 
T05_LM3: Javascript (2013-2014)
T05_LM3: Javascript (2013-2014)T05_LM3: Javascript (2013-2014)
T05_LM3: Javascript (2013-2014)Carlos Santos
 
Desenvolvimento Ágil com Rails GURUSC 2011
Desenvolvimento Ágil com Rails GURUSC 2011Desenvolvimento Ágil com Rails GURUSC 2011
Desenvolvimento Ágil com Rails GURUSC 2011Andre Bernardes
 
Introdução ao Desenvolvimento WEB com Ruby on Rails
Introdução ao Desenvolvimento WEB com Ruby on RailsIntrodução ao Desenvolvimento WEB com Ruby on Rails
Introdução ao Desenvolvimento WEB com Ruby on RailsJulio Betta
 
SAPO Broker
SAPO BrokerSAPO Broker
SAPO Brokercodebits
 
SIMCIT 2013 - Mini-curso PHP
SIMCIT 2013 - Mini-curso PHPSIMCIT 2013 - Mini-curso PHP
SIMCIT 2013 - Mini-curso PHPJonata Weber
 
TDC2018SP | Trilha Node.js - Melhores praticas de desempenho utilizando Node....
TDC2018SP | Trilha Node.js - Melhores praticas de desempenho utilizando Node....TDC2018SP | Trilha Node.js - Melhores praticas de desempenho utilizando Node....
TDC2018SP | Trilha Node.js - Melhores praticas de desempenho utilizando Node....tdc-globalcode
 
TDC2016POA | Trilha DevOps - Gestão de ciclo de vida de banco de dados: Já pa...
TDC2016POA | Trilha DevOps - Gestão de ciclo de vida de banco de dados: Já pa...TDC2016POA | Trilha DevOps - Gestão de ciclo de vida de banco de dados: Já pa...
TDC2016POA | Trilha DevOps - Gestão de ciclo de vida de banco de dados: Já pa...tdc-globalcode
 
Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado da...
Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado da...Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado da...
Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado da...fabio perrella
 
Escalando uma plataforma de e-mail transacional- aprendizado das trincheiras
Escalando uma plataforma de e-mail transacional- aprendizado das trincheirasEscalando uma plataforma de e-mail transacional- aprendizado das trincheiras
Escalando uma plataforma de e-mail transacional- aprendizado das trincheirasCelso Crivelaro
 
CRUDing Open Source - WhyDay - 19aug2010
CRUDing Open Source - WhyDay - 19aug2010CRUDing Open Source - WhyDay - 19aug2010
CRUDing Open Source - WhyDay - 19aug2010Plataformatec
 
Clean code: programando com WordPress de forma profissional
Clean code: programando com WordPress de forma profissionalClean code: programando com WordPress de forma profissional
Clean code: programando com WordPress de forma profissionalLeo Baiano
 
Cobrancas online na sua aplicacao com MoIP
Cobrancas online na sua aplicacao com MoIPCobrancas online na sua aplicacao com MoIP
Cobrancas online na sua aplicacao com MoIPHerberth Amaral
 
Três anos de Scala em Produção: desafios, aprendizados e dores de cabeça
Três anos de Scala em Produção: desafios, aprendizados e dores de cabeçaTrês anos de Scala em Produção: desafios, aprendizados e dores de cabeça
Três anos de Scala em Produção: desafios, aprendizados e dores de cabeçaFelipe Hummel
 

Semelhante a Conheça ROP - Programação orientada e trilhos (20)

M5-Desenvolvimento-Paginas-Web
M5-Desenvolvimento-Paginas-WebM5-Desenvolvimento-Paginas-Web
M5-Desenvolvimento-Paginas-Web
 
Fabulous - Xamarin.Forms com Elmish
Fabulous - Xamarin.Forms com ElmishFabulous - Xamarin.Forms com Elmish
Fabulous - Xamarin.Forms com Elmish
 
Direto das Trincheiras: Boas e más práticas de aplicações Ruby em ambientes c...
Direto das Trincheiras: Boas e más práticas de aplicações Ruby em ambientes c...Direto das Trincheiras: Boas e más práticas de aplicações Ruby em ambientes c...
Direto das Trincheiras: Boas e más práticas de aplicações Ruby em ambientes c...
 
Introdução a data warehouse e olap
Introdução a data warehouse e olapIntrodução a data warehouse e olap
Introdução a data warehouse e olap
 
Introdução a data warehouse e olap
Introdução a data warehouse e olapIntrodução a data warehouse e olap
Introdução a data warehouse e olap
 
Arquitetura funcional em microservices, 4 anos depois
Arquitetura funcional em microservices, 4 anos depoisArquitetura funcional em microservices, 4 anos depois
Arquitetura funcional em microservices, 4 anos depois
 
T05_LM3: Javascript (2013-2014)
T05_LM3: Javascript (2013-2014)T05_LM3: Javascript (2013-2014)
T05_LM3: Javascript (2013-2014)
 
Desenvolvimento Ágil com Rails GURUSC 2011
Desenvolvimento Ágil com Rails GURUSC 2011Desenvolvimento Ágil com Rails GURUSC 2011
Desenvolvimento Ágil com Rails GURUSC 2011
 
Introdução ao Desenvolvimento WEB com Ruby on Rails
Introdução ao Desenvolvimento WEB com Ruby on RailsIntrodução ao Desenvolvimento WEB com Ruby on Rails
Introdução ao Desenvolvimento WEB com Ruby on Rails
 
SAPO Broker
SAPO BrokerSAPO Broker
SAPO Broker
 
SIMCIT 2013 - Mini-curso PHP
SIMCIT 2013 - Mini-curso PHPSIMCIT 2013 - Mini-curso PHP
SIMCIT 2013 - Mini-curso PHP
 
Linguagem C - Funções
Linguagem C - FunçõesLinguagem C - Funções
Linguagem C - Funções
 
TDC2018SP | Trilha Node.js - Melhores praticas de desempenho utilizando Node....
TDC2018SP | Trilha Node.js - Melhores praticas de desempenho utilizando Node....TDC2018SP | Trilha Node.js - Melhores praticas de desempenho utilizando Node....
TDC2018SP | Trilha Node.js - Melhores praticas de desempenho utilizando Node....
 
TDC2016POA | Trilha DevOps - Gestão de ciclo de vida de banco de dados: Já pa...
TDC2016POA | Trilha DevOps - Gestão de ciclo de vida de banco de dados: Já pa...TDC2016POA | Trilha DevOps - Gestão de ciclo de vida de banco de dados: Já pa...
TDC2016POA | Trilha DevOps - Gestão de ciclo de vida de banco de dados: Já pa...
 
Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado da...
Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado da...Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado da...
Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado da...
 
Escalando uma plataforma de e-mail transacional- aprendizado das trincheiras
Escalando uma plataforma de e-mail transacional- aprendizado das trincheirasEscalando uma plataforma de e-mail transacional- aprendizado das trincheiras
Escalando uma plataforma de e-mail transacional- aprendizado das trincheiras
 
CRUDing Open Source - WhyDay - 19aug2010
CRUDing Open Source - WhyDay - 19aug2010CRUDing Open Source - WhyDay - 19aug2010
CRUDing Open Source - WhyDay - 19aug2010
 
Clean code: programando com WordPress de forma profissional
Clean code: programando com WordPress de forma profissionalClean code: programando com WordPress de forma profissional
Clean code: programando com WordPress de forma profissional
 
Cobrancas online na sua aplicacao com MoIP
Cobrancas online na sua aplicacao com MoIPCobrancas online na sua aplicacao com MoIP
Cobrancas online na sua aplicacao com MoIP
 
Três anos de Scala em Produção: desafios, aprendizados e dores de cabeça
Três anos de Scala em Produção: desafios, aprendizados e dores de cabeçaTrês anos de Scala em Produção: desafios, aprendizados e dores de cabeça
Três anos de Scala em Produção: desafios, aprendizados e dores de cabeça
 

Mais de Lucas Teles

Type script alem do arroz com feijao
Type script   alem do arroz com feijaoType script   alem do arroz com feijao
Type script alem do arroz com feijaoLucas Teles
 
TypeScript - Além do arroz com feijão
TypeScript - Além do arroz com feijãoTypeScript - Além do arroz com feijão
TypeScript - Além do arroz com feijãoLucas Teles
 
Algoritmos genéticos aplicados no problema de roteirização de veículos com ja...
Algoritmos genéticos aplicados no problema de roteirização de veículos com ja...Algoritmos genéticos aplicados no problema de roteirização de veículos com ja...
Algoritmos genéticos aplicados no problema de roteirização de veículos com ja...Lucas Teles
 
Algoritmos genéticos aplicados em problemas de busca de caminho
Algoritmos genéticos aplicados em problemas de busca de caminhoAlgoritmos genéticos aplicados em problemas de busca de caminho
Algoritmos genéticos aplicados em problemas de busca de caminhoLucas Teles
 
Algoritmos geneticos
Algoritmos geneticosAlgoritmos geneticos
Algoritmos geneticosLucas Teles
 
Aplicações serverless com Blazor.pptx
Aplicações serverless com Blazor.pptxAplicações serverless com Blazor.pptx
Aplicações serverless com Blazor.pptxLucas Teles
 
Simplificando componentes com react hooks
Simplificando componentes com react hooksSimplificando componentes com react hooks
Simplificando componentes com react hooksLucas Teles
 
Um melhor frontend com elm
Um melhor frontend com elmUm melhor frontend com elm
Um melhor frontend com elmLucas Teles
 
F# para devs c# tdc
F# para devs c#   tdcF# para devs c#   tdc
F# para devs c# tdcLucas Teles
 
Introducao a azure functions
Introducao a azure functionsIntroducao a azure functions
Introducao a azure functionsLucas Teles
 
Block chain para desenvolvedores
Block chain para desenvolvedoresBlock chain para desenvolvedores
Block chain para desenvolvedoresLucas Teles
 
Generalização prematura e complexidade acidental, a raiz do mal de todo software
Generalização prematura e complexidade acidental, a raiz do mal de todo softwareGeneralização prematura e complexidade acidental, a raiz do mal de todo software
Generalização prematura e complexidade acidental, a raiz do mal de todo softwareLucas Teles
 
Elmish com xamarin.forms
Elmish com xamarin.formsElmish com xamarin.forms
Elmish com xamarin.formsLucas Teles
 

Mais de Lucas Teles (16)

Type script alem do arroz com feijao
Type script   alem do arroz com feijaoType script   alem do arroz com feijao
Type script alem do arroz com feijao
 
TypeScript - Além do arroz com feijão
TypeScript - Além do arroz com feijãoTypeScript - Além do arroz com feijão
TypeScript - Além do arroz com feijão
 
Algoritmos genéticos aplicados no problema de roteirização de veículos com ja...
Algoritmos genéticos aplicados no problema de roteirização de veículos com ja...Algoritmos genéticos aplicados no problema de roteirização de veículos com ja...
Algoritmos genéticos aplicados no problema de roteirização de veículos com ja...
 
Algoritmos genéticos aplicados em problemas de busca de caminho
Algoritmos genéticos aplicados em problemas de busca de caminhoAlgoritmos genéticos aplicados em problemas de busca de caminho
Algoritmos genéticos aplicados em problemas de busca de caminho
 
Algoritmos geneticos
Algoritmos geneticosAlgoritmos geneticos
Algoritmos geneticos
 
Aplicações serverless com Blazor.pptx
Aplicações serverless com Blazor.pptxAplicações serverless com Blazor.pptx
Aplicações serverless com Blazor.pptx
 
Simplificando componentes com react hooks
Simplificando componentes com react hooksSimplificando componentes com react hooks
Simplificando componentes com react hooks
 
Um melhor frontend com elm
Um melhor frontend com elmUm melhor frontend com elm
Um melhor frontend com elm
 
C# 8 e além
C# 8 e alémC# 8 e além
C# 8 e além
 
F# para devs c# tdc
F# para devs c#   tdcF# para devs c#   tdc
F# para devs c# tdc
 
Introducao a azure functions
Introducao a azure functionsIntroducao a azure functions
Introducao a azure functions
 
F# para devs c#
F# para devs c#F# para devs c#
F# para devs c#
 
Block chain para desenvolvedores
Block chain para desenvolvedoresBlock chain para desenvolvedores
Block chain para desenvolvedores
 
Generalização prematura e complexidade acidental, a raiz do mal de todo software
Generalização prematura e complexidade acidental, a raiz do mal de todo softwareGeneralização prematura e complexidade acidental, a raiz do mal de todo software
Generalização prematura e complexidade acidental, a raiz do mal de todo software
 
Elmish com xamarin.forms
Elmish com xamarin.formsElmish com xamarin.forms
Elmish com xamarin.forms
 
Net - Threads
Net - ThreadsNet - Threads
Net - Threads
 

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

Notas do Editor

  1. Poderoso, não absorver os detalhes mas as capacidades