Troque throw Exception por Notification em suas validações
É comum, pelo menos eu espero, que em qualquer aplicação existam validações de regra de negócio e, em caso de falha, devemos exibir uma mensagem para o usuário. Mas como você faz a coleta desses erros na camada de domínio, sem encher o código de throw Exception?
Bom, existe um pattern muito bacana chamado Notification que faz esse trabalho pra nós e de quebra elimina das entidades o uso de throw Exception.
Primeiro, vamos entender qual é a definição de uma Exceção.
A exceção em um programa é um evento indesejado e inesperado, que pode alterar o fluxo normal de execução ou termina-lo por completo. Uma exceção normalmente não está sob o controle do programador. Por exemplo:
- Uma requisição a um WebService que está fora;
- Uma operação a um banco de dados que está fora;
- Acesso a disco para leitura/escrita de um arquivo.
Já as regras de negócio são normalmente só isso: regras. É algo planejado e programado, e faz parte do fluxo condicional de ifs e elses da nossa aplicação.
Pense que você cria a validação da regra de negócio justamente para saber se o dado foi informado corretamente.
Bom, mas vamos ao código! Para o exemplo usei a linguagem C#.
Primeiro criaremos uma classe chamada Notification, para representar um erro em nossa aplicação.
Agora criaremos uma maneira para que as notificações sejam coletadas e que as entidades adquiram esse comportamento. Para isso criaremos uma classe abstrata chamada Notifiable.
Por fim, criaremos a entidade User e aplicaremos o comportamento de Notifiable.
Pronto! Agora a entidade User é Notifiable e possui o necessário para adicionar uma notificação e saber se está válida.
Para sabermos se a instância de User está válida usaremos o método IsValid().
Sucesso! Assim implementamos o Notification Pattern em nossa aplicação.
Claro, em uma aplicação real, unido com outros patterns, este código pode melhorar muito. Porém, para o conhecimento da existência do pattern, acredito que o exemplo usado no post seja o suficiente.
Bom uso!
Referências: