Questa domanda: Best way to return status flag and message from a method in Java è simile alla mia, tuttavia lo farei in PHP, non in Java (che potrebbe fare una leggera differenza qui).Stato di ritorno del metodo: bool, string, const ... (PHP)
Il problema:
C'è un metodo che può avere sia un esito positivo (puo 'cambiare per essere quelli di maggior successo) o di un "problematico" uno. Quest'ultimo significa che l'operazione è fallita, ma è anche importante sapere perché. Immaginate un metodo di una classe di autenticazione:
public function login($name, $password)
{
if (successful_authentication)
{
report success
}
else
{
report failure, explain why (e.g. wrong name/pass, user banned)
}
}
Sarebbe banale per tornare vero e falso per il successo e il fallimento, ma come segnalare la causa del fallimento?
Possibili soluzioni:
- restituire true o false e scrivere un altro metodo (getStatus()) per ottenere il problema specifico: questo si sente un po 'imbarazzante per me
- utilizzare le eccezioni: dato che non è eccezionale per un utente essere bannato (un'eccezione sarebbe se l'utente morirebbe mentre si digita come un altro autore su questo sito ha sottolineato) l'uso di eccezioni qui in questi casi sarebbe semplicemente sbagliato (tuttavia il metodo potrebbe lanciare un'eccezione del database se una query non riesce)
ritorno vero in caso di successo e una stringa in caso di fallimento con un codice di errore che indica il problema: con PHP è possibile in questo modo di avere belle blocchi pulite come segue:
$loginStatus = $auth->login('name', 'pass'); if ($loginStatus === true) { doSomething(); } else { if ($loginStatus == 'wrong_login_data') ... elseif ($loginStatus == 'banned') ... // or with an array full of error messages: echo $erroMessages[$loginStatus]; }
Ritorna uno stato generale (stato) oggetto: molto soluzione elegante e anche a prova di futuro (non è un problema se il numero di stati di varia o poi dati aggiuntivi deve essere restituito), forse il migliore:
$loginStatus = $auth->login('name', 'pass') if ($loginStatus->isSuccess) ... else echo $errorMessages[$loginStatus->errorCode]; // $errorMessages as by the previous example
uno di due precedenti, ma non con lo spago semplice ma costanti di classe:
$loginStatus = $auth->login('name', 'pass') if ($loginStatus->isSuccess) ... elseif ($loginStatus->errorCode == Auth::ERR_USER_BANNED) ...
Con questo non sarebbe necessario spiegare i codici di errore nella documentazione e si sentirebbe anche più "naturale" (almeno per me).
La domanda:
Cosa vorresti usare (di quelli di cui sopra o qualsiasi altra soluzione)? Che cosa è stato dimostrato a lungo termine per essere un buon modo?
Grazie in anticipo!
È un peccato che ho aspettato così tanto ad accettare la risposta :-). – Piedone