Quando ho molti dati che devono essere convalidati, dovrei creare una nuova classe per il solo scopo di validazione o dovrei attenermi alla convalida in-method?
Il mio esempio particolare contempla un torneo e una classe evento / categoria: Tournament
e Event
, che modella un torneo di sport 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, i matchup predefiniti e un grande eccetera incluse regole molto più complesse.
Ci sono anche alcune parti che ho bisogno di convalidare nel suo complesso, come il modo in cui le classi si integrano l'una con l'altra. Ad esempio, la convalida unitaria di Player
può essere perfetta, ma se un evento ha lo stesso giocatore due volte, si tratta di un errore di convalida.
Che ne dici ?: Mi dimentico assolutamente di qualsiasi pre-controllo quando uso i setter delle mie classi di modelli e metodi simili per aggiungere dati e invece permetto alle classi di validazione di gestirli.
Quindi avremo qualcosa come EventValidator
con un Event
come membro e un metodo validate()
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 valido, eseguirò la convalida per evitare valori illegali.
Il mio progetto è corretto? Dovrei fare qualcosa di diverso?
Inoltre, dovrei usare i metodi di validazione di restituzione booleana? Oppure lanciare un'eccezione se la convalida fallisce? A mio parere, l'opzione migliore sarebbe rappresentata dai metodi di restituzione booleani e dall'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?
}
}