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?
}
}