Cuando tengo muchos datos que necesitan ser validados, ¿debo crear una nueva clase con el único propósito de validación o debo seguir con la validación dentro del método?
Mi ejemplo particular contempla un torneo y una clase de evento / categoría: Tournament
y Event
, que modela un torneo deportivo y cada torneo tiene una o varias categorías.
Hay todo tipo de cosas para validar en estas clases: los jugadores deben estar vacíos, deben ser únicos, la cantidad de partidos que cada jugador debe jugar, la cantidad de jugadores que tiene cada partido, enfrentamientos predefinidos y un gran etcétera que incluye mucho más. reglas complejas
También hay algunas partes que necesito validar en su conjunto, como la forma en que las clases se integran entre sí. Por ejemplo, la validación unitaria de a Player
puede estar bien, pero si un evento tiene el mismo jugador dos veces, eso es un error de validación.
Entonces, ¿qué tal esto ?: Me olvido de absolutamente cualquier verificación previa cuando uso los setters de mis clases de modelo y métodos similares para agregar datos y en su lugar dejo que las clases de validación se encarguen de eso.
Entonces tendremos algo así como EventValidator
un Event
como miembro, y un validate()
método que valida todo el objeto, además de métodos singulares para validar las reglas de todos los miembros.
Luego, antes de crear una instancia de un objeto validable, ejecutaré la validación para evitar valores ilegales.
¿Es correcto mi diseño? ¿Debo hacer algo diferente?
Además, ¿debo usar métodos de validación de retorno booleanos? ¿O simplemente lanzar una excepción si la validación falla? Me parece que la mejor opción serían los métodos de retorno booleanos y lanzar la excepción cuando se crea una instancia del objeto, por ejemplo:
public Event() {
EventValidator eventValidator = new EventValidator(this);
if (!eventValidator.validate()) {
// show error messages with methods defined in the validator
throw new Exception(); // what type of exception would be best? should I create custom ones?
}
}
fuente
Validator
o dentroValidable
? ¿Y cómo puedo trabajar estos mensajes junto con elValidationException
?Validatable
es un nombre mucho mejor queValidable
como es el adjetivo realEse es el problema. Idealmente, debe evitar que sus objetos tengan un estado no válido: no permita la creación de instancias con un estado no válido y si debe tener setters y otros métodos de cambio de estado, inicie una excepción allí mismo.
Esto no es contradictorio. Si la lógica de validación es lo suficientemente compleja como para garantizar su propia clase, aún puede delegar la validación. Y si entiendo que estás en lo correcto, esto es exactamente lo que estás haciendo ahora:
Si todavía tiene configuradores que pueden generar un estado no válido, asegúrese de validar antes de cambiar el estado. De lo contrario, tendrá un mensaje de error, pero aún dejará su objeto con un estado no válido. Nuevamente: evite que sus objetos tengan un estado no válido
Me parece bien, ya que el validador espera una entrada válida o no válida, por lo que desde su perspectiva, la entrada no válida no es una excepción.
Actualización: si "el sistema en su conjunto" no es válido, la razón es que algún objeto debe haber cambiado (por ejemplo, un jugador) y algún objeto posiblemente de nivel superior (por ejemplo, un evento) que hace referencia a este objeto tiene una condición que ya no se cumple . Ahora, una solución sería no permitir cambios directos en el jugador que pudieran invalidar algo en un nivel superior. Aquí es donde ayudan los objetos inmutables . Entonces un jugador cambiado es un objeto diferente. Una vez que un jugador está asociado a un evento, solo puede cambiarlo desde el evento en sí (porque tendrá que cambiar la referencia a un nuevo objeto) y volver a validarlo inmediatamente.
fuente