Ho studiato questo argomento un bel po 'e non sono sicuro di quale sia il modo migliore. Ho ancora molto da imparare (libri, blog, scambi di stack, ecc.), Ma semplicemente non riesco a trovare un consenso.
Fondamentalmente ecco la situazione: hai una funzione che dovrebbe restituire un risultato, ma la funzione fallisce (il parametro è cattivo, si verifica un'eccezione, la risorsa è bloccata / non raggiungibile, ecc.) se dovessi lanciare un'eccezione o restituire qualcosa ?
Semplicemente non vedo il modo migliore per farlo, ecco come appaiono le cose:
Le persone sembrano concordare sul fatto che restituire null e codificare per null (aspettarsi null e controllarlo) è una cattiva pratica e sono pienamente d'accordo. Ma dall'altra parte delle cose le persone non sembrano gradire "eccezioni vexing", ad esempio Int32.parseInt
lancia un'eccezione invece di restituire null, questa funzione ha una controparte che non lo fa (tryParse) che restituisce un valore booleano ma ha un parametro di output:
bool result = Int32.TryParse(value, out number);
if (result)
{
Console.WriteLine("Converted '{0}' to {1}.", value, number);
}
Personalmente trovo questo metodo un po 'irritante, ho studiato il threading con Linux e la maggior parte dei metodi erano methodA(in, in, out, in)
che è orribile. Con un IDE corretto questo problema è molto più piccolo, ma mi ha lasciato ancora un cattivo gusto in bocca.
E in alcuni linguaggi (come Java) questo non è esattamente facile da fare, dato che non ha% descrittore di% c_de (o come si chiama) e passa per valore.
Quindi si tratta di questo: come sarebbe meglio gestirlo? Aggiungi eccezioni a quando il tuo codice non può essere completato (se non è un numero, non posso analizzarlo, non posso restituire un numero) o dovresti risolvere il problema. In C, C ++ o C # probabilmente andrei sempre con l'approccio out
, ma in Java questo sembra un modo davvero doloroso per risolvere il problema, e non sono sicuro che sia disponibile in altre lingue o meno.