Quando ho molti dati che devono essere validati, dovrei creare una nuova classe al solo scopo di validazione o devo attenermi alla validazione nel metodo?
Il mio esempio particolare riguarda un torneo e una classe evento / categoria: Tournament
e Event
, che modella un torneo sportivo e ogni torneo ha una o più categorie.
Ci sono tutti i tipi di cose da convalidare in queste classi: i giocatori dovrebbero essere vuoti, dovrebbero essere unici, il numero di partite che ogni giocatore dovrebbe giocare, il numero di giocatori che ogni partita ha, matchup predefiniti e un eccetera davvero grande, incluso molto altro regole complesse.
Ci sono anche alcune parti che devo convalidare nel loro insieme, come il modo in cui le classi si integrano l'una con l'altra. Ad esempio, la convalida unitaria di a Player
può andare bene, ma se un evento ha lo stesso giocatore due volte, si tratta di un errore di convalida.
Che ne dici di questo ?: Dimentico assolutamente qualsiasi controllo preliminare quando utilizzo i setter delle classi del mio modello e metodi simili per aggiungere dati e invece lascio che le classi di validazione gestiscano ciò.
Quindi avremo qualcosa di simile EventValidator
a Event
come membro e un validate()
metodo che convalida l'intero oggetto, oltre a metodi singolari per convalidare tutte le regole dei membri.
Quindi, prima di creare un'istanza di un oggetto validabile, eseguirò la convalida per impedire valori illegali.
Il mio design è corretto? Dovrei fare qualcosa di diverso?
Inoltre, dovrei usare metodi di validazione di ritorno booleani? O semplicemente lanciare un'eccezione se la validazione fallisce? Mi sembra che l'opzione migliore sarebbe un metodo di restituzione booleano e generare l'eccezione quando l'oggetto viene istanziato, ad esempio:
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?
}
}