SlideShare uma empresa Scribd logo
Globalcode – Open4education
Trilha .NET
Gabriel Schade Cardoso
Software Engineer | Mestre em Computação Aplicada | Professor | Escritor
Globalcode – Open4education
Mestre em computação aplicada
Microsoft Certified Solutions Associate (MCSA)
Desenvolvedor, Professor e Revisor
Autor dos livros
Gabriel Schade Cardoso
Globalcode – Open4education
Agenda
Contexto
Abordagens Funcionais
Refatoração
Globalcode – Open4education
Programação Funcional
Quem aqui sabe o que é isso?
Isso é o ícone da F# Foundation
F# também é .NET
Globalcode – Open4education
Problemas comuns
Quem aqui sabe o que é isso?
ArgumentNullException
DomainException
Essa nem existe na linguagem, mas eu já vi TANTO
Globalcode – Open4education
Como essas duas coisas estão
conectadas?
Programação funcional é bem diferente de
programação orientada à objetos;
É um paradigma diferente;
Globalcode – Open4education
Como essas duas coisas estão
conectadas?
Ao aprender um novo paradigma, você aprende uma
nova forma de ver os problemas.
Globalcode – Open4education
Vamos ao problema do null
Veja este método:
O que ele tem de errado?
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?
Globalcode – Open4education
Vamos ao problema do null
Veja este método:
O que é um User option?
Globalcode – Open4education
Vamos ao problema do null
O método avisa que talvez ele retorne um usuário;
Mas como isso muda nossa implementação?
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.
Globalcode – Open4education
Value Containers
Já ouviram falar?
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
Globalcode – Open4education
Imagine o seguinte cenário: você possui um dado do tipo
inteiro e precisa somá-lo com o valor 3.
Value Containers
Globalcode – Open4education
E se este número estiver em um array?
Value Containers
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
Globalcode – Open4education
No caso do array o indexador remove o valor do contexto.
Value Containers
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
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;
Globalcode – Open4education
Globalcode – Open4education
Option
Globalcode – Open4education
Option<T>
Ainda não temos um substituto para o pattern matching;
Para fazer isso vamos usar uma HOF (High order function)
Globalcode – Open4education
Option<T>
Globalcode – Open4education
Option<T>
O toque final é criar o cast implícito, com isso nem precisamos
criar manualmente o tipo Option.
Dentro da struct Option:
Globalcode – Open4education
Option<T>
Globalcode – Open4education
Option<T>
O toque final é criar o cast implícito, com isso nem precisamos
criar manualmente o tipo Option.
Dentro da struct Option:
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
Globalcode – Open4education
Reparem nesta estrutura de código:
Atualizando um usuário
Globalcode – Open4education
Atualizando um usuário
Reparem nesta estrutura de código:
Void?
Globalcode – Open4education
Atualizando um usuário
Reparem nesta estrutura de código:
Void?
Globalcode – Open4education
Atualizando um usuário
Reparem nesta estrutura de código:
Sempre Ok?
Globalcode – Open4education
Atualizando um usuário
Reparem nesta estrutura de código:
E quando as coisas dão errado?
Como as funções estão implementadas?
Globalcode – Open4education
Atualizando um usuário
Globalcode – Open4education
Atualizando um usuário
Globalcode – Open4education
Atualizando um usuário
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?
Globalcode – Open4education
Globalcode – Open4education
Atualizando um usuário
Não... Só não.
Vamos tentar produzir esse resultado, mas sem try-catches:
Globalcode – Open4education
Atualizando um usuário
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.
Globalcode – Open4education
Atualizando um usuário
Globalcode – Open4education
Atualizando um usuário
Notem que as propriedades de nossa classe só possuem um
método get, ou seja, todas elas são readonly;
Precisamos de construtores!
Globalcode – Open4education
Atualizando um usuário
Em um construtor
temos apenas os
dados de sucesso, no
outro os de falha.
Globalcode – Open4education
Com nosso novo container já é possível retornar um resultado!
Vamos começar adaptando a função Update!
Criando um novo tipo
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
Globalcode – Open4education
Vamos separar melhor;
Criando um método para verificar se o usuário existe
Criando um novo tipo
Globalcode – Open4education
Para não termos que criar o Continuation, vamos apelar de
novo, lembram do cast implícito?
Criando um novo tipo
Globalcode – Open4education
Com o cast implícito podemos simplesmente retornar os
valores;
Criando um novo tipo
Globalcode – Open4education
Com o cast implícito podemos simplesmente retornar os
valores;
Criando um novo tipo
Globalcode – Open4education
Com o cast implícito podemos simplesmente retornar os
valores;
Criando um novo tipo
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
Globalcode – Open4education
Vamos utilizar Continuation aqui também:
Criando um novo tipo
Globalcode – Open4education
Agora vamos voltar ao Controller!
Criando um novo tipo
Globalcode – Open4education
Remover o try-catch;
Exibir mensagens de
erros tratadas.
Criando um novo tipo
Globalcode – Open4education
Criando um novo tipo
Globalcode – Open4education
Criando um novo tipo
Globalcode – Open4education
Criando um novo tipo
Globalcode – Open4education
Criando um novo tipo
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?
Globalcode – Open4education
Atualizando um usuário
Vamos criar os métodos Then e Catch;
Eles recebem uma função por parâmetro e retornam uma
estrutura de continuação!
Globalcode – Open4education
Atualizando um usuário
O método Catch faz a mesma coisa, mas com a comparação
contrária:
Globalcode – Open4education
Atualizando um usuário
Como a própria comparação está na estrutura, não precisamos
mais dos IFs!
Globalcode – Open4education
Atualizando um usuário
O Update precisa de 2 parâmetros!!
Globalcode – Open4education
Atualizando um usuário
É só usar Lambda!
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!
Globalcode – Open4education
Atualizando um usuário
Globalcode – Open4education
Atualizando um usuário
Também podemos utilizar um match para extrair o resultado
do Continuation!
Globalcode – Open4education
Atualizando um usuário
Saímos daqui:
Globalcode – Open4education
Atualizando um usuário
Chegamos aqui:
Globalcode – Open4education
Atualizando um usuário
Chegamos aqui:
Globalcode – Open4education
Atualizando um usuário
Outros exemplos:
Globalcode – Open4education
Atualizando um usuário
Outros exemplos:
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
Globalcode – Open4education
https://gabrielschade.github.io/tango-br
https://docs.microsoft.com/en-us/dotnet/fsharp/get-start
/
http://fsharp.org/
https://fsharpforfunandprofit.com
Referências
/gabrielschade
/gabrielschade
/gabrielschade
/gabrielschade
https://gabrielschade.github.io

Mais conteúdo relacionado

Mais procurados

Clean code em C#
Clean code em C#Clean code em C#
Clean code em C#
Gustavo Araújo
 
TDC Connections 2021 Clausula de Guarda
TDC Connections 2021 Clausula de GuardaTDC Connections 2021 Clausula de Guarda
TDC Connections 2021 Clausula de Guarda
Douglas Siviotti
 
Java aula 04
Java aula 04Java aula 04
Facilitando o desenvolvimento orientado a testes em aplicações PHP
Facilitando o desenvolvimento orientado a testes em aplicações PHPFacilitando o desenvolvimento orientado a testes em aplicações PHP
Facilitando o desenvolvimento orientado a testes em aplicações PHP
Pedro Chaves
 
Java aula 03
Java aula 03Java aula 03
Java aula 06
Java aula 06Java aula 06
Design patterns de uma vez por todas
Design patterns de uma vez por todasDesign patterns de uma vez por todas
Design patterns de uma vez por todas
Michael Castillo Granados
 
Clean Code na Prática
Clean Code na PráticaClean Code na Prática
Clean Code na Prática
Douglas Siviotti
 
UFCG.JCert Reunião 1 - Declarações e Controle de Acesso
UFCG.JCert Reunião 1 - Declarações e Controle de AcessoUFCG.JCert Reunião 1 - Declarações e Controle de Acesso
UFCG.JCert Reunião 1 - Declarações e Controle de Acesso
Anderson Ledo
 
Refatorar é preciso. Palestra TDC 2014
Refatorar é preciso. Palestra TDC 2014Refatorar é preciso. Palestra TDC 2014
Refatorar é preciso. Palestra TDC 2014
Daniel Archer Marques Cramer
 
Usando Visão Computacional para Identificar Letras em Libras
Usando Visão Computacional para Identificar Letras em LibrasUsando Visão Computacional para Identificar Letras em Libras
Usando Visão Computacional para Identificar Letras em Libras
Gabriel Schade Cardoso
 
O dilema
O dilemaO dilema
Refatorar é preciso! 2.0
Refatorar é preciso! 2.0Refatorar é preciso! 2.0
Refatorar é preciso! 2.0
Daniel Archer Marques Cramer
 
Dojo com Processing
Dojo com ProcessingDojo com Processing
Dojo com Processing
Luciano Ramalho
 
Desenvolvimento Orientado a Documentação? Utilizando doctests para tornar seu...
Desenvolvimento Orientado a Documentação? Utilizando doctests para tornar seu...Desenvolvimento Orientado a Documentação? Utilizando doctests para tornar seu...
Desenvolvimento Orientado a Documentação? Utilizando doctests para tornar seu...
Adam Victor Brandizzi
 
TDC2018SP | Trilha Arq .Net - Performance e feature
TDC2018SP | Trilha Arq .Net - Performance e featureTDC2018SP | Trilha Arq .Net - Performance e feature
TDC2018SP | Trilha Arq .Net - Performance e feature
tdc-globalcode
 
Como você testa seu software TDC 2017
Como você testa seu software  TDC 2017Como você testa seu software  TDC 2017
Como você testa seu software TDC 2017
Ismael
 
Como melhoramos a performance dos testes automatizados com py.test e factoryboy
Como melhoramos a performance dos testes automatizados com py.test e factoryboyComo melhoramos a performance dos testes automatizados com py.test e factoryboy
Como melhoramos a performance dos testes automatizados com py.test e factoryboy
Leonardo Galani
 
Tdc2014 - Guia do Tester Técnico das Galáxias
Tdc2014 - Guia do Tester Técnico das GaláxiasTdc2014 - Guia do Tester Técnico das Galáxias
Tdc2014 - Guia do Tester Técnico das Galáxias
Leonardo Galani
 
Utilizando a API do Roslyn, o novo compilador do C#
Utilizando a API do Roslyn, o novo compilador do C#Utilizando a API do Roslyn, o novo compilador do C#
Utilizando a API do Roslyn, o novo compilador do C#
Paulo Cesar Ortins Brito
 

Mais procurados (20)

Clean code em C#
Clean code em C#Clean code em C#
Clean code em C#
 
TDC Connections 2021 Clausula de Guarda
TDC Connections 2021 Clausula de GuardaTDC Connections 2021 Clausula de Guarda
TDC Connections 2021 Clausula de Guarda
 
Java aula 04
Java aula 04Java aula 04
Java aula 04
 
Facilitando o desenvolvimento orientado a testes em aplicações PHP
Facilitando o desenvolvimento orientado a testes em aplicações PHPFacilitando o desenvolvimento orientado a testes em aplicações PHP
Facilitando o desenvolvimento orientado a testes em aplicações PHP
 
Java aula 03
Java aula 03Java aula 03
Java aula 03
 
Java aula 06
Java aula 06Java aula 06
Java aula 06
 
Design patterns de uma vez por todas
Design patterns de uma vez por todasDesign patterns de uma vez por todas
Design patterns de uma vez por todas
 
Clean Code na Prática
Clean Code na PráticaClean Code na Prática
Clean Code na Prática
 
UFCG.JCert Reunião 1 - Declarações e Controle de Acesso
UFCG.JCert Reunião 1 - Declarações e Controle de AcessoUFCG.JCert Reunião 1 - Declarações e Controle de Acesso
UFCG.JCert Reunião 1 - Declarações e Controle de Acesso
 
Refatorar é preciso. Palestra TDC 2014
Refatorar é preciso. Palestra TDC 2014Refatorar é preciso. Palestra TDC 2014
Refatorar é preciso. Palestra TDC 2014
 
Usando Visão Computacional para Identificar Letras em Libras
Usando Visão Computacional para Identificar Letras em LibrasUsando Visão Computacional para Identificar Letras em Libras
Usando Visão Computacional para Identificar Letras em Libras
 
O dilema
O dilemaO dilema
O dilema
 
Refatorar é preciso! 2.0
Refatorar é preciso! 2.0Refatorar é preciso! 2.0
Refatorar é preciso! 2.0
 
Dojo com Processing
Dojo com ProcessingDojo com Processing
Dojo com Processing
 
Desenvolvimento Orientado a Documentação? Utilizando doctests para tornar seu...
Desenvolvimento Orientado a Documentação? Utilizando doctests para tornar seu...Desenvolvimento Orientado a Documentação? Utilizando doctests para tornar seu...
Desenvolvimento Orientado a Documentação? Utilizando doctests para tornar seu...
 
TDC2018SP | Trilha Arq .Net - Performance e feature
TDC2018SP | Trilha Arq .Net - Performance e featureTDC2018SP | Trilha Arq .Net - Performance e feature
TDC2018SP | Trilha Arq .Net - Performance e feature
 
Como você testa seu software TDC 2017
Como você testa seu software  TDC 2017Como você testa seu software  TDC 2017
Como você testa seu software TDC 2017
 
Como melhoramos a performance dos testes automatizados com py.test e factoryboy
Como melhoramos a performance dos testes automatizados com py.test e factoryboyComo melhoramos a performance dos testes automatizados com py.test e factoryboy
Como melhoramos a performance dos testes automatizados com py.test e factoryboy
 
Tdc2014 - Guia do Tester Técnico das Galáxias
Tdc2014 - Guia do Tester Técnico das GaláxiasTdc2014 - Guia do Tester Técnico das Galáxias
Tdc2014 - Guia do Tester Técnico das Galáxias
 
Utilizando a API do Roslyn, o novo compilador do C#
Utilizando a API do Roslyn, o novo compilador do C#Utilizando a API do Roslyn, o novo compilador do C#
Utilizando a API do Roslyn, o novo compilador do C#
 

Semelhante a Abordagem Funcional para Gerenciamento de Erros em .NET

TDC2018SP | Trilha .Net - Programacao Funcional com C#
TDC2018SP | Trilha .Net - Programacao Funcional com C#TDC2018SP | Trilha .Net - Programacao Funcional com C#
TDC2018SP | Trilha .Net - Programacao Funcional com C#
tdc-globalcode
 
Combatendo o Código Procedural - TDC 2012 Florianópolis - Trilha PHP
Combatendo o Código Procedural - TDC 2012 Florianópolis - Trilha PHPCombatendo o Código Procedural - TDC 2012 Florianópolis - Trilha PHP
Combatendo o Código Procedural - TDC 2012 Florianópolis - Trilha PHP
Rodrigo Dos Santos
 
Trilha .Net - Programacao funcional usando f#
Trilha .Net - Programacao funcional usando f#Trilha .Net - Programacao funcional usando f#
Trilha .Net - Programacao funcional usando f#
tdc-globalcode
 
Programação Funcional usando F#
Programação Funcional usando F#Programação Funcional usando F#
Programação Funcional usando F#
Gabriel Schade Cardoso
 
Uma abordagem funcional para gerenciamento de erros
Uma abordagem funcional para gerenciamento de errosUma abordagem funcional para gerenciamento de erros
Uma abordagem funcional para gerenciamento de erros
Gabriel Schade Cardoso
 
TDC2016POA | Trilha .NET - O que esperar do C# 7
TDC2016POA | Trilha .NET - O que esperar do C# 7TDC2016POA | Trilha .NET - O que esperar do C# 7
TDC2016POA | Trilha .NET - O que esperar do C# 7
tdc-globalcode
 
JSF 2 - Java "Super" Faces
JSF 2 - Java "Super" FacesJSF 2 - Java "Super" Faces
JSF 2 - Java "Super" Faces
Filipe Portes
 
Code Smells
Code SmellsCode Smells
Code Smells
Rodrigo Branas
 
TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...
TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...
TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...
Bruno Tanoue
 
Introducao Spring ROO
Introducao Spring ROOIntroducao Spring ROO
Introducao Spring ROO
Eder Magalhães
 
F# para devs c# tdc
F# para devs c#   tdcF# para devs c#   tdc
F# para devs c# tdc
Lucas Teles
 
[TDCPOA2018] Desmistificando a eXtreme Programming para desenvolvedores "não ...
[TDCPOA2018] Desmistificando a eXtreme Programming para desenvolvedores "não ...[TDCPOA2018] Desmistificando a eXtreme Programming para desenvolvedores "não ...
[TDCPOA2018] Desmistificando a eXtreme Programming para desenvolvedores "não ...
Vinicius Campos Silva
 
Implementando aplicativos Web com JSF
Implementando aplicativos Web com JSF Implementando aplicativos Web com JSF
Implementando aplicativos Web com JSF
Otávio Santana
 
TDC Florianópolis 2019. Trilha Java - Arquitetura de Testes
TDC Florianópolis 2019. Trilha Java - Arquitetura de TestesTDC Florianópolis 2019. Trilha Java - Arquitetura de Testes
TDC Florianópolis 2019. Trilha Java - Arquitetura de Testes
Sandro Giacomozzi
 
Migração de Banco de Dados - Oracle para MongoDB - TDC2014
Migração de Banco de Dados - Oracle para MongoDB - TDC2014Migração de Banco de Dados - Oracle para MongoDB - TDC2014
Migração de Banco de Dados - Oracle para MongoDB - TDC2014
Jonathan Prates
 
TDC2016SP - Desenvolvendo uma linguagem maker inclusiva em Python
TDC2016SP - Desenvolvendo uma linguagem maker inclusiva em PythonTDC2016SP - Desenvolvendo uma linguagem maker inclusiva em Python
TDC2016SP - Desenvolvendo uma linguagem maker inclusiva em Python
tdc-globalcode
 
Introduzindo StimulusJS: o novo Framework JavaScript para Ruby On Rails.
Introduzindo StimulusJS: o novo Framework JavaScript para Ruby On Rails.Introduzindo StimulusJS: o novo Framework JavaScript para Ruby On Rails.
Introduzindo StimulusJS: o novo Framework JavaScript para Ruby On Rails.
Sergio Lima
 
Testes de aceitação automatizados com robotium utilizando a técnica bdd TDC...
Testes de aceitação automatizados com robotium utilizando a técnica bdd   TDC...Testes de aceitação automatizados com robotium utilizando a técnica bdd   TDC...
Testes de aceitação automatizados com robotium utilizando a técnica bdd TDC...
Rafael Chiavegatto
 
Solid
SolidSolid
Debugging node
Debugging nodeDebugging node
Debugging node
Jeniffer Nolasco
 

Semelhante a Abordagem Funcional para Gerenciamento de Erros em .NET (20)

TDC2018SP | Trilha .Net - Programacao Funcional com C#
TDC2018SP | Trilha .Net - Programacao Funcional com C#TDC2018SP | Trilha .Net - Programacao Funcional com C#
TDC2018SP | Trilha .Net - Programacao Funcional com C#
 
Combatendo o Código Procedural - TDC 2012 Florianópolis - Trilha PHP
Combatendo o Código Procedural - TDC 2012 Florianópolis - Trilha PHPCombatendo o Código Procedural - TDC 2012 Florianópolis - Trilha PHP
Combatendo o Código Procedural - TDC 2012 Florianópolis - Trilha PHP
 
Trilha .Net - Programacao funcional usando f#
Trilha .Net - Programacao funcional usando f#Trilha .Net - Programacao funcional usando f#
Trilha .Net - Programacao funcional usando f#
 
Programação Funcional usando F#
Programação Funcional usando F#Programação Funcional usando F#
Programação Funcional usando F#
 
Uma abordagem funcional para gerenciamento de erros
Uma abordagem funcional para gerenciamento de errosUma abordagem funcional para gerenciamento de erros
Uma abordagem funcional para gerenciamento de erros
 
TDC2016POA | Trilha .NET - O que esperar do C# 7
TDC2016POA | Trilha .NET - O que esperar do C# 7TDC2016POA | Trilha .NET - O que esperar do C# 7
TDC2016POA | Trilha .NET - O que esperar do C# 7
 
JSF 2 - Java "Super" Faces
JSF 2 - Java "Super" FacesJSF 2 - Java "Super" Faces
JSF 2 - Java "Super" Faces
 
Code Smells
Code SmellsCode Smells
Code Smells
 
TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...
TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...
TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...
 
Introducao Spring ROO
Introducao Spring ROOIntroducao Spring ROO
Introducao Spring ROO
 
F# para devs c# tdc
F# para devs c#   tdcF# para devs c#   tdc
F# para devs c# tdc
 
[TDCPOA2018] Desmistificando a eXtreme Programming para desenvolvedores "não ...
[TDCPOA2018] Desmistificando a eXtreme Programming para desenvolvedores "não ...[TDCPOA2018] Desmistificando a eXtreme Programming para desenvolvedores "não ...
[TDCPOA2018] Desmistificando a eXtreme Programming para desenvolvedores "não ...
 
Implementando aplicativos Web com JSF
Implementando aplicativos Web com JSF Implementando aplicativos Web com JSF
Implementando aplicativos Web com JSF
 
TDC Florianópolis 2019. Trilha Java - Arquitetura de Testes
TDC Florianópolis 2019. Trilha Java - Arquitetura de TestesTDC Florianópolis 2019. Trilha Java - Arquitetura de Testes
TDC Florianópolis 2019. Trilha Java - Arquitetura de Testes
 
Migração de Banco de Dados - Oracle para MongoDB - TDC2014
Migração de Banco de Dados - Oracle para MongoDB - TDC2014Migração de Banco de Dados - Oracle para MongoDB - TDC2014
Migração de Banco de Dados - Oracle para MongoDB - TDC2014
 
TDC2016SP - Desenvolvendo uma linguagem maker inclusiva em Python
TDC2016SP - Desenvolvendo uma linguagem maker inclusiva em PythonTDC2016SP - Desenvolvendo uma linguagem maker inclusiva em Python
TDC2016SP - Desenvolvendo uma linguagem maker inclusiva em Python
 
Introduzindo StimulusJS: o novo Framework JavaScript para Ruby On Rails.
Introduzindo StimulusJS: o novo Framework JavaScript para Ruby On Rails.Introduzindo StimulusJS: o novo Framework JavaScript para Ruby On Rails.
Introduzindo StimulusJS: o novo Framework JavaScript para Ruby On Rails.
 
Testes de aceitação automatizados com robotium utilizando a técnica bdd TDC...
Testes de aceitação automatizados com robotium utilizando a técnica bdd   TDC...Testes de aceitação automatizados com robotium utilizando a técnica bdd   TDC...
Testes de aceitação automatizados com robotium utilizando a técnica bdd TDC...
 
Solid
SolidSolid
Solid
 
Debugging node
Debugging nodeDebugging node
Debugging node
 

Mais de Gabriel Schade Cardoso

Clean Architecture com .NET Core
Clean Architecture com .NET CoreClean Architecture com .NET Core
Clean Architecture com .NET Core
Gabriel Schade Cardoso
 
C# 8 e ML.NET
C# 8 e ML.NETC# 8 e ML.NET
C# 8 e ML.NET
Gabriel Schade Cardoso
 
Machine Learning: Classificação de Comentários com Azure ML & Python
Machine Learning: Classificação de Comentários com Azure ML & PythonMachine Learning: Classificação de Comentários com Azure ML & Python
Machine Learning: Classificação de Comentários com Azure ML & Python
Gabriel Schade Cardoso
 
Desmistificando Machine Learning
Desmistificando Machine LearningDesmistificando Machine Learning
Desmistificando Machine Learning
Gabriel Schade Cardoso
 
Programação Funcional usando C# e F#
Programação Funcional usando C# e F#Programação Funcional usando C# e F#
Programação Funcional usando C# e F#
Gabriel Schade Cardoso
 
Programação Funcional para Humanos
Programação Funcional para HumanosProgramação Funcional para Humanos
Programação Funcional para Humanos
Gabriel Schade Cardoso
 
Arquitetura Limpa em .NET Core
Arquitetura Limpa em .NET CoreArquitetura Limpa em .NET Core
Arquitetura Limpa em .NET Core
Gabriel Schade Cardoso
 
Aplicações inteligentes com o Azure Cognitive Services
Aplicações inteligentes com o Azure Cognitive ServicesAplicações inteligentes com o Azure Cognitive Services
Aplicações inteligentes com o Azure Cognitive Services
Gabriel Schade Cardoso
 
Desmistificando machine learning
Desmistificando machine learningDesmistificando machine learning
Desmistificando machine learning
Gabriel Schade Cardoso
 
Introdução à programação funcional
Introdução à programação funcionalIntrodução à programação funcional
Introdução à programação funcional
Gabriel Schade Cardoso
 
A importância da programação funcional no dia a-dia
A importância da programação funcional no dia a-diaA importância da programação funcional no dia a-dia
A importância da programação funcional no dia a-dia
Gabriel Schade Cardoso
 
DDD linguagem ubiqua + codigo expressivo
DDD  linguagem ubiqua + codigo expressivoDDD  linguagem ubiqua + codigo expressivo
DDD linguagem ubiqua + codigo expressivo
Gabriel Schade Cardoso
 
TDC - Desenvolvendo com Kinect
TDC - Desenvolvendo com KinectTDC - Desenvolvendo com Kinect
TDC - Desenvolvendo com Kinect
Gabriel Schade Cardoso
 
Desenvolvendo com Kinect
Desenvolvendo com KinectDesenvolvendo com Kinect
Desenvolvendo com Kinect
Gabriel Schade Cardoso
 

Mais de Gabriel Schade Cardoso (14)

Clean Architecture com .NET Core
Clean Architecture com .NET CoreClean Architecture com .NET Core
Clean Architecture com .NET Core
 
C# 8 e ML.NET
C# 8 e ML.NETC# 8 e ML.NET
C# 8 e ML.NET
 
Machine Learning: Classificação de Comentários com Azure ML & Python
Machine Learning: Classificação de Comentários com Azure ML & PythonMachine Learning: Classificação de Comentários com Azure ML & Python
Machine Learning: Classificação de Comentários com Azure ML & Python
 
Desmistificando Machine Learning
Desmistificando Machine LearningDesmistificando Machine Learning
Desmistificando Machine Learning
 
Programação Funcional usando C# e F#
Programação Funcional usando C# e F#Programação Funcional usando C# e F#
Programação Funcional usando C# e F#
 
Programação Funcional para Humanos
Programação Funcional para HumanosProgramação Funcional para Humanos
Programação Funcional para Humanos
 
Arquitetura Limpa em .NET Core
Arquitetura Limpa em .NET CoreArquitetura Limpa em .NET Core
Arquitetura Limpa em .NET Core
 
Aplicações inteligentes com o Azure Cognitive Services
Aplicações inteligentes com o Azure Cognitive ServicesAplicações inteligentes com o Azure Cognitive Services
Aplicações inteligentes com o Azure Cognitive Services
 
Desmistificando machine learning
Desmistificando machine learningDesmistificando machine learning
Desmistificando machine learning
 
Introdução à programação funcional
Introdução à programação funcionalIntrodução à programação funcional
Introdução à programação funcional
 
A importância da programação funcional no dia a-dia
A importância da programação funcional no dia a-diaA importância da programação funcional no dia a-dia
A importância da programação funcional no dia a-dia
 
DDD linguagem ubiqua + codigo expressivo
DDD  linguagem ubiqua + codigo expressivoDDD  linguagem ubiqua + codigo expressivo
DDD linguagem ubiqua + codigo expressivo
 
TDC - Desenvolvendo com Kinect
TDC - Desenvolvendo com KinectTDC - Desenvolvendo com Kinect
TDC - Desenvolvendo com Kinect
 
Desenvolvendo com Kinect
Desenvolvendo com KinectDesenvolvendo com Kinect
Desenvolvendo com Kinect
 

Último

Gestão de dados: sua importância e benefícios
Gestão de dados: sua importância e benefíciosGestão de dados: sua importância e benefícios
Gestão de dados: sua importância e benefícios
Rafael Santos
 
PRATICANDO O SCRUM Scrum team, product owner
PRATICANDO O SCRUM Scrum team, product ownerPRATICANDO O SCRUM Scrum team, product owner
PRATICANDO O SCRUM Scrum team, product owner
anpproferick
 
REDE_DE_COMPUTADORES_TECNOLOGIA_TIPOS.pptx
REDE_DE_COMPUTADORES_TECNOLOGIA_TIPOS.pptxREDE_DE_COMPUTADORES_TECNOLOGIA_TIPOS.pptx
REDE_DE_COMPUTADORES_TECNOLOGIA_TIPOS.pptx
IranyGarcia
 
Teoria de redes de computadores redes .doc
Teoria de redes de computadores redes .docTeoria de redes de computadores redes .doc
Teoria de redes de computadores redes .doc
anpproferick
 
Ferramentas e Técnicas para aplicar no seu dia a dia numa Transformação Digital!
Ferramentas e Técnicas para aplicar no seu dia a dia numa Transformação Digital!Ferramentas e Técnicas para aplicar no seu dia a dia numa Transformação Digital!
Ferramentas e Técnicas para aplicar no seu dia a dia numa Transformação Digital!
Annelise Gripp
 
Como fui de 0 a lead na gringa em 3 anos.pptx
Como fui de 0 a lead na gringa em 3 anos.pptxComo fui de 0 a lead na gringa em 3 anos.pptx
Como fui de 0 a lead na gringa em 3 anos.pptx
tnrlucas
 

Último (6)

Gestão de dados: sua importância e benefícios
Gestão de dados: sua importância e benefíciosGestão de dados: sua importância e benefícios
Gestão de dados: sua importância e benefícios
 
PRATICANDO O SCRUM Scrum team, product owner
PRATICANDO O SCRUM Scrum team, product ownerPRATICANDO O SCRUM Scrum team, product owner
PRATICANDO O SCRUM Scrum team, product owner
 
REDE_DE_COMPUTADORES_TECNOLOGIA_TIPOS.pptx
REDE_DE_COMPUTADORES_TECNOLOGIA_TIPOS.pptxREDE_DE_COMPUTADORES_TECNOLOGIA_TIPOS.pptx
REDE_DE_COMPUTADORES_TECNOLOGIA_TIPOS.pptx
 
Teoria de redes de computadores redes .doc
Teoria de redes de computadores redes .docTeoria de redes de computadores redes .doc
Teoria de redes de computadores redes .doc
 
Ferramentas e Técnicas para aplicar no seu dia a dia numa Transformação Digital!
Ferramentas e Técnicas para aplicar no seu dia a dia numa Transformação Digital!Ferramentas e Técnicas para aplicar no seu dia a dia numa Transformação Digital!
Ferramentas e Técnicas para aplicar no seu dia a dia numa Transformação Digital!
 
Como fui de 0 a lead na gringa em 3 anos.pptx
Como fui de 0 a lead na gringa em 3 anos.pptxComo fui de 0 a lead na gringa em 3 anos.pptx
Como fui de 0 a lead na gringa em 3 anos.pptx
 

Abordagem Funcional para Gerenciamento de Erros em .NET