Mais conteúdo relacionado
Abordagem Funcional para Gerenciamento de Erros em .NET
- 2. Globalcode – Open4education
Mestre em computação aplicada
Microsoft Certified Solutions Associate (MCSA)
Desenvolvedor, Professor e Revisor
Autor dos livros
Gabriel Schade Cardoso
- 6. Globalcode – Open4education
Como essas duas coisas estão
conectadas?
Programação funcional é bem diferente de
programação orientada à objetos;
É um paradigma diferente;
- 9. Globalcode – Open4education
Vamos ao problema do null
Ele é um método mentiroso;
A assinatura dele me garante que ele irá retornar um
usuário, mas se o Id for inválido?
- 12. Globalcode – Open4education
Vamos ao problema do null
Mas isso não é só um null check obrigatório?
Quase, mas causa erro de compilação.
O erro acontece porque o tipo option é um value container,
encapsulando qualquer tipo.
- 14. Globalcode – Open4education
Um container pode ser visto como um envelope ou uma caixa
que circunda um dado, incluindo-o em algum contexto
específico.
Lidamos com este tipo de valor o tempo todo:
List;
Array;
Task;
Nullable.
Value Containers
- 17. Globalcode – Open4education
Não podemos realizar a soma com o mesmo valor, isso por
conta do contexto que o cerca.
Por isso, comumente temos uma função para remover o valor
de seu contexto.
Value Containers
- 19. Globalcode – Open4education
No caso do option utilizamos o pattern matching ao invés do
indexador.
Podemos nos aproveitar deste conceito para criar novos
objetos e classes que armazenam valores sob um determinado
contexto.
Que tal criar um Option para o C#?
Value Containers
- 20. Globalcode – Open4education
Option<T>
O tipo não pode ser nulo nunca;
Precisamos de um pattern matching;
Não deixaremos o programador acessar a informação, caso ela
esteja no estado inválido;
- 28. Globalcode – Open4education
Value Containers
E se precisássemos de validações mais complexas?
Existem mais value containers além do Option!
Either<TLeft, TRight>
...
Vamos refatorar uma funcionalidade que atualiza um usuário
- 37. Globalcode – Open4education
Atualizando um usuário
Como as exceções não estão sendo tratadas, acabamos
sempre retornando um erro 500.
Este HTTP code não deve ser utilizado para isso, precisamos
retornar um 400 (bad request).
Onde colocar esse tratamento?
- 41. Globalcode – Open4education
Atualizando um usuário
Precisamos continuar enviando o resultado para frente, mesmo
se algo deu errado, dessa forma não quebramos o fluxo de
código.
Vamos fazer mais um container, dessa vez para representar um
resultado para a continuação de uma operação.
- 45. Globalcode – Open4education
Com nosso novo container já é possível retornar um resultado!
Vamos começar adaptando a função Update!
Criando um novo tipo
- 46. Globalcode – Open4education
Return em dois locais diferentes?
Ainda usamos try-catch?
Existem erros que podem
acontecer no banco;
O usuário pode não existir no
banco;
Criando um novo tipo
- 52. Globalcode – Open4education
Agora vamos resolver os problemas do método Validate;
Primeiro vamos utilizar a própria linguagem para gerar a lista
de erros:
Criando um novo tipo
- 60. Globalcode – Open4education
Atualizando um usuário
Parece uma composição!
Só que ruim.
A solução ainda está bem estranha, com vários If’s e
comparações.
E se encapsulássemos isso de uma forma que a composição
faça mais sentido?
- 66. Globalcode – Open4education
Atualizando um usuário
Neste ponto você já deve ter percebido que estamos sempre
atualizando o continuation, certo?
Mas como o próprio método já o retorna, podemos utilizar
uma sintaxe encadeada!
- 74. Globalcode – Open4education
Nuget Tango
Github.com/gabrielschade/Tango
Open source
E-book gratuito em português e inglês
https://gabrielschade.github.io/tango-br