Wenn ich viele Daten habe, die validiert werden müssen, sollte ich eine neue Klasse zum alleinigen Zweck der Validierung erstellen oder mich an die methodeninterne Validierung halten?
Mein spezielles Beispiel sieht ein Turnier und eine Event- / Kategorie-Klasse vor: Tournament
und Event
, die ein Sportturnier modelliert und jedes Turnier eine oder mehrere Kategorien hat.
In diesen Klassen gilt es alle möglichen Dinge zu validieren: Die Spieler sollten leer sein, einzigartig, die Anzahl der Matches, die jeder Spieler spielen sollte, die Anzahl der Spieler, die jedes Match hat, vordefinierte Matchups und ein wirklich großes usw., einschließlich viel mehr komplexe Regeln.
Es gibt auch einige Teile, die ich als Ganzes überprüfen muss, z. B. wie sich Klassen ineinander integrieren. Zum Beispiel kann die einheitliche Validierung von a Player
in Ordnung sein, aber wenn ein Event zweimal denselben Spieler hat, ist das ein Validierungsfehler.
Wie wäre es damit ?: Ich vergesse jegliche Vorabprüfung, wenn ich die Setter meiner Modellklassen und ähnliche Methoden zum Hinzufügen von Daten verwende, und lasse stattdessen Validierungsklassen damit umgehen.
Wir werden also so etwas wie EventValidator
eine Event
als Mitglied haben und eine validate()
Methode, die das gesamte Objekt validiert, sowie singuläre Methoden, um die Regeln aller Mitglieder zu validieren.
Bevor ich dann ein validierbares Objekt instanziiere, werde ich die Validierung durchführen, um unzulässige Werte zu verhindern.
Ist mein Design korrekt? Sollte ich etwas anders machen?
Sollte ich auch boolesche Rückgabevalidierungsmethoden verwenden? Oder einfach eine Ausnahme auslösen, wenn die Validierung fehlschlägt? Es scheint mir, dass die beste Option boolesche Rückgabemethoden sind und die Ausnahme auslösen, wenn das Objekt instanziiert ist, zum Beispiel:
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?
}
}