2010-01-28 7 views
14

Esistono regole rigide per quanto riguarda la restituzione di boolean in una firma del metodo per indicare un'operazione corretta anziché dichiarare void? Trovo che per operazioni più critiche nel mio metodo di chiamata voglio sapere se un'operazione è stata completata in modo da poter registrare eventuali problemi. È un uso "inappropriato" di booleano?Restituisce booleano invece di dichiarare un tipo di vuoto in Java?

risposta

22

Di solito io uso Exception s per segnalare quando qualcosa è andato storto.

Invece di restituire false, è possibile throw un Exception con un messaggio dettagliato su qual era il problema.

Il reso false non fornisce molte informazioni sul problema.

Quindi, invece di cercare un valore di ritorno false, basta mettere la chiamata al metodo in try/catch se si prevede che il metodo possa facilmente fallire.

Molte persone si lamenteranno che questo metodo è più lento. Ma i vantaggi che guadagni superano di gran lunga il rallentamento. Inoltre, se stai usando la velocità di Java non dovrebbe essere la tua preoccupazione numero uno.

+1

E le eccezioni dovrebbero essere, beh, eccezionali. Quindi la differenza di velocità dovrebbe essere materiale. –

+0

+1 per "le eccezioni dovrebbero essere, beh, eccezionali" –

1

Questo è un paradigma ok, ma se si vuole forzare il chiamante a gestire il caso in cui l'operazione non viene completata correttamente, si potrebbe voler lanciare un'eccezione controllata.

Questo schema si verifica tuttavia nelle librerie Java principali. Vedere File.delete() come esempio.

+0

-1: questo non è un paradigma "OK"; è una ricetta orribile per il disastro causato dal "blundering on" dopo un errore. –

+1

Penso che tu abbia un sacco di voti negativi prima di te. – danben

+1

+1 per la retorica, però. – danben

1

Per riportare il successo in generale ciò che si vede è:

  • Ritorna un valore booleano
  • ritorno vuoto, ma un'eccezione tiro in caso di errore
  • restituire un codice di stato (meno comune in java).

Impossibile vedere qualcosa di sbagliato nel restituire un valore booleano per il successo, a meno che non si abbia bisogno di informazioni sul comportamento delle eccezioni.

+0

Il (potenziale) problema con il ritorno booleano per il successo è la facilità con cui si può ignorare il booleano per il fallimento. Anche un'eccezione di runtime è molto più forte e meno probabile che venga trascurata durante la codifica e il test. – ILMTitan

6

Generalmente trovo che lanciare un'eccezione in caso di errore è una soluzione molto migliore rispetto al ritorno di un booleano, perché generalmente non mi interessa se il processo è riuscito - mi interessa solo se è fallito. Usando un'eccezione posso fornire qualsiasi quantità di informazioni sul perché il processo abbia effettivamente fallito.

Se eccezioni sembrano di cattivo gusto, è possibile restituire un oggetto di stato personalizzato che contiene un valore booleano e un messaggio di stato (qualcosa come "aggiunti 6 nuovi Foobars!" O "Impossibile aggiungere Foobars perché il Foobin è pieno!"), Anche se questo è ovviamente più complesso.

0

Sembra ok, ma il diavolo si trova nei dettagli. ;-)

un'eccezione è il principale alternativa, con pregi e difetti.

penso che si potrebbe ottenere un quadro più chiaro, fornendo campioni di codifica precise ...

4

farlo solo in scenari in cui è chiaro che qualcosa ha un esito booleano. Come IsValidCustomer() o alcuni di questi.

Per tutte le altre cose in cui si pensa si potrebbe introdurre, probabilmente significa hai a che fare con una sorta di Exception, e davvero non si vuole avvolgere che con un semplice booleano true/false, perché si può avere una varietà di sapori (diverse eccezioni) e le ragioni per cui qualcosa va storto, che vorresti sapere.

Quindi, lasciate che l'eccezione esploda nello stack, oppure prendetela e trasformatela in un'eccezione personalizzata o registrarla o altro.

1

Se c'è un risultato imprevisto, lanciare un'eccezione. Se vuoi solo che la funzione ti dica "ho fatto X" allora restituisco un valore booleano.

1

In pratica, trovo che lanciare un'eccezione è la cosa migliore da fare quando il fallimento significa che è necessario interrompere il processo. Ad esempio, se stai tentando di elaborare un ordine - fatturare il cliente, organizzare la spedizione, pagare le imposte sulle vendite, ecc. - se non riesci a trovare il record dell'ordine, probabilmente non ha molto senso fare tutto il resto. Vuoi solo uscire da lì. Le eccezioni ti permettono di farlo facilmente. Basta prendere nella parte inferiore del blocco, visualizzare o registrare l'errore e uscire.

D'altra parte, se un "errore" significa che il mio programma prende un percorso di flusso diverso, restituire un valore booleano ha più senso. Ad esempio, se sto cercando un cliente specifico e se esiste aggiorno il suo record e se non lo crea creo un nuovo record cliente, allora ha molto senso restituire un booleano, e nel test del chiamante e quando il vero segue un percorso e quando falso l'altro.

In realtà si tratta di due significati molto diversi della parola "errore" e richiedono una gestione diversa. È possibile che la stessa funzione possa fare entrambe le cose. Ad esempio, in caso di mancato ritorno true, su non trovato restituito false, l'errore I/O che tenta di leggere genera un'eccezione.

2

Utilizzare valori booleani per indicare risultati di errore non eccezionali. Un esempio potrebbe essere una funzione di ricerca. L'errore nominale sarebbe non trovato. Comunicare tale risultato con le eccezioni è ingombrante. Salva le eccezioni per casi eccezionali; la differenza tra non trovata e non è possibile cercare.

Problemi correlati