Mi chiedo se dovrei difendermi dal valore di ritorno di una chiamata di metodo confermando che soddisfano le mie aspettative anche se so che il metodo che sto chiamando soddisferà tali aspettative.
DATO
User getUser(Int id)
{
User temp = new User(id);
temp.setName("John");
return temp;
}
DOVREI
void myMethod()
{
User user = getUser(1234);
System.out.println(user.getName());
}
O
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());
}
Lo sto chiedendo a livello concettuale. Se conosco il funzionamento interno del metodo che sto chiamando. O perché l'ho scritto o l'ho ispezionato. E la logica dei possibili valori che restituisce soddisfa i miei presupposti. È "migliore" o "più appropriato" saltare la convalida o dovrei ancora difendermi da valori errati prima di procedere con il metodo che sto attualmente implementando, anche se dovrebbe sempre passare.
La mia conclusione da tutte le risposte (sentiti libero di venire da solo):
Asserire quando- Il metodo ha dimostrato di avere un comportamento anomalo in passato
- Il metodo proviene da una fonte non attendibile
- Il metodo viene utilizzato da altri luoghi e non indica esplicitamente le sue post-condizioni
- Il metodo è strettamente legato al tuo (vedi la risposta scelta per i dettagli)
- Il metodo definisce esplicitamente il contratto con qualcosa di simile a un documento appropriato, una sicurezza del tipo, un test unitario o un controllo post-condition
- Le prestazioni sono fondamentali (nel qual caso, un'asserzione della modalità di debug potrebbe funzionare come un approccio ibrido)
Null
)? Probabilmente è ugualmente problematico se il nome è ""
(non null ma la stringa vuota) o "N/A"
. O puoi fidarti del risultato o devi essere adeguatamente paranoico.