Utilizando
Sealed Classes
para controle de fluxos
alexrios.github.io
alex.rios@protonmail.com
@alextrending
Alex Rios
Quem sou eu?
Gosto de implementar sistemas embarcados e fazer integrações não usuais.
Me interesso por testabilidade, qualidade e explicitação do código e arquitetura baseadas em Event Sourcing.
Por onde passei até agora
Agenda
-
O problema com as exceções
-
Sealed Classes
-
Benefícios
-
Seja Exaustivo
-
Variações
-
Adeus exceções?
O problema com as exceções
O que é uma exceção?
desvio de uma regra ou de um padrão convencionalmente aceito
O que é um tratamento de exceção?
O mecanismo da linguagem que é responsável por lidar com as condições que alteram o fluxo de execução.
A anatomia do tratamento de exceções
clausula de marcação
try, ou outra palavra reservada para inicio de um bloco de código.
bloco de tratamento
catch - except - rescue
Bloco independente da ocorrência da exceção
finally - ensure
O que tem de errado com esse código?
Esse código é passível de erros. Você sabe como lidar com as falhas dessa chamada?
Kotlin não te obriga a tratar as exceções pois não existem exceções checadas.
Mais sobre checked exceptions
Rod Waldhoff
Bruce Eckel
Anders Hejlsberg
checked exceptions
No inicio você se sente mais seguro com elas, mas depois elas não deixam você nadar mais rápido.
Lendo o código descobrimos que temos que tratar a UserProfileClientException
Agora já sabemos que esse erro receberá o tratamento adequado
-
Ininteligível (try-catch hell)
-
Não é fácil identificar qual método lançou a exceção
-
Tratamos todos os erros possíveis?
-
Fluxo de execução confuso
-
Muitos round-trips no código para descobrir o que esta acontecendo
E se tivéssemos um jeito de modelar o nosso resultado da chamada em um objeto que mapeasse o sucesso e falha?
Sealed Classes!
Sealed classes são usadas para representar hierarquias de classes restritas.
Ambos são conjuntos de valores restritos, mas cada constante enum existe apenas como uma única instância, enquanto uma subclasse de uma classe selada pode ter várias instâncias que podem conter estado.
Sealed Classes vs. Enums
Uma sealed class dentro de um when força todos os casos a serem tratados.
Em um exemplo mais complexo
Benefícios
Menos erros. Código agora é type-safe e podemos contar com o Intellisense da sua IDE favorita.
O fluxo dos dados agora não é ambíguo, garantido pelo compilador.
Legibilidade. Com uma boa nomenclatura e o uso do when é muito simples acompanhar o código.
Rastreabilidade & Previsibilidade. A execução não tem saltos inesperados. O fluxo pode ser lido de cima para baixo.
Alguns pontos sobre modelagem baseada em resultado
Ter o objeto Error reflete melhor a realidade e eleva seu tratamento a first class citizen da logica de negocio.
O objeto pode ser passado pelas chamadas
(ex. Pode ser colocado em uma fila).
Melhor suporte ao idioma funcional. requestUserProfile() sempre retorna um valor.
Nada alem disso pode acontecer (como lançar uma exceção).
Isso torna mais fácil o uso de lambdas e a collections API.
Processamento em Batch e paralelização de multiplos requests fica mais fácil de implementar (comparado com a versão com métodos lançando exceções).
Result Class Genérica
Seja Exaustivo
Para tirar máximo proveito das sealed classes, when deve ser usado como uma expressão
Forçando a exaustão
Variações
Alguns casos sem estado
Enum quando todos os casos forem sem estado
Utilizando propriedades nos objetos de resultado
Imagine a implementação da função
Adeus exceções?
Não!
Ainda precisamos de exceções.
Sugestão
Use result objects para chamadas externas (chamadas a uma API).
Ou algo mais sofisticado que apenas logar.
Sugestão
Use exceções quando vc não tem nenhuma ação a tomar.
ex: log, database fora do ar.
Use o que funciona para você e para sua equipe
Não é uma formula mágica de controlar estado e fluxos. É apenas mais uma opção.
alexrios.github.io
alex.rios@protonmail.com
@alextrending
Obrigado!
Sealed Classes (45 min version)
By Alex Rios
Sealed Classes (45 min version)
Problema que excecoes e como sealed classes podem ajudar
- 314