2010-01-28 5 views
14

Existe-t-il des règles strictes concernant le retour de booléen dans une signature de méthode pour indiquer une opération réussie plutôt que de déclarer une annulation? Je trouve que pour les opérations plus critiques dans ma méthode d'appel, je veux savoir si une opération terminée afin que je puisse enregistrer des problèmes. Est-ce une utilisation "inappropriée" de booléen?Renvoyer un booléen au lieu de déclarer un type void en Java?

Répondre

22

Généralement, j'utilise Exception s pour signaler un problème.

Au lieu de renvoyer false, vous pouvez throw et Exception avec un message détaillé sur le problème. Retourne false ne donne pas beaucoup d'informations sur le problème. Puis, au lieu de vérifier une valeur de retour false, il suffit de placer l'appel de méthode dans try/catch si vous pensez que la méthode pourrait facilement échouer.

Beaucoup de gens vont se plaindre que cette méthode est plus lente. Mais, les avantages que vous gagnez l'emportent largement sur le ralentissement. En outre, si vous utilisez la vitesse Java ne devrait pas être votre préoccupation n ° 1.

+1

Et les exceptions devraient être, bien, exceptionnelles. Donc la différence de vitesse devrait être matérielle. –

+0

+1 pour "les exceptions doivent être, eh bien, exceptionnelles" –

1

Ceci est un paradigme correct, mais si vous voulez forcer l'appelant à gérer le cas où l'opération ne se termine pas correctement, vous pouvez lancer une exception checked à la place.

Ce modèle se produit dans les bibliothèques Java de base, cependant. Voir File.delete() comme exemple.

+0

-1: Ce n'est pas un paradigme "OK"; C'est une recette horrible pour un désastre causé par "gaffer" après une erreur. –

+1

Je pense que vous avez beaucoup de votes négatifs devant vous. – danben

+1

+1 pour la rhétorique, cependant. – danben

1

Pour retourner le succès en général ce que vous voyez est:

  • Retour un booléen
  • Retour vide, mais exception throw en cas d'erreur
  • Retour un code d'état (moins commun en java).

Vous ne voyez rien de mal à retourner un booléen pour le succès, sauf si vous avez besoin d'informations sur le comportement des exceptions.

+0

Le problème (potentiel) avec le retour booléen pour le succès est la facilité avec laquelle on peut ignorer le booléen pour l'échec. Même une exception d'exécution est beaucoup plus forte et moins susceptible d'être ignorée pendant le codage et les tests. – ILMTitan

6

Je trouve généralement que lancer une exception en cas d'échec est une bien meilleure solution que de renvoyer un booléen, parce que cela ne sert généralement pas à savoir si le processus a réussi - je m'inquiète seulement s'il a échoué. En utilisant une exception, je peux fournir toute quantité d'informations sur les raisons pour lesquelles le processus a réellement échoué. Si les exceptions semblent désagréables, vous pouvez renvoyer un objet Status personnalisé contenant un booléen et un message d'état (comme "Ajout de 6 nouveaux objets" ou "Impossible d'ajouter des Foobars car le Foobin est plein!"). c'est bien sûr plus complexe.

0

Cela semble correct, mais le diable se cache dans les détails. ;-)

Lancer une exception est l'alternative principale, avec avantages et inconvénients.

Je pense que vous pourriez obtenir un aperçu plus précis en fournissant des échantillons de codage ...

4

font seulement cela dans des scénarios où il est clair que quelque chose a un résultat booléen. Comme IsValidCustomer() ou une telle.

Pour toutes les autres choses où vous pensez vous pouvez le présenter, cela signifie probablement que vous avez affaire à une sorte de Exception, et vous ne voulez vraiment pas envelopper cela avec une true/false booléenne simple, parce que vous pouvez avoir une variété de saveurs (différentes exceptions) et les raisons pour lesquelles quelque chose ne va pas, ce que vous voulez savoir. Laissez donc l'exception monter en bulle dans la pile ou l'attraper et la transformer en une exception personnalisée ou la consigner ou quoi que ce soit.

1

En cas de résultat inattendu, lancez une exception. Si vous voulez juste que la fonction vous dise "Ai-je fait X" alors retourne un booléen.

1

En pratique, je trouve que lancer une exception est la meilleure chose à faire lorsque l'échec signifie que nous devons abandonner le processus. Par exemple, si vous essayez de traiter une commande - facturer le client, organiser l'expédition, payer les taxes de vente, etc - si vous ne pouvez pas trouver le dossier de commande, il n'y a probablement aucun intérêt à faire tous les autres travaux. Tu veux juste sortir de là. Les exceptions vous permettent de le faire facilement. Attrapez simplement au bas du bloc, affichez ou notez l'erreur et sortez. D'autre part, si une "erreur" signifie que mon programme emprunte un chemin de flux différent, retourner un booléen est plus logique. Par exemple, si je cherche un client spécifique et s'il existe, je mets à jour son enregistrement et s'il ne le fait pas, je crée un nouvel enregistrement client, alors cela a beaucoup de sens de renvoyer un booléen, et dans le test de l'appelant et quand il est vrai, suivez un chemin et, quand l'un est faux, l'autre.

Vraiment ce sont deux significations très différentes du mot "erreur", et ils appellent une manipulation différente. Il est tout à fait possible que la même fonction puisse faire les deux. Comme, sur le retour trouvé vrai, sur non trouvé retour faux, sur l'erreur d'E/S essayant de lire jeter une exception.

2

Utilisez des valeurs booléennes pour indiquer des résultats d'échec non exceptionnels. Un exemple serait une fonction de recherche. La défaillance nominale serait non trouvé. Communiquer ce résultat avec des exceptions est lourd. Sauvegarder les exceptions pour les cas exceptionnels; la différence entre non trouvé et ne peut pas rechercher.

Questions connexes