SlideShare uma empresa Scribd logo
Uma abordagem funcional
para gerenciamento de erros
GABRIEL SCHADE CARDOSO
Quem é esse tal de Gabriel?
 Bacharel em ciência da computação
 Mestre em computação aplicada
 Microsoft Innovative Educator (MIE)
 Microsoft Specialist (MS)
 C#
 Javascript
 ASP .NET MVC
3
GUI
Sobre mim
 Microsoft Certified Solutions Assiciate (MCSA)
 Web Applications
 Autor dos livros da editora casa do código sobre
os assuntos:
 Kinect
 Windows Phone
 Programação Funcional
4
GUI
Sobre mim
 Desenvolvedor Senior
 Professor
 Revisor
5
GUI
Sobre mim
Vamos começar com
uma simples
funcionalidade
Mas antes...
Contexto
Contexto
 A aplicação que iremos emular a funcionalidade é:
 Escrita em C#;
 Uma aplicação Web;
 Serão Ignoradas alguns conceitos para focar no
problema principal.
Começando a
implementação
Atualizar um usuário
 Eu como usuário desejo ser capaz de atualizar meu
nome e e-mail.
 Simples de resolver!
 Primeiro vamos à classe User
Atualizar um usuário
entendendo a
implementação
Atualizar um usuário
1. Criar uma action para receber os dados do navegador;
2. Validar as informações recebidas;
3. Atualizar os dados do usuário;
4. Retornar uma resposta para o navegador.
Atualizar um usuário
Vamos refletir um
pouco
Atualizar um usuário
Atualizar um usuário
Atualizar um usuário
Atualizar um usuário
Atualizar um usuário
Atualizar um usuário
1. A função de validação como void?
2. A função de atualização como void?
3. O valor de retorno é um texto escrito “OK”?
4. Mas... E se algo der errado?
Vamos ver como as
funções estão
Atualizar um usuário
Atualizar um usuário
Atualizar um usuário
 Nos dois casos estamos lançando exceções quando
as coisas não ocorrem bem.
 Como a resposta chegará ao navegador desta forma?
Atualizar um usuário
Atualizar um usuário
Atualizar 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?
Atualizar um usuário
 Onde nos perdemos?
 Abusar de exceções
 Interromper o fluxo do
programa
Atualizar um usuário
 As exceções não devem ser utilizadas para erros de
validação.
 Erros de validação fazem parte de uma regra não de
uma exceção.
 Coisas como: O HD do servidor explodiu devem ser
exceções, um usuário digitar um e-mail com formato
inválido é algo normal e esperado.
Vamos voltar e
reescrever as coisas
Mas antes, um pouco
de contexto
Contextualização
 Responsabilidade única
 Composição
 Containers
Responsabilidade única
Responsabilidade única
 O Princípio da responsabilidade única (o S do famoso
SOLID) indica que, uma classe deve ter apenas UMA
responsabilidade.
 Este princípio pode (e deve) ser extrapolado para
métodos.
 Cada método deve fazer uma única coisa.
Responsabilidade única
 No exemplo anterior o método Validate validava três
coisas diferentes: nome em branco, e-mail em branco
e formato do e-mail.
 Seria uma boa ideia separá-los em três métodos
diferentes, cada um validando apenas uma coisa.
Responsabilidade única
 Mas todas as vezes que fosse preciso validar um
usuário, teríamos que chamar as três funções?
 Mais ou menos.
 Para isso utilizamos funções compostas.
Composição
Composição
 As funções compostas é um conteúdo que
aprendemos na escola na disciplina de matemática.
 As funções compostas também podem ser chamadas
de função de função.
 É um tipo específico de função que representa a
combinação de duas ou mais funções.
Composição
 Tendo uma função f (A  B) e uma função g (B  C)
podemos representar uma composição de f e g como:
f >> g( A  C)
 Também podemos representar como:
g( f (A) )
Composição
 Então, se a função g for chamada com a saída da
função f e ...
Composição
 Então, se a função g for chamada com a saída da
função f e ...
Calma...
Composição
 Basicamente o que a composição faz é conectar a
saída de uma função como parâmetro da função
seguinte.
 Vamos mostrar um código simples para ilustrar isso...
Composição
Composição
Composição
Composição
Composição
Composição
Composição
 Como uma função retorna apenas um valor, as
funções que realizam uma composição precisam
receber apenas um parâmetro.
 O que parece bem ruim...
 Mas não é, porque TODA função pode conter apenas
um parâmetro. (Mas isso fica para outro dia)
Composição
 Basicamente as funções que criamos devem servir
como peças de lego
 Para resolvermos problemas maiores criamos um
bloco com estas peças (funções compostas).
Composição
 Uma combinação de: Composição + Containers pode
ser extremamente poderosa para criação de um código
expressivo.
 Mas... O que é um container?
Containers
Containers
Containers
 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:
1. List;
2. Array;
3. Task;
4. Nullable.
Containers
 Imagine o seguinte cenário: você possui um dado do
tipo inteiro e precisa somá-lo com o valor 3.
Containers
 E se este número estiver em um array?.
Containers
 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.
Containers
 No caso do array o indexador remove o valor do
contexto.
Containers
 Podemos nos aproveitar deste conceito para criar
novos objetos e classes que armazenam valores sob
um determinado contexto.
Uma ideia para
nosso problema
Primeira Implementação
Segunda implementação
Objetivo
Objetivo
Como produzir dois
possíveis resultados em
cada etapa?
Criando um Novo tipo
Criando um novo tipo
 Este tipo precisa representar um resultado;
 Este resultado pode ser um sucesso ou uma falha;
Criando um novo tipo
 Os tipos referentes aos valores de sucesso e falha
não pode ser fixos, portanto generics;
Criando um novo tipo
 Notem que as propriedades de nossa classe só
possuem um método get, ou seja, todas elas são
readonly;
 Precisamos de construtores!
Criando um novo tipo
 Em um construtor
temos apenas os
dados de sucesso, no
outro os de falha.
Criando um novo tipo
 Com nosso novo container já é possível retornar um
resultado!
 Vamos começar adaptando a função Update!
Refatorando
Refatorando
Refatorando
1. Return em dois locais diferentes;
 Apesar da maior parte das vezes isso ser uma prática
ruim, como temos dois tipos de retorno diferentes, é
natural termos dois retornos.
Refatorando
1. Return em dois locais diferentes;
2. Ainda usamos try-catch;
Refatorando
1. Return em dois locais diferentes;
2. Ainda usamos try-catch;
 Precisamos especificar os casos, onde há problema
de conexão com o banco e onde o usuário que
estamos atualizando não existe no sistema
Refatorando
2. Ainda usamos try-catch;
 Onde o usuário não estiver cadastrado no banco:
 Precisamos validar e retornar um erro quando precisar;
Refatorando
2. Ainda usamos try-catch;
 Onde ocorrer erro de conexão com o banco:
 Não precisamos fazer nada
¯  _ (ツ) _ / ¯
Refatorando
1. Return em dois locais diferentes;
2. Ainda usamos try-catch;
3. A criação do Result é trabalhosa;
Refatorando
 Vamos apelar para a linguagem, podemos
sobrecarregar o operador de cast (conversão entre
tipos);
 Dessa forma passamos a responsabilidade de
converter o objeto para a linguagem.
Refatorando
 Voltando ao nosso tipo Result...
 Uma sobrecarga para sucesso e outra para falhas:
Refatorando
Refatorando
Refatorando
Refatorando
Refatorando
Vencemos o update!
Agora vamos para o
Validate!
Refatorando
1. Acumula os erros em
uma lista;
2. Lança exceção quando
houver erros.
3. Definido como void
Refatorando
 Vamos utilizar a própria linguagem para gerar a lista;
Refatorando
 Utilizar a própria linguagem para gerar a lista;
 Vamos retornar as mensagens de erro, sem gerar
exceções.
Voltando ao controller!
Refatorando
1. Remover os try-catches;
2. Retornar os dados ou as mensagens de erro.
Refatorando
 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?
Uma última passada no
tipo!
Voltando ao tipo!
 Agora é onde a magia acontece!
 Vamos implementar em nossa classe 2 novos
métodos: Then e Catch.
 Estes serão os métodos que utilizaremos para
composição!
Voltando ao tipo!
 Os dois métodos possuem apenas uma linha, mas
são um tanto quanto complexo, mas calma, eu explico.
 Primeiro vamos ao método Then
Voltando ao tipo!
 Este método precisa retornar um novo objeto Result,
podendo inclusive ter outro tipo de sucesso.
 Também precisaremos receber um parâmetro!
Voltando ao tipo!
 E o parâmetro que vamos receber também é um
método. Ele será o segundo método da função
composta!
 O C# utiliza delegates para descrever métodos, entre
eles temos o delegate Func<Tin, Tout> que descreve
uma função com 1 parâmetro e 1 retorno.
Voltado ao tipo!
 A função precisa receber o retorno da anterior e deve
retornar um sucesso igual ao da assinatura do método
Then!
Voltando ao tipo!
 A função precisa receber o retorno da anterior e deve
retornar um sucesso igual ao da assinatura do método
Then!
Voltando ao tipo!
 A função precisa receber o retorno da anterior e deve
retornar um sucesso igual ao da assinatura do método
Then!
Voltando ao tipo!
 A lógica do método Then é muito simples, basta
verificar se o Result atual foi um sucesso.
 caso sim: execute o próximo método.
 caso não, retorne sua falha
Voltando ao tipo!
 Os dois métodos possuem apenas uma linha, mas
são um tanto quanto complexo, mas calma, eu explico.
 Primeiro vamos ao método Then
 Agora o método Catch
Voltando ao tipo!
 Este método é semelhante ao Then, mas agora
vamos retornar apenas o valor de sucesso, sem ser
um novo resultado;
 O catch deve ser a última coisa a ocorrer;
Voltando ao tipo!
 Neste caso faremos a verificação contrário do método
Then, chamando a função de falha, apenas se há uma
falha no Result;
Voltando ao tipo!
 Um último adendo...
 O tipo Result é criado diversas vezes em uma
operação, por conta disso é fortemente recomendado
utilizarmos uma struct ao invés de uma classe.
 Basta substituir a palavra reservada:
Vamos ver a magia
acontecer no controller
Reta final!
 Não precisamos mais expor os ifs aqui, podemos
utilizar o Then;
Reta final!
 Mas se tentarmos utilizar no método Update;
Reta final!
 Mas se tentarmos utilizar no método Update;
Reta final!
 Isso ocorre porque o método Update espera dois
parâmetros (contexto e usuário) e o parâmetro da
função Then é um método com apenas um parâmetro;
Reta final!
 Mas é só criarmos um método anônimo através de
expressão lambda!
Reta final!
 Mas é só criarmos um método anônimo através de
expressão lambda!
Reta final!
 Talvez você já tenha percebido, mas podemos
concatenar os métodos Then sem precisarmos
armazenar os resultados intermediários!
Reta final!
A cereja do bolo
Resultado final
 Como o método Then pode produzir novos
resultados, podemos incluir um Then para converter o
resultado em uma IHttpActionResult para retornarmos
o OK...
Resultado final
 E no fim de tudo criamos um método Catch para
retornar um bad request se alguma falha ocorrer no
caminho!
 E com isso teremos um método completamente
composto, feito de uma instrução de return...
Resultado final
 Com isso saímos...
Daqui
E chegamos aqui
E chegamos aqui
Resultado final
 Com isso finalizamos toda a implementação do
gerenciamento de erros através de uma abordagem
funcional.
 Evitei utilizar termos comuns na programação
funcional justamente para mostrar que não é o bicho
de sete cabeças que imaginam
Perguntas?
Me encontre em
/gabrielschade
/gabrielschade
/gabrielschade
/gabrielschade
https://gabrielschade.github.io

Mais conteúdo relacionado

Mais procurados

Interface
InterfaceInterface
Interface
Artur Todeschini
 
Javascript (parte 3)
Javascript (parte 3)Javascript (parte 3)
Javascript (parte 3)
Alex Camargo
 
mod3-programação-estruturada
mod3-programação-estruturadamod3-programação-estruturada
mod3-programação-estruturada
diogoa21
 
Javascript (parte 2)
Javascript (parte 2)Javascript (parte 2)
Javascript (parte 2)
Alex Camargo
 
Final e aastract
Final e aastractFinal e aastract
Final e aastract
Artur Todeschini
 
Lógica de Programação com Javascript - Aula #01
Lógica de Programação com Javascript - Aula #01Lógica de Programação com Javascript - Aula #01
Lógica de Programação com Javascript - Aula #01
Ramon Kayo
 
Aprendendo C# do zero
Aprendendo C# do zeroAprendendo C# do zero
Aprendendo C# do zero
Manawydan
 
Test-driven Development
Test-driven DevelopmentTest-driven Development
Test-driven Development
Denis L Presciliano
 
Lógica de Programação com Javascript - Aula #03
Lógica de Programação com Javascript - Aula #03Lógica de Programação com Javascript - Aula #03
Lógica de Programação com Javascript - Aula #03
Ramon Kayo
 
Java2
Java2Java2
Algoritmos computacionais
Algoritmos computacionaisAlgoritmos computacionais
Algoritmos computacionais
Dérick Platini
 
Linguagem c parte 2
Linguagem c parte 2Linguagem c parte 2
Linguagem c parte 2
Mauro Pereira
 
Java3
Java3Java3
Logica programar
Logica programarLogica programar
Logica programar
Manawydan
 
Funções com Ruby[AULA 5]
Funções com Ruby[AULA 5]Funções com Ruby[AULA 5]
Funções com Ruby[AULA 5]
Ricardo Silva
 
Aula 1 2
Aula 1 2Aula 1 2
Aula 1 2
Aparicio Junior
 
Algoritmos C/C++ - Aula 01
Algoritmos C/C++ - Aula 01Algoritmos C/C++ - Aula 01
Algoritmos C/C++ - Aula 01
Leandro Rezende
 
Introdução ao php
Introdução ao phpIntrodução ao php
Introdução ao php
Tiago Davi
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScript
Bruno Catão
 
Algoritmos e lp parte3-pseudocódigo
Algoritmos e lp parte3-pseudocódigoAlgoritmos e lp parte3-pseudocódigo
Algoritmos e lp parte3-pseudocódigo
Mauro Pereira
 

Mais procurados (20)

Interface
InterfaceInterface
Interface
 
Javascript (parte 3)
Javascript (parte 3)Javascript (parte 3)
Javascript (parte 3)
 
mod3-programação-estruturada
mod3-programação-estruturadamod3-programação-estruturada
mod3-programação-estruturada
 
Javascript (parte 2)
Javascript (parte 2)Javascript (parte 2)
Javascript (parte 2)
 
Final e aastract
Final e aastractFinal e aastract
Final e aastract
 
Lógica de Programação com Javascript - Aula #01
Lógica de Programação com Javascript - Aula #01Lógica de Programação com Javascript - Aula #01
Lógica de Programação com Javascript - Aula #01
 
Aprendendo C# do zero
Aprendendo C# do zeroAprendendo C# do zero
Aprendendo C# do zero
 
Test-driven Development
Test-driven DevelopmentTest-driven Development
Test-driven Development
 
Lógica de Programação com Javascript - Aula #03
Lógica de Programação com Javascript - Aula #03Lógica de Programação com Javascript - Aula #03
Lógica de Programação com Javascript - Aula #03
 
Java2
Java2Java2
Java2
 
Algoritmos computacionais
Algoritmos computacionaisAlgoritmos computacionais
Algoritmos computacionais
 
Linguagem c parte 2
Linguagem c parte 2Linguagem c parte 2
Linguagem c parte 2
 
Java3
Java3Java3
Java3
 
Logica programar
Logica programarLogica programar
Logica programar
 
Funções com Ruby[AULA 5]
Funções com Ruby[AULA 5]Funções com Ruby[AULA 5]
Funções com Ruby[AULA 5]
 
Aula 1 2
Aula 1 2Aula 1 2
Aula 1 2
 
Algoritmos C/C++ - Aula 01
Algoritmos C/C++ - Aula 01Algoritmos C/C++ - Aula 01
Algoritmos C/C++ - Aula 01
 
Introdução ao php
Introdução ao phpIntrodução ao php
Introdução ao php
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScript
 
Algoritmos e lp parte3-pseudocódigo
Algoritmos e lp parte3-pseudocódigoAlgoritmos e lp parte3-pseudocódigo
Algoritmos e lp parte3-pseudocódigo
 

Semelhante a Uma abordagem funcional para gerenciamento de erros

Abordagem Funcional para Gerenciamento de Erros em .NET
Abordagem Funcional para Gerenciamento de Erros em .NETAbordagem Funcional para Gerenciamento de Erros em .NET
Abordagem Funcional para Gerenciamento de Erros em .NET
Gabriel Schade Cardoso
 
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
 
Programação Funcional usando C#
Programação Funcional usando C#Programação Funcional usando C#
Programação Funcional usando C#
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
 
DDD linguagem ubiqua + codigo expressivo
DDD  linguagem ubiqua + codigo expressivoDDD  linguagem ubiqua + codigo expressivo
DDD linguagem ubiqua + codigo expressivo
Gabriel Schade Cardoso
 
Classes abstratas
Classes abstratasClasses abstratas
Classes abstratas
Pedro Neto
 
Aula1- Java PRof.ª Cristiane Fidelix
Aula1- Java PRof.ª Cristiane FidelixAula1- Java PRof.ª Cristiane Fidelix
Aula1- Java PRof.ª Cristiane Fidelix
Cris Fidelix
 
Objects calisthenics - Os 10 mandamentos do rei do código
Objects calisthenics - Os 10 mandamentos do rei do códigoObjects calisthenics - Os 10 mandamentos do rei do código
Objects calisthenics - Os 10 mandamentos do rei do código
BonoBee
 
Lógica de programação 1
Lógica de programação 1Lógica de programação 1
Lógica de programação 1
Diego Rodrigues
 
TDC2018SP | Trilha Ruby - Design de aplicacoes orientadas a objeto: uma visao...
TDC2018SP | Trilha Ruby - Design de aplicacoes orientadas a objeto: uma visao...TDC2018SP | Trilha Ruby - Design de aplicacoes orientadas a objeto: uma visao...
TDC2018SP | Trilha Ruby - Design de aplicacoes orientadas a objeto: uma visao...
tdc-globalcode
 
Design de aplicações orientadas a objeto
Design de aplicações orientadas a objetoDesign de aplicações orientadas a objeto
Design de aplicações orientadas a objeto
Elaine Naomi
 
ebook-completo c# o melhor para começar no c#
ebook-completo c# o melhor para começar no c#ebook-completo c# o melhor para começar no c#
ebook-completo c# o melhor para começar no c#
biandamakengo08
 
C# 8 e ML.NET
C# 8 e ML.NETC# 8 e ML.NET
C# 8 e ML.NET
Gabriel Schade Cardoso
 
Introdução_a_linguagem C _pare1_(1).pptx
Introdução_a_linguagem C _pare1_(1).pptxIntrodução_a_linguagem C _pare1_(1).pptx
Introdução_a_linguagem C _pare1_(1).pptx
Samara Santos
 
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
 
Cap04
Cap04Cap04
Cap04
mvbahamut
 
Cap04
Cap04Cap04
Cap04
mvbahamut
 
Cap04
Cap04Cap04
Cap04
mvbahamut
 
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
 
05 - Sincronização de Threads - I
05 - Sincronização de Threads - I05 - Sincronização de Threads - I
05 - Sincronização de Threads - I
Fabio Moura Pereira
 

Semelhante a Uma abordagem funcional para gerenciamento de erros (20)

Abordagem Funcional para Gerenciamento de Erros em .NET
Abordagem Funcional para Gerenciamento de Erros em .NETAbordagem Funcional para Gerenciamento de Erros em .NET
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#
 
Programação Funcional usando C#
Programação Funcional usando C#Programação Funcional usando C#
Programação Funcional usando C#
 
Introdução à programação funcional
Introdução à programação funcionalIntrodução à programação funcional
Introdução à programação funcional
 
DDD linguagem ubiqua + codigo expressivo
DDD  linguagem ubiqua + codigo expressivoDDD  linguagem ubiqua + codigo expressivo
DDD linguagem ubiqua + codigo expressivo
 
Classes abstratas
Classes abstratasClasses abstratas
Classes abstratas
 
Aula1- Java PRof.ª Cristiane Fidelix
Aula1- Java PRof.ª Cristiane FidelixAula1- Java PRof.ª Cristiane Fidelix
Aula1- Java PRof.ª Cristiane Fidelix
 
Objects calisthenics - Os 10 mandamentos do rei do código
Objects calisthenics - Os 10 mandamentos do rei do códigoObjects calisthenics - Os 10 mandamentos do rei do código
Objects calisthenics - Os 10 mandamentos do rei do código
 
Lógica de programação 1
Lógica de programação 1Lógica de programação 1
Lógica de programação 1
 
TDC2018SP | Trilha Ruby - Design de aplicacoes orientadas a objeto: uma visao...
TDC2018SP | Trilha Ruby - Design de aplicacoes orientadas a objeto: uma visao...TDC2018SP | Trilha Ruby - Design de aplicacoes orientadas a objeto: uma visao...
TDC2018SP | Trilha Ruby - Design de aplicacoes orientadas a objeto: uma visao...
 
Design de aplicações orientadas a objeto
Design de aplicações orientadas a objetoDesign de aplicações orientadas a objeto
Design de aplicações orientadas a objeto
 
ebook-completo c# o melhor para começar no c#
ebook-completo c# o melhor para começar no c#ebook-completo c# o melhor para começar no c#
ebook-completo c# o melhor para começar no c#
 
C# 8 e ML.NET
C# 8 e ML.NETC# 8 e ML.NET
C# 8 e ML.NET
 
Introdução_a_linguagem C _pare1_(1).pptx
Introdução_a_linguagem C _pare1_(1).pptxIntrodução_a_linguagem C _pare1_(1).pptx
Introdução_a_linguagem C _pare1_(1).pptx
 
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
 
Cap04
Cap04Cap04
Cap04
 
Cap04
Cap04Cap04
Cap04
 
Cap04
Cap04Cap04
Cap04
 
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
 
05 - Sincronização de Threads - I
05 - Sincronização de Threads - I05 - Sincronização de Threads - I
05 - Sincronização de Threads - I
 

Mais de Gabriel Schade Cardoso

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
 
Programação Funcional usando F#
Programação Funcional usando F#Programação Funcional usando F#
Programação Funcional usando F#
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
 
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
 
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
 
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 (12)

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
 
Programação Funcional usando F#
Programação Funcional usando F#Programação Funcional usando F#
Programação Funcional usando F#
 
Clean Architecture com .NET Core
Clean Architecture com .NET CoreClean Architecture com .NET Core
Clean Architecture com .NET Core
 
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
 
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
 
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

Logica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptxLogica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptx
Momento da Informática
 
Segurança Digital Pessoal e Boas Práticas
Segurança Digital Pessoal e Boas PráticasSegurança Digital Pessoal e Boas Práticas
Segurança Digital Pessoal e Boas Práticas
Danilo Pinotti
 
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdfTOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
Momento da Informática
 
Certificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdfCertificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdf
joaovmp3
 
História da Rádio- 1936-1970 século XIX .2.pptx
História da Rádio- 1936-1970 século XIX   .2.pptxHistória da Rádio- 1936-1970 século XIX   .2.pptx
História da Rádio- 1936-1970 século XIX .2.pptx
TomasSousa7
 
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdfDESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
Momento da Informática
 
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
Faga1939
 
Manual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdfManual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdf
WELITONNOGUEIRA3
 

Último (8)

Logica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptxLogica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptx
 
Segurança Digital Pessoal e Boas Práticas
Segurança Digital Pessoal e Boas PráticasSegurança Digital Pessoal e Boas Práticas
Segurança Digital Pessoal e Boas Práticas
 
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdfTOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
 
Certificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdfCertificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdf
 
História da Rádio- 1936-1970 século XIX .2.pptx
História da Rádio- 1936-1970 século XIX   .2.pptxHistória da Rádio- 1936-1970 século XIX   .2.pptx
História da Rádio- 1936-1970 século XIX .2.pptx
 
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdfDESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
 
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
 
Manual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdfManual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdf
 

Uma abordagem funcional para gerenciamento de erros