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?
}
}
źródło
Validator
czy wValidable
? Jak mogę pracować z tymi komunikatami w połączeniu zValidationException
?Validatable
jest to znacznie lepsza nazwa niżValidable
jest to prawdziwy przymiotnikTo jest problem. Idealnie powinieneś zapobiegać stanom niepoprawnych obiektów: nie zezwalaj na tworzenie instancji z niepoprawnym stanem, a jeśli musisz mieć obiekty ustawiające i inne metody zmieniające stan, rzuć tutaj wyjątek.
To nie jest sprzeczne. Jeśli logika sprawdzania poprawności jest na tyle złożona, że gwarantuje własną klasę, nadal możesz przekazać sprawdzanie poprawności. A jeśli rozumiem, że masz rację, właśnie to robisz teraz:
Jeśli nadal masz ustawienia, które mogą powodować nieprawidłowy stan, sprawdź poprawność przed faktyczną zmianą stanu. W przeciwnym razie pojawi się komunikat o błędzie, ale nadal pozostawisz swój obiekt w nieprawidłowym stanie. Znowu: nie dopuść, aby Twoje obiekty miały nieprawidłowy stan
Brzmi dla mnie dobrze, ponieważ walidator oczekuje poprawnych lub niepoprawnych danych wejściowych, więc z ich perspektywy nieprawidłowe dane wejściowe nie są wyjątkiem.
Aktualizacja: jeśli „system jako całość” stanie się nieważny, przyczyną jest to, że jakiś obiekt musiał się zmienić (np. Odtwarzacz), a jakiś obiekt prawdopodobnie wyższego poziomu (np. Zdarzenie), który odwołuje się do tego obiektu, ma warunek, który nie jest już spełniony . Teraz rozwiązaniem byłoby niedopuszczenie bezpośrednich zmian w odtwarzaczu, które mogłyby spowodować, że coś będzie nieważne na wyższym poziomie. Tutaj pomagają niezmienne obiekty . Zatem zmieniony gracz jest innym przedmiotem. Gdy gracz zostanie powiązany z wydarzeniem, możesz go zmienić tylko od samego zdarzenia (ponieważ będziesz musiał zmienić odniesienie do nowego obiektu) i ponownie natychmiast sprawdzić poprawność.
źródło