Ich frage mich, ob ich mich gegen den Rückgabewert eines Methodenaufrufs verteidigen soll, indem ich überprüfe, ob er meine Erwartungen erfüllt, auch wenn ich weiß, dass die von mir aufgerufene Methode diese Erwartungen erfüllt.
GEGEBEN
User getUser(Int id)
{
User temp = new User(id);
temp.setName("John");
return temp;
}
SOLL ICH TUN
void myMethod()
{
User user = getUser(1234);
System.out.println(user.getName());
}
ODER
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());
}
Ich frage dies auf konzeptioneller Ebene. Wenn ich das Innenleben der Methode kenne, rufe ich auf. Entweder weil ich es geschrieben habe oder weil ich es inspiziert habe. Und die Logik der möglichen Werte, die es zurückgibt, erfüllt meine Voraussetzungen. Ist es "besser" oder "angemessener", die Validierung zu überspringen, oder sollte ich mich immer noch gegen falsche Werte verteidigen, bevor ich mit der Methode fortfahre, die ich gerade implementiere, auch wenn sie immer erfolgreich sein sollte?
Mein Fazit aus allen Antworten (zögern Sie nicht, zu Ihren eigenen zu kommen):
Bestätigen Sie, wann- Die Methode hat in der Vergangenheit gezeigt, dass sie sich schlecht verhält
- Die Methode stammt aus einer nicht vertrauenswürdigen Quelle
- Die Methode wird von anderen Stellen aus verwendet und gibt die Nachbedingungen nicht explizit an
- Die Methode lebt eng mit Ihrer (siehe gewählte Antwort für Details)
- Die Methode definiert explizit ihren Vertrag mit so etwas wie einem ordnungsgemäßen Dokument, Typensicherheit, einem Komponententest oder einer Überprüfung nach dem Zustand
- Die Leistung ist kritisch (in diesem Fall kann ein Debug-Modus als hybrider Ansatz fungieren).
Null
)? Es ist wahrscheinlich genauso problematisch, wenn der Name ""
(nicht null, sondern die leere Zeichenfolge) oder ist "N/A"
. Entweder können Sie dem Ergebnis vertrauen, oder Sie müssen angemessen paranoid sein.