Kiedy mam dużo danych, które należy zweryfikować, czy powinienem utworzyć nową klasę wyłącznie w celu sprawdzania poprawności, czy też powinienem trzymać się sprawdzania poprawności metodą?
Mój szczególny przykład dotyczy turnieju i klasy wydarzenia / kategorii: Tournament
i Event
która modeluje turniej sportowy, a każdy turniej ma jedną lub wiele kategorii.
W tych klasach jest wiele rzeczy do zweryfikowania: gracze powinni być puści, niepowtarzalni, liczba meczów, w które każdy gracz powinien zagrać, liczba graczy w każdym meczu, predefiniowane pojedynki i naprawdę duża itd. złożone zasady.
Jest też kilka części, które muszę zweryfikować jako całość, jak na przykład integracja klas. Na przykład jednolite sprawdzanie poprawności Player
może być w porządku, ale jeśli zdarzenie ma dwukrotnie tego samego gracza, jest to błąd sprawdzania poprawności.
A co powiesz na to ?: Zapominam o absolutnie jakiejkolwiek kontroli wstępnej, gdy używam ustawiaczy klas modelu i podobnych metod do dodawania danych, a zamiast tego pozwalam klasom walidacyjnym sobie z tym poradzić.
Będziemy mieli coś w rodzaju EventValidator
z elementem Event
członkowskim i validate()
metodę, która sprawdza poprawność całego obiektu, plus pojedyncze metody sprawdzania poprawności reguł wszystkich członków.
Następnie, przed utworzeniem wystąpienia ważnego obiektu, wykonam sprawdzanie poprawności, aby zapobiec nielegalnym wartościom.
Czy mój projekt jest poprawny? Czy powinienem zrobić coś inaczej?
Czy powinienem również używać logicznych metod sprawdzania poprawności? A może po prostu rzucić wyjątek, jeśli sprawdzanie poprawności się nie powiedzie? Wydaje mi się, że najlepszą opcją byłyby zwracające boolowskie metody i rzucały wyjątek, gdy obiekt zostanie utworzony w postaci instancji, na przykład:
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?
}
}