2013-08-19 16 views
16

Jestem pewien, że nie jestem jedynym, który stoi w obliczu tego problemu, ale nie jestem w stanie znaleźć rozwiązania do tej pory. Problem jest jak poniżej.Który wzór do użycia do sprawdzania poprawności

Opublikowałem serwis internetowy (na którym nie mam żadnej kontroli i nie mogę go zmienić) z dotychczasowego systemu i wszyscy klienci go używają. Otrzymuję żądania od usługi sieciowej, a otrzymany obiekt jest bardzo złożony, ale dla przykładu powiedzmy, że otrzymuję obiekt A z wywołania usługi sieciowej, który zawiera kilka innych obiektów, takich jak Obiekt B, Obiekt C w nim itp. ponadto obiekty B & C mają również pewne pierwotne typy danych, jak również niektóre inne obiekty w nich. Mój problem polega na tym, że chcę zweryfikować cały obiekt A (wszystkie obiekty i obiekty podrzędne), który wzór wzorowy jest tutaj zalecany? Po drugie, głównym punktem jest to, że mogę uzyskać różne typy obiektu A z usługi internetowej. To, co naprawdę rozumiem przez różne typy obiektów A, polega na tym, że Obiekt A zależy od klienta, tzn. Niektórzy klienci wyślą Obiekt A bez wypełnienia danych w zawierającym Obiekt B lub nawet mogą częściowo wypełnić Obiekt B, a następnie wysłać go do Obiektu A Tak więc muszę zweryfikować obiekt A w oparciu o klienta (ponieważ niektórzy klienci będą wymagać zawarcia obiektu B, niektórzy nie będą, niektórzy będą wymagać kilku elementów w obiekcie B itd.). Innymi słowy, będę miał miejsce, w którym będę przechowywać reguły sprawdzania poprawności dla każdego klienta, który powie mi coś takiego, że klient ABC chce, aby pole abc w obiekcie B było ciągiem typu, a maksymalna długość to 25 znaków i jest obowiązkowe mieć dane w tym polu.

Niektóre validations które chciałbym wykonać to

Sprawdzanie pól jakiegoś przedmiotu (słownie Obiekt b) dla typów danych, długość danej dziedzinie, jest pole wymagane dla tego klienta, czy jest to opcjonalne etc etc ...

Każdy konkretny przykład pracy będzie niezwykle przydatny.

Struktura obiektu A dla tego konkretnego przykładu wygląda następująco.

public class A 
    { 
     private B objectB; 
     private C objectC; 
     // and so on 
    } 

    public class B{ 
     private E objectE; 
     private String name; 
     private int age; 
     // and so on 
    } 

    public class C 
    { 
     private F objectF; 
     private String address; 
     private String country; 
    } 

    public class E 
    { 
     // Members here 
    } 

    public class F 
    { 
     // Members here 
    } 

P.S: Podałem arbitralne nazwy klasom i członkom tylko dla ogólnego zrozumienia. O tak, zapomniałem wspomnieć, że używam tutaj języka Java, ale nie ma to znaczenia, ponieważ zasady lub wzorce projektowe można zastosować do dowolnego języka. Mam nadzieję, że wkrótce się odezwę. :)

+1

Walidację można przeprowadzić na wiele sposobów i opiera się ona w dużej mierze na opiniach. Spójrz na [Wzór strategii] (http://en.wikipedia.org/wiki/Strategy_pattern). – Bart

+0

Czy możesz polecić jakąkolwiek alternatywę inną niż wzorzec strategii? –

+0

Proponuję użyć kombinacji Visitor i Factory/AbstractFactory. Fabryka może tworzyć dowolne klasy walidatorów według typu klienta ze specjalnymi regułami. Odwiedzający samochód sprawdza poprawność całej struktury, używając klasy sprawdzania poprawności –

Odpowiedz

6

Walidacja to problem dotyczący cięcia krzyżowego. Istnieje kilka sposobów i można wdrożyć kilka wzorców projektowych.

W asp.net jest to wykonywane za pomocą atrybutów, w Java Spring odbywa się za pomocą adnotacji, aby kod był czysty, czytelny i możliwy do utrzymania.

Możesz znaleźć mnóstwo różnych podejść, o czym musisz pamiętać, to podejście tych ram jest następujące. tj. utrzymanie kodu, czytelność i czysty kod.

Nie ma srebrnej kuli. Możesz nawet napisać weryfikację w swoim kodzie.

+0

Wspomniał pan o bardzo miłym punkcie (który zupełnie zapomniałem), że walidacja jest problemem o charakterze przekrojowym. Dziękuję za to. Jeśli napiszę kod sprawdzania poprawności w moich obiektach biznesowych lub dowolnym obiekcie, czy nie zaśmieci kodu? Myślę, że to naruszy zasadę jednej odpowiedzialności, co powiesz? –

+1

tak, robi to i dlatego walidacja jest problemem krzyżowym, podobnie jak rejestracja, czasami nie można tego uniknąć. musisz zwrócić uwagę na poprawność kodu, czystość, czytelność, powtarzalność i łatwość konserwacji. – DarthVader

+0

Czy możesz zaproponować mi wzór projektu inny niż wzór strategii? Staram się, aby mój kod był czysty, czytelny, możliwy do utrzymania i przestrzegam zasady DRY, ale myślę, że osiągnąłem punkt, w którym muszę zabrudzić ręce .. :) –

0

Każda klasa powinna wiedzieć, jak się sprawdzić. Możesz wyprowadzić każdą klasę z interfejsu (powiedzmy IValidatable), który ma metodę .Validate(). Gdy wywołasz funkcję .Validate() na obiekcie A, poproś o sprawdzenie samego siebie, a następnie wywołaj metodę .Validate() na wszystkich elementach podrzędnych. Te dzieci mogą walidować się w podobny sposób.

Myślę, że jest to naprawdę prosta wersja wzorca polecenia. Raczej.

Możesz również utworzyć Walidator, który możesz dołączyć do swojej klasy. Walidator może wiedzieć, jak sprawdzać poprawność adresów e-mail, regularne adresy itd. Jest to nieco bardziej rozszerzalne, ponieważ zasadniczo tworzysz zestaw narzędzi do dołączenia do klasy, która zawiera tylko potrzebne narzędzia.

+3

Tak, to jest na początku to, co myślałem o tym, że każda klasa będzie odpowiedzialna za jej własną walidację, ale myślę, że poprzez wykonanie tej zasady jednej odpowiedzialności zostanie naruszona, a dodatkowo faktyczny kod może być zagracony z kod biznesowy. Jakieś przemyślenia na ten temat? –

+0

Krótka odpowiedź: to zależy. Jeśli korzystasz z Domain Driven Design, możesz zweryfikować wszystkie właściwości na setterach - to z pewnością byłby bezpieczny sposób, aby to zrobić, jeśli martwisz się o jedną responsiblię. Myślę, że stosując scenariusz strategii Validator, nadal jesteś bezpieczny. Walidator jest odpowiedzialny za walidację. po prostu odnosi się do obiektu, który potwierdza. –

Powiązane problemy