Non è assolutamente necessario restituire true
in caso di successo se non si restituisce false
in caso di errore. Come dovrebbe apparire il codice cliente?
if (result = tryMyAPICall()) {
// business logic
}
else {
// this will *never* happen anyways
}
In questo caso, il chiamante ha comunque bisogno di un blocco try-catch, ma poi può scrivere meglio:
try {
result = tryMyAPICall();
// business logic
// will only reach this line when no exception
// no reason to use an if-condition
} catch (SomeException se) { }
Quindi il valore restituito da true
è completamente irricevibile per il chiamante. Quindi mantieni il metodo void
.
In generale, ci sono tre modi per progettare le modalità di failre.
- Restituisce vero / falso
- Utilizza
void
, lancia (controllata) l'eccezione
- restituisce un oggetto risultato intermedio
Ritorno true
/ false
Questo è usato in alcune vecchie API, per lo più in stile C. Gli svantaggi sono ovvi, non hai idea di cosa sia andato storto. PHP lo fa abbastanza spesso, portando a codice come questo:
if (xyz_parse($data) === FALSE)
$error = xyz_last_error();
Nei contesti multi-thread, questo è anche peggio.
Esegui eccezioni (controllate)
Questo è un bel modo per farlo. In alcuni punti, puoi aspettarti un fallimento. Java lo fa con i socket. L'assunto di base è che una chiamata debba avere successo, ma tutti sanno che certe operazioni potrebbero fallire. Le connessioni socket sono tra queste. Quindi il chiamante viene forzato a gestire l'errore. è un bel design, perché si assicura che il chiamante gestisca effettivamente l'errore e fornisce al chiamante un modo elegante per gestire l'errore.
Restituisci oggetto risultato
Questo è un altro bel modo per gestirlo. È spesso usato per l'analisi o semplicemente per le cose che devono essere convalidate.
ValidationResult result = parser.validate(data);
if (result.isValid())
// business logic
else
error = result.getvalidationError();
Bella logica pulita anche per il chiamante.
C'è un po 'di dibattito su quando usare il secondo caso e quando usare il terzo. Alcune persone credono che le eccezioni dovrebbero essere eccezionali e che non si dovrebbe progettare con la possibilità di eccezioni in mente, e quasi sempre useranno le terze opzioni. Quel bene. Ma abbiamo controllato le eccezioni in Java, quindi non vedo alcun motivo non per usarle. Io uso le expetions controllate quando il presupposto di base è che la chiamata dovrebbe suceed (come usare un socket), ma è possibile un errore, e io uso la terza opzione quando è molto poco chiara se la chiamata deve superare (come dati di convalida). Ma ci sono opinioni diverse su questo.
Nel tuo caso, vorrei andare con void
+ Exception
. Ti aspetti che il caricamento del file superi, e quando lo fa, è eccezionale. Ma il chiamante è costretto a gestire tale modalità di errore, e puoi restituire un'eccezione che descriva correttamente quale tipo di errore si è verificato.