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?
}
}
quelle
Validator
oder in seinValidable
? Und wie kann ich diese Nachrichten in Verbindung mit dem bearbeitenValidationException
?Validatable
ist ein weit besserer Name alsValidable
wie es das reale Adjektiv istDas ist das Problem. Idealerweise sollten Sie verhindern, dass Ihre Objekte einen ungültigen Status haben: Lassen Sie keine Instanziierung mit ungültigem Status zu, und wenn Sie Setter und andere Methoden zum Ändern des Status benötigen, lösen Sie genau dort eine Ausnahme aus.
Dies ist kein Widerspruch. Wenn die Validierungslogik komplex genug ist, um eine eigene Klasse zu rechtfertigen, können Sie die Validierung dennoch delegieren. Und wenn ich Sie richtig verstehe, ist dies genau das, was Sie jetzt tun:
Wenn Sie immer noch Setter haben, die möglicherweise zu einem ungültigen Status führen, stellen Sie sicher, dass Sie validieren, bevor Sie den Status tatsächlich ändern. Andernfalls wird eine Fehlermeldung angezeigt, und das Objekt weist weiterhin einen ungültigen Status auf. Nochmals: Verhindern Sie, dass Ihre Objekte einen ungültigen Status haben
Hört sich für mich gut an, da der Prüfer eine gültige oder ungültige Eingabe erwartet, ist eine ungültige Eingabe aus seiner Sicht keine Ausnahme.
Update: Wenn "das System als Ganzes" ungültig wird, muss sich ein Objekt geändert haben (z. B. ein Spieler) und ein möglicherweise übergeordnetes Objekt (z. B. ein Ereignis), das auf dieses Objekt verweist, hat eine Bedingung, die nicht mehr erfüllt ist . Eine Lösung wäre nun, keine direkten Änderungen am Player zuzulassen, die auf einer höheren Ebene zu einer Ungültigkeit führen könnten. Hier helfen unveränderliche Objekte . Dann ist ein veränderter Spieler ein anderes Objekt. Sobald ein Spieler einem Ereignis zugeordnet ist, können Sie es nur vom Ereignis selbst aus ändern (da Sie den Verweis auf ein neues Objekt ändern müssen) und es sofort erneut validieren.
quelle