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
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.
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.
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.
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
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.
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 ...
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.
Se c'è un risultato imprevisto, lanciare un'eccezione. Se vuoi solo che la funzione ti dica "ho fatto X" allora restituisco un valore booleano.
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.
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.
- 1. 'Condizione specificata "$ (PackageAsSingleFile)" restituisce "" invece di un valore booleano?
- 2. Dichiarare un sinonimo di tipo in C#
- 3. Restituisce un tipo di classe nidificata in Java
- 4. Dichiarare un array bidimensionale vuoto in Javascript?
- 5. Usa vuoto invece IBAction come tipo di ritorno del metodo
- 6. Restituisce un IEnumerator vuoto
- 7. Dichiarare array vuoto in javascript
- 8. Android - Perché onItemLongClick (...) restituisce un valore booleano?
- 9. Dichiarare un prototipo di tipo "struct" - C
- 10. Controlla il tipo di enum di ruggine con un booleano?
- 11. Perché IJavaProject.findPackageFragmentRoots restituisce un array vuoto?
- 12. : quale denominazione di un metodo che restituisce un valore booleano?
- 13. Dichiarare tipo variabile basato su un tipo di colonna
- 14. Dichiarare un tipo di dati in modo dinamico in C++
- 15. restituisce un vettore vuoto C++
- 16. unità di prova di un metodo che restituisce un vuoto
- 17. PHP tipo di ritorno suggerimento, oggetto O un booleano?
- 18. Java booleano | = operatore
- 19. Come restituire un metodo booleano in java?
- 20. Postgres restituisce [null] invece di [] per array_agg della tabella join
- 21. Dichiarare esplicitamente un tipo di variabile in Python
- 22. Perché dichiarare il tipo di variabile PHP in un commento?
- 23. Converti puntatore vuoto ** a tipo Java equivalente
- 24. element.firstChild restituisce '<TextNode ...' invece di un oggetto in FF
- 25. Come restituire stringhe diverse da un tipo booleano in MySQL?
- 26. C'è un suggerimento di tipo PHPDoc per un parametro booleano?
- 27. Il casting di un valore booleano in un intero restituisce -1 per vero?
- 28. logback su un mac restituisce punti interrogativi invece di parole
- 29. Come posso dichiarare un parametro booleano nell'istruzione SQL?
- 30. Doctrine manyToMany restituisce PersistentCollection invece di ArrayCollection
E le eccezioni dovrebbero essere, beh, eccezionali. Quindi la differenza di velocità dovrebbe essere materiale. –
+1 per "le eccezioni dovrebbero essere, beh, eccezionali" –