2011-07-14 12 views
7

Zastanawiam się, jaka jest najlepsza metoda sprawdzania poprawności obiektów. Czy istnieje jakiś dodatkowy argument przeciwko sprawie pierwszej lub drugiej sprawie? Czy istnieje inny sposób?Proste sprawdzanie poprawności obiektów w Javie

Nie szukam żadnej biblioteki sprawdzania poprawności, po prostu chcę wykonać prostą weryfikację.

Case Jeden

class A { 
    public void doSomething(MyObject o) { 
     try { 
     validate(o); 
     doSomethingUseful(o); 
     } catch (ValidationException e) { 
     Logger.getLogger().warn(e); 
     } 
    } 

    private void validate(MyObject o) throws ValidationException 
    { 
     if (o.getXYZ() == null) 
     throw new ValidationException("Field XYZ cannot be null"); 
    } 

    private void doSomethingUseful(MyObject o) { //some funny stuff } 
} 

Case Dwa

class A { 
    public void doSomething(MyObject o) { 
     if (validate(o)) { 
     doSomethingUseful(o); 
     } else 
     Logger.getLogger().warn("Object is invalid"); 
     } 
    } 

    private boolean validate(MyObject o) 
    { 
     if (o.getXYZ() == null) return false; 
     return true; 
    } 

    private void doSomethingUseful(MyObject o) { //some funny stuff } 
} 
+1

Brak silnych preferencji. Bardziej znaczące, być może, jest to, co robisz, aby móc uchwycić wiele wad walidacji na tym samym obiekcie, aby użytkownik nie musiał próbować w kółko, aby zobaczyć, co jest następną wadą. –

+1

Dlaczego funkcja sprawdzania poprawności dla przypadku drugiego ma wartość "throws ValidationException", jeśli pracujesz z wartościami zmiennymi? –

+1

@Damokles prawdopodobnie skopiować pastę – RMT

Odpowiedz

7

Jeśli po prostu przełkniesz wyjątek i jeśli metoda sprawdzania poprawności jest tylko prywatna, to wolisz case two, ponieważ nie powinieneś używać wyjątków dla normalnej logiki.

Jeśli chcesz, aby klient obsługiwał wyjątek, który powinieneś, użyj case one, ale pozwól mu go rzucać zamiast połykać.

+3

+1 dla "nie należy używać wyjątków dla normalnej logiki" – prasopes

+0

+1 Wyjątki są dla wyjątkowych przypadków – alexcoco

1

Również w drugim przypadku metoda validate nigdy nie rzuci ValidationException, więc jeśli chcesz zarządzać więcej niż jeden wyjątek (null, zły format, ...), proponuję użyć pierwszego, aby można było wysłać jasny i użyteczny komunikat o błędzie.

1

Jeśli rzeczywiście wykonujesz tylko jedną walidację pola, to przypadek 2 jest lepszy, ponieważ jest jasne, co jest nie tak z obiektem.

Jeśli potrzebujesz więcej informacji na temat błędu sprawdzania poprawności lub jeśli musisz przekazać wiele błędów sprawdzania poprawności, możesz użyć obiektu wyjątku jako kontenera do przekazywania dodatkowych informacji.

+0

+1 Pisałem dokładnie tę samą odpowiedź :) – MarcoS

+0

jak ... naprawdę? ... – talnicolas

2

Here to świetny artykuł Joela Spolsky'ego do rozważenia czytania. Osobiście wolę drugi przypadek. Obsługa wyjątków może stać się nieporządnym IMO.

+0

+1 dla odpowiedzi + odniesienia – RMT

0

Innym sposobem, według którego można zaprojektować ten kod, jest użycie programowania zorientowanego na aspekt. Dodany kod weryfikacyjny stanowi problem, który psuje kod biznesowy. Jeśli użyjesz aspektu, możesz uniknąć zanieczyszczania kodu kodem walidacyjnym. Możesz odwołać się do tego artykułu http://www.developer.com/java/5-reasons-java-developers-should-learn-and-use-aspectj.html, który pokazuje przypadek użycia sprawdzania poprawności przy użyciu Aspects.

Powiązane problemy