Meilleur moyen de rendement de l'indicateur d'état et le message à partir d'une méthode en Java
J'ai un trompeusement simple scénario, et je veux une solution simple, mais il n'est pas évident de ce qui est "correct" ou "la plupart de Java".
Disons que j'ai un petit authentifier(Client Client) méthode dans la classe. L'authentification peut échouer pour plusieurs raisons, et je souhaite retourner un simple booléen pour le contrôle de flux, mais aussi de retourner une Chaîne de message pour l'utilisateur. Ces sont les possibilités que je peux penser de:
- Retourner un booléen, et passer dans un StringBuilder pour recueillir le message. C'est la plus proche d'un style C moyen de le faire.
- Lancer une exception au lieu de renvoyer false, et comprennent le message. Je n'aime pas cela, car l'échec n'est pas exceptionnel.
- Créer une nouvelle classe appelée AuthenticationStatus avec l'opérateur booléen et la Chaîne. Cela semble exagéré pour une petite méthode.
- Stocker le message dans une variable membre. Ce serait introduire un potentiel condition de course, et je n'aime pas ce qu'elle implique un état qui n'est pas vraiment là.
Toutes les autres suggestions?
Modifier Manqué cette option est désactivée
- Retourner la valeur null pour le succès - Est-ce dangereux?
Modifier Solution:
Je suis allé pour la plupart OO solution et a créé un petit AuthenticationResult classe. Je ne voudrais pas le faire dans une autre langue, mais je l'aime en Java. J'ai aussi aimé la suggestion
de retour d'un String[] puisque c'est comme le retour null mais plus sûr. L'un des avantages du Résultat de la classe, c'est que vous pouvez avoir un message de succès avec plus de détails si nécessaire.
- Pouvez-vous expliquer pourquoi est-il plus OO que de retourner sentinelle de la valeur ? Je vais dans la même situation et l'utilisation de votre solution. Mais je ne sais pas pourquoi cette solution est meilleure que les autres.
- Je pense que d'autres réponses et les commentaires expliquent cela très bien, mais en un mot, une sentinelle de la valeur est dangereux parce qu'il est l'abus d'une faille dans le système de type (une valeur que vous pouvez retourner pour que le type que vous n'avez pas à attendre dans toute autre circonstance). Il est particulièrement dangereux en utilisant null car manque null contrôles sont simples et communs, et qui pourrait conduire à des bugs. C'est plus OO parce qu'il utilise une classe qui définit un type qui signifie "à la Suite d'authentification" ou "Statut avec, en option, les messages" donc il n'y a pas de type d'abus au détriment d'un plus lourd type.
Vous devez vous connecter pour publier un commentaire.
Retour d'un petit objet à la fois avec le drapeau booléen et la Chaîne à l'intérieur est probablement le plus OO-comme manière de faire, même si je suis d'accord qu'il semble excessif pour un cas simple comme ça.
Une autre alternative est de toujours renvoyer une Chaîne de caractères, et ont la valeur null (ou une Chaîne vide - vous de choisir lesquelles) témoignent de la réussite. Aussi longtemps que les valeurs de retour sont clairement expliquées dans la documentation javadoc il ne devrait pas y avoir de confusion.
Vous pouvez utiliser les exceptions....
et puis, si une erreur se produit dans votre AuthenticateMethod vous envoyer un nouveau AuthenticateError (extends Exception)
Éviter le retour d'une "sentinelle de la valeur", en particulier la valeur null. Vous allez vous retrouver avec une base de code où les méthodes ne peuvent pas être compris par l'appelant sans la lecture de la mise en œuvre. Dans le cas de nul, les appelants peuvent se retrouver avec NullPointerExceptions si ils oublient (ou ne sais pas) que votre méthode peut retourner null.
Le tuple suggestion de Bas Leijdekkers est un bon celui que j'utilise tout le temps si je veux retourner plus d'une valeur à partir d'une méthode. Celui que nous utilisons est
P2<A, B>
de la Fonctionnel Java de la bibliothèque. Ce genre de type est une commune de l'union de deux autres types (il contient une valeur de chaque type).De lever des Exceptions pour le contrôle de flux est un peu une odeur de code, mais vérifié les exceptions sont une façon d'avoir plus d'un type de valeur à partir d'une méthode. D'autres, plus propres possibilités existent cependant.
Vous pouvez avoir un
<T>
classe abstraite avec deux sous-classesSome<T>
etNone<T>
. C'est un peu comme une alternative sûre à la valeur null, et une bonne façon de mettre en œuvre partielle des fonctions (fonctions dont la valeur de retour n'est pas définie pour certaines d'arguments). Le Fonctionnel Java la bibliothèque dispose d'un completOption
classe qui implémenteIterable<T>
, de sorte que vous pouvez faire quelque chose comme ceci:Alternativement, vous pouvez utiliser une union disjointe de deux types, comme un
Soit<L, R>
classe. Il contient une valeur qui est soit de typeL
ouR
. Cette classe implémenteIterable<T>
pour les deuxL
etR
, de sorte que vous pouvez faire quelque chose comme ceci:Toutes ces classes,
P2
,Option
, etEither
sont utiles dans une variété de situations.Quelques options:
simple tuple exemple, la mise en œuvre effective peut avoir besoin de plus:
Vous pouviez retourner une Collection de messages d'erreur, vide, indiquant qu'il n'y avait pas de problèmes. C'est une amélioration de votre troisième proposition.
Personnellement, je pense que la création d'une nouvelle classe appelée AuthenticationStatus avec l'opérateur booléen et la Chaîne est la plus Java comme moyen. Et bien qu'il semble exagéré (ce qui peut bien l'être), il semble plus propre à moi et plus facile à comprendre.
Juste parce que l'échec de l'authentification est un lieu commun ne signifie pas qu'il n'est pas exceptionnel.
À mon avis, les échecs d'authentification sont les affiche-enfant cas d'utilisation pour les exceptions. (Eh bien... peut-être que le fichier de la non-existence est la forme canonique de cas d'utilisation, mais l'échec de l'authentification est un proche n ° 2.)
- Je utiliser la "petite classe" moi-même, généralement avec un intérieur de classe. Je n'aime pas utiliser des arguments pour recueillir les messages.
Aussi, si la méthode peut échouer est de "bas niveau" comme provenant d'un serveur d'application ou de la couche de base de données, je préfère retourner un Enum avec le retour d'état, puis à les transformer en une chaîne de caractères au niveau de l'interface graphique. Ne passez pas autour de l'utilisateur cordes au niveau bas si vous allez jamais à s'internationaliser votre code, car alors votre serveur d'application ne peut répondre dans une langue à la fois, plutôt que d'avoir différents clients qui travaillent dans des langues différentes.
Est-ce la seule méthode où vous avez une telle exigence? Si non, il suffit de générer une Réponse générale de la classe avec un isSuccessful drapeau et une chaîne de message, et de l'utiliser partout.
Ou peut-être vous avez la méthode renvoie null pour montrer succès (pas assez, et ne permettent pas le retour d'un succès ET d'un message).
Je serais probablement aller pour quelque chose comme :
Avec ce "design", vous pouvez demander un message uniquement lorsque l'authentification échoue (ce qui, je l'espère, est le scénario qui se produit 99,99% du temps ;))
Il peut également être de bonne pratique de déléguer message résolution à une autre Classe. Mais cela dépend des besoins de votre application (pour la plupart, faut-il le i18n ?)
Cela semble être un idiome commun dans d'autres langages de programmation, mais je ne peux pas comprendre que l'on ( C, je suppose que j'ai lu dans la question ) .
Presque la même question est posté ici et ici
De tenter de renvoyer deux valeurs à partir d'une seule fonction, peut être trompeur. Mais comme il a été prouvé par les tentatives de le faire, il peut être très utile aussi.
Certainement la création et la petite classe avec les résultats doivent être à la bonne manière de procéder, si cela est une commune du flux dans l'application qu'auparavant.
Voici une citation sur le retour de deux valeurs d'une fonction:
Je l'ai trouvé dans une demande de fonctionnalité pour java pour permettre plusieurs valeurs de retour
consulter la rubrique "évaluation" de la section en date du: 2005-05-06 09:40:08
La réussite de l'authentification devrait être le cas "normal", donc un échec d'authentification est le cas exceptionnel.
Quelles sont les différentes chaînes d'état pour l'utilisateur de toute façon. Je peux voir seulement deux, le succès ou l'échec. Toute autre information est un problème de sécurité potentiel.
Un autre avantage de la solution avec des exceptions, c'est qu'il ne peut pas être appelé dans le mauvais sens et les cas d'échec est plus évident. Sans exceptions, vous écrivez:
Vous pouvez accidentellement appeler la méthode en ignorant la valeur de retour. Le comportement normal " le code est exécuté sans authentification réussie:
Si vous utilisez des exceptions, qui ne peut pas se produire. Si vous décidez de ne pas utiliser les exceptions, au moins le nom de la méthode, de sorte qu'il est clair qu'il renvoie d'un état, d'e. g.:
Il y a beaucoup de bonnes réponses ici, donc je vais garder ce court.
Je pense que l'échec d'un utilisateur à s'authentifier peut être considéré comme un cas valide pour une checked exception. Si votre style de programmation favorisé la gestion des exceptions alors il n'y aurait aucune raison de ne pas le faire. Il supprime également le "Comment retourner plusieurs valeurs à partir d'une méthode, ma méthode ne fait qu'une chose qu'Il authentifie un utilisateur"
Si vous allez retourner plusieurs valeurs puis de passer 10 minutes à la création d'un générique PairTuple (peut également être plus qu'une paire TripleTuple, je ne vais pas reprendre l'exemple ci-dessus) et le retour de vos valeurs de cette façon.
Je déteste avoir des petits dto style objets pour revenir différentes valeurs multiples ils ont juste l'encombrement de la place.
La façon de retourner une chaîne de caractères. Vide ou Null pour le succès. Message d'erreur en cas d'échec.
La plus simple qui fonctionne. Cependant vous ne savez pas si il lit bien.
Retourner l'Objet. Il vous permet de mettre des fonctionnalités supplémentaires dans la Classe, si vous en avez besoin. De courte durée, des objets en Java sont rapides à créer et à recueillir.
Je choisirais l'Exception de l'option à la première place.
Mais, en second lieu, je préfère le C-style technique:
Ce n'est pas si étrange et c'est fait dans de nombreux endroits dans le cadre.
Au lieu de créer un objet spécial pour le type de retour, j'ai l'habitude de simplement retourner un tableau où toutes les informations renvoyées sont stockées. L'avantage est que vous pouvez étendre ce tableau avec de nouveaux éléments sans créer de nouveaux types et le désordre. Le revers de la médaille, vous devez savoir exactement ce que les éléments présents lorsque le tableau est retourné à partir de méthode particulière pour l'analyser correctement. D'habitude je suis d'accord sur certains de la structure, comme le premier élément est toujours Boolean indication de succès, la seconde est la Chaîne avec la description, le reste est facultatif.
Exemple: