Padrão de Design para Validação de Dados

23

Qual seria o melhor padrão de design para esse problema:

Eu tenho um Objeto A. O Objeto A pode ser registrado ou excluído do banco de dados, dependendo da solicitação do usuário.

A validação de dados é realizada antes do registro ou exclusão do objeto. Há um conjunto de regras a serem verificadas antes que o objeto possa ser registrado e outro conjunto de regras para exclusão. Algumas dessas regras são comuns para ambas as operações.

Até agora, acho que o padrão de design da Cadeia de Responsabilidade se encaixa mais, mas estou tendo problemas para implementá-lo.

melodui
fonte
6
Por que você acha que o padrão de design da Cadeia de Responsabilidade é o mais adequado?
23814 Adam Zuckerman

Respostas:

17

Normalmente, usarei uma classe de validador separada para validar cada caso de uso. Por exemplo, antes de adicionar o produto ao banco de dados, usarei AddProductValidator para validar a regra de negócios, antes de excluir o produto, usarei DeleteProductValidator para validar etc. Regra de negócios comum pode ser extraída para a classe de especificação (padrão de especificação) e compartilhada pelas classes de validador

Para estruturar a classe do validador, sigo a abordagem aqui: http://lostechies.com/jimmybogard/2007/10/24/entity-validation-with-visitors-and-extension-methods/

Se você usa o .NET, acho que você pode considerar a Validação Fluente ( https://github.com/JeremySkinner/FluentValidation ). Eu acho bem legal e bem perto do artigo que mencionei acima

Phuong Nguyen
fonte
1
nova url do Fluente Validação: github.com/JeremySkinner/FluentValidation
Brij
4

Conforme descrito, eu provavelmente implementaria um tipo de opção . Dessa forma, eu poderia retornar um "Nenhum" ou um valor validado (talvez preguiçosamente), mas esse é um detalhe da implementação e leva muito à idéia de usar um Decorator .

Padrão Decorador

Claro que se a interface se tornar feia eu usaria uma fachada .

Elliott Frisch
fonte
O Decorator funcionaria, mas geralmente penso no padrão Decorator como algo a ser usado quando você deseja transformar a saída em entrada para outra classe usar. Nesse caso, você simplesmente estaria validando. Eu acho que a cadeia de responsabilidade pode funcionar melhor no imho.
Neil