Wzorzec projektowy do sprawdzania poprawności danych

23

Jaki byłby najlepszy wzór dla tego problemu:

Mam obiekt A. Obiekt A można zarejestrować lub usunąć z bazy danych w zależności od żądania użytkownika.

Sprawdzanie poprawności danych odbywa się przed rejestracją lub usunięciem obiektu. Istnieje zestaw reguł do sprawdzenia przed zarejestrowaniem obiektu oraz inny zestaw reguł do usunięcia. Niektóre z tych zasad są wspólne dla obu operacji.

Jak dotąd uważam, że wzór projektowania Łańcucha odpowiedzialności najbardziej pasuje, ale mam problem z jego wdrożeniem.

melodui
źródło
6
Jak myślisz, dlaczego wzór projektowania Łańcucha odpowiedzialności jest najlepszy?
Adam Zuckerman

Odpowiedzi:

17

Zwykle użyję osobnej klasy walidatora, aby sprawdzić poprawność każdego przypadku użycia. Np. Przed dodaniem produktu do bazy danych użyję AddProductValidator do zweryfikowania reguły biznesowej, przed usunięciem produktu użyję DeleteProductValidator do sprawdzenia poprawności itp. Wspólną regułę biznesową można wyodrębnić do klasy specyfikacji (wzorzec specyfikacji) i udostępnić klasom walidatora

Aby ustrukturyzować klasę walidatora, postępuję zgodnie z podejściem tutaj: http://lostechies.com/jimmybogard/2007/10/24/entity-validation-with-visitors-and-extension-methods/

Jeśli używasz platformy .NET, myślę, że możesz rozważyć płynną walidację ( https://github.com/JeremySkinner/FluentValidation ). Myślę, że to całkiem fajne i bardzo zbliżone do artykułu, o którym wspomniałem powyżej

Phuong Nguyen
źródło
1
nowy adres Fluent Validation: github.com/JeremySkinner/FluentValidation
Brij
4

Jak opisano, prawdopodobnie zaimplementowałbym typ opcji . W ten sposób mogłem zwrócić „Brak” lub zweryfikowaną wartość (być może leniwie), ale jest to szczegół implementacji i ładnie prowadzi do pomysłu użycia Dekoratora .

Wzór dekoratora

Oczywiście, jeśli interfejs stanie się brzydki, skorzystałbym z fasady .

Elliott Frisch
źródło
Dekorator działałby, ale zwykle myślę o wzorze Dekoratora jako o czymś, co można wykorzystać, gdy chcesz przekształcić dane wyjściowe w dane wejściowe dla innej klasy. W takim przypadku po prostu sprawdzasz poprawność. Myślę, że łańcuch odpowiedzialności może działać lepiej imho.
Neil