Zastanawiam się, czy powinienem bronić się przed wartością zwracaną wywołania metody, sprawdzając, czy spełniają one moje oczekiwania, nawet jeśli wiem, że metoda, którą wywołuję, spełni takie oczekiwania.
DANY
User getUser(Int id)
{
User temp = new User(id);
temp.setName("John");
return temp;
}
CZY POWINNAM
void myMethod()
{
User user = getUser(1234);
System.out.println(user.getName());
}
LUB
void myMethod()
{
User user = getUser(1234);
// Validating
Preconditions.checkNotNull(user, "User can not be null.");
Preconditions.checkNotNull(user.getName(), "User's name can not be null.");
System.out.println(user.getName());
}
Pytam o to na poziomie koncepcyjnym. Jeśli znam wewnętrzne działanie metody, którą wzywam. Albo dlatego, że to napisałem, albo sprawdziłem. A logika możliwych wartości, które zwraca, spełnia moje warunki wstępne. Czy „lepsze” lub „bardziej odpowiednie” jest pominięcie sprawdzania poprawności, czy powinienem nadal bronić się przed niewłaściwymi wartościami, zanim przejdę do metody, którą obecnie wdrażam, nawet jeśli zawsze powinna ona przejść.
Mój wniosek ze wszystkich odpowiedzi (nie wahaj się przyjść do swoich):
Podaj kiedy- W przeszłości metoda ta okazała się niewłaściwa
- Metoda pochodzi z niezaufanego źródła
- Metodę stosuje się z innych miejsc i nie określa ona wyraźnie warunków dodatkowych
- Metoda żyje blisko Ciebie (szczegóły znajdziesz w wybranej odpowiedzi)
- Metoda ta wyraźnie określa, że jest to umowa z czymś takim, jak odpowiedni dokument, bezpieczeństwo typu, test jednostkowy lub kontrola po spełnieniu warunku
- Wydajność ma kluczowe znaczenie (w takim przypadku aserowanie w trybie debugowania może działać jako podejście hybrydowe)
Null
)? Prawdopodobnie jest to równie problematyczne, jeśli nazwa to ""
(nie null, ale pusty ciąg) lub "N/A"
. Albo możesz zaufać wynikowi, albo musisz być odpowiednio paranoikiem.