Non c'è assolutamente alcun motivo per tornare true
al successo se non si ritorna false
al fallimento. Come dovrebbe essere il codice client?
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 true
valore restituito è completamente irrilevante per il chiamante. Quindi mantieni il metodo void
.
In generale, ci sono tre modi per progettare le modalità failre.
- Restituisce vero / falso
- Usa
void
, lancia (selezionata) eccezione
- restituisce un oggetto risultato intermedio .
Ritorno true
/false
Viene utilizzato in alcune API più vecchie, per lo più in stile c. I lati negativi sono ovvi, non hai idea di cosa sia andato storto. PHP lo fa abbastanza spesso, portando a un codice come questo:
if (xyz_parse($data) === FALSE)
$error = xyz_last_error();
In contesti multi-thread, questo è ancora peggio.
Genera (controllato) eccezioni
Questo è un bel modo di farlo. In alcuni punti, puoi aspettarti un fallimento. Java lo fa con i socket. Il presupposto di base è che una chiamata dovrebbe avere successo, ma tutti sanno che alcune operazioni potrebbero non riuscire. Le connessioni socket sono tra queste. Quindi il chiamante viene costretto 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.
Restituisce l'oggetto risultato
Questo è un altro bel modo di gestirlo. Viene spesso utilizzato per l'analisi o semplicemente cose che devono essere convalidate.
ValidationResult result = parser.validate(data);
if (result.isValid())
// business logic
else
error = result.getvalidationError();
Logica piacevole e 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 tenendo presente la possibilità di eccezioni e che quasi sempre useranno le terze opzioni. Va bene. Ma abbiamo verificato le eccezioni in Java, quindi non vedo alcun motivo per non usarle. Uso le espulsioni controllate quando il presupposto di base è che la chiamata dovrebbe avere successo (come l'utilizzo di un socket), ma l'errore è possibile e utilizzo la terza opzione quando è molto chiaro se la chiamata dovrebbe continuare (come la convalida dei dati). Ma ci sono opinioni diverse su questo.
Nel tuo caso, andrei con void
+ Exception
. Ti aspetti che il caricamento del file abbia successo e, in caso contrario, è eccezionale. Ma il chiamante è costretto a gestire quella modalità di errore e puoi restituire un'eccezione che descrive correttamente il tipo di errore.