Patrón de diseño para validación de datos

23

¿Cuál sería el mejor patrón de diseño para este problema?

Tengo un Objeto A. El Objeto A puede ser registrado o eliminado de la base de datos dependiendo de la solicitud del usuario.

La validación de datos se realiza antes del registro o eliminación del objeto. Hay un conjunto de reglas para verificar antes de que el objeto pueda registrarse y otro conjunto de reglas para su eliminación. Algunas de estas reglas son comunes para ambas operaciones.

Hasta ahora, creo que el patrón de diseño de la Cadena de responsabilidad se ajusta más, pero tengo problemas para implementarlo.

melodui
fuente
66
¿Por qué crees que el patrón de diseño de la Cadena de responsabilidad es el mejor?
Adam Zuckerman

Respuestas:

17

Normalmente usaré una clase de validador separada para validar cada caso de uso. Por ejemplo, antes de agregar el producto a la base de datos, usaré AddProductValidator para validar la regla de negocios, antes de eliminar el producto, usaré DeleteProductValidator para validar, etc. Las reglas de negocios comunes se pueden extraer a la clase de especificación (Patrón de especificación) y compartirlas entre las clases de validación

Para estructurar la clase de validador, sigo el enfoque aquí: http://lostechies.com/jimmybogard/2007/10/24/entity-validation-with-visitors-and-extension-methods/

Si usa .NET, creo que podría considerar una validación fluida ( https://github.com/JeremySkinner/FluentValidation ). Creo que es bastante bueno y muy cercano al artículo que mencioné anteriormente

Phuong Nguyen
fuente
1
nueva url de validación fluida: github.com/JeremySkinner/FluentValidation
Brij
4

Como se describe, probablemente implementaría un tipo de opción . De esa forma, podría devolver un "Ninguno" o un valor validado (quizás de manera perezosa), pero ese es un detalle de implementación y me lleva muy bien a la idea de usar un Decorador .

Patrón Decorador

Por supuesto, si la interfaz se vuelve fea, usaría una fachada .

Elliott Frisch
fuente
Decorator funcionaría, pero generalmente pienso en el patrón Decorator como algo que se debe usar cuando se desea transformar la salida en entrada para que otra clase la use. En este caso, simplemente estaría validando. Creo que la cadena de responsabilidad puede funcionar mejor en mi humilde opinión.
Neil