Lorsque j'ai beaucoup de données à valider, dois-je créer une nouvelle classe dans le seul but de la validation ou dois-je m'en tenir à la validation dans la méthode?
Mon exemple particulier envisage un tournoi et une classe d'événement / catégorie: Tournament
et Event
, qui modélise un tournoi sportif et chaque tournoi a une ou plusieurs catégories.
Il y a toutes sortes de choses à valider dans ces classes: les joueurs doivent être vides, doivent être uniques, le nombre de matchs que chaque joueur doit jouer, le nombre de joueurs que chaque match a, des matchs prédéfinis, et un très gros etcetera, y compris beaucoup plus règles complexes.
Il y a aussi certaines parties que je dois valider dans son ensemble, comme la façon dont les classes s'intègrent les unes aux autres. Par exemple, la validation unitaire d'un Player
peut être très bien, mais si un événement a le même joueur deux fois, c'est une erreur de validation.
Alors qu'en est-il?: J'oublie absolument toute pré-vérification lorsque j'utilise les setters de mes classes de modèles et des méthodes similaires pour ajouter des données et à la place je laisse les classes de validation s'en occuper.
Nous aurons donc quelque chose comme EventValidator
avec un en Event
tant que membre et une validate()
méthode qui valide tout l'objet, ainsi que des méthodes singulières pour valider les règles de tous les membres.
Ensuite, avant d'instancier un objet validable, j'exécuterai la validation pour empêcher les valeurs illégales.
Ma conception est-elle correcte? Dois-je faire quelque chose différemment?
De plus, dois-je utiliser des méthodes de validation de retour booléen? Ou simplement lever une exception si la validation échoue? Il me semble que la meilleure option serait de renvoyer des méthodes booléennes et de lever l'exception lorsque l'objet est instancié, par exemple:
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?
}
}
la source
Validator
ou dansValidable
? Et comment puis-je travailler ces messages en conjonction avec leValidationException
?Validatable
c'est un bien meilleur nom queValidable
comme c'est le vrai adjectifC'est le problème. Idéalement, vous devez empêcher que vos objets aient un état non valide: n'autorisez pas l'instanciation avec un état non valide et si vous devez avoir des setters et d'autres méthodes de changement d'état, lancez une exception juste là.
Ce n'est pas contradictoire. Si la logique de validation est suffisamment complexe pour justifier sa propre classe, vous pouvez toujours déléguer la validation. Et si je comprends bien, c'est exactement ce que vous faites maintenant:
Si vous avez encore des setters qui pourraient entraîner un état non valide, assurez-vous de valider avant de réellement changer d'état. Sinon, vous aurez un message d'erreur, mais vous laisserez toujours votre objet avec un état non valide. Encore une fois: empêchez vos objets d'avoir un état invalide
Cela me semble bien, car le validateur attend une entrée valide ou invalide, donc de son point de vue, une entrée invalide ne fait pas exception.
Mise à jour: si "le système dans son ensemble" devient invalide, la raison en est qu'un objet doit avoir changé (par exemple un joueur) et un objet éventuellement de niveau supérieur (par exemple un événement) qui fait référence à cet objet a une condition qui n'est plus remplie . Désormais, une solution serait de ne pas autoriser de modifications directes du lecteur qui pourraient rendre quelque chose non valide à un niveau supérieur. C'est là que les objets immuables aident. Un joueur changé est alors un objet différent. Une fois qu'un joueur est associé à un événement, vous ne pouvez le modifier qu'à partir de l'événement lui-même (car vous devrez changer la référence à un nouvel objet) et valider à nouveau immédiatement.
la source