Troque throw Exception por Notification em suas validações

Fabrício Moraes
CWI Software
Published in
3 min readFeb 1, 2019

É 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!

Gist completo aqui.

Referências:

--

--