S'il y a une méthode
bool DoStuff() {
try {
// doing stuff...
return true;
}
catch (SomeSpecificException ex) {
return false;
}
}
devrait-il plutôt s'appeler IsStuffDone()
?
Les deux noms pourraient être mal interprétés par l'utilisateur: Si le nom est: DoStuff()
pourquoi renvoie-t-il un booléen? Si le nom est, IsStuffDone()
il n'est pas clair si la méthode exécute une tâche ou ne vérifie que son résultat.
Existe-t-il une convention pour ce cas? Ou une approche alternative, comme celle-ci est considérée comme imparfaite? Par exemple, dans les langages ayant des paramètres de sortie, tels que C #, une variable d'état booléen peut être transmise à la méthode sous la forme d'une variable et le type de résultat de la méthode doit être void
.
EDIT: Dans mon problème particulier, la gestion des exceptions ne peut pas être directement déléguée à l'appelant, car la méthode fait partie d'une implémentation d'interface. Par conséquent, l'appelant ne peut pas être chargé de traiter toutes les exceptions d'implémentations différentes. Il ne connaît pas ces exceptions. Cependant, l'appelant peut gérer une exception personnalisée, comme StuffHasNotBeenDoneForSomeReasonException
suggéré dans la réponse et le commentaire de npinti .
la source
boolean
au lieu d'envelopper ou de passer l'exception est presque toujours faux.BadlyDesignedMethodInSeriousNeedOfRefactoring
? Et pour répondre à votre question sur les exceptions - je pouvais laisser l'appelant les gérer ou les intercepter puis émettre une exception personnalisée qui signifie "cette méthode ne fait pas son travail". Partager et profiter.if (FirstMethodSucceeds(problem) or SecondMethodSucceeds(problem) or ...) Hurray(); else UniversalSolve(problem);
. Faire la même chose avec des exceptions (personnalisées?) Serait inutilement plus compliqué.Réponses:
Dans .NET, vous avez souvent des paires de méthodes dans lesquelles l'une d'elles peut générer une exception (
DoStuff
), l'autre renvoie un statut booléen et, en cas d'exécution réussie, le résultat réel via un paramètre out (TryDoStuff
).(Microsoft appelle cela le "modèle d'analyse par essai" , car l'exemple le plus frappant est celui des
TryParse
méthodes de divers types primitifs.)Si le
Try
préfixe n'est pas courant dans votre langue, vous ne devriez probablement pas l'utiliser.la source
if (TryDoStuff()) print("Did stuff"); else print("Could not do stuff");
est un langage assez standard et intuitif à mon avis.TryDoStuff
méthodes sont supposées échouer proprement et ne produire aucun effet secondaire lorsqu'elles renvoient false.Remove
méthodes, par exemple dans le framework .NET, qui suppriment un élément d'une structure de données (par exempleDictionary
) et renvoient unbool
. Le consommateur de l'API peut décider de le consommer ou de l'ignorer. Cependant, les erreurs sont signalées comme des exceptions.Et si vous jetiez simplement l'exception au code d'appel?
De cette façon, vous déléguez la gestion des exceptions à quiconque utilise votre code. Et si, dans le futur, vous voudriez faire ce qui suit:
FileNotFoundException
est lancé, passez à l'action BSi vous rejetez votre exception, la modification ci-dessus impliquerait simplement l'ajout d'un
catch
bloc supplémentaire . Si vous le laissez tel quel, vous devrez modifier la méthode et l'emplacement à partir duquel la méthode est appelée, qui, selon la complexité du projet, peut se trouver à plusieurs emplacements.la source
DoStuff
d'échouer, le lancement d'une exception pour le cas d'échec équivaudrait à contrôler le déroulement du programme avec des exceptions qui sont mauvaises. Les exceptions ont également un coût de performance inhérent. SiDoStuff
échouer est un cas rare dû à une erreur, alors les exceptions sont définitivement la voie à suivre, comme le suggère @npinti.DoStuff()
méthode d'OP est nettoyée après que le code interne a généré une exception et que les conditions postérieures de la méthode sont toujours correctes, un code de retour peut être une meilleure option car l'erreur a été gérée.DoStuff()
est suffisant, et la valeur de retour de la fonction doit être documentée, et vous n'avez pas besoin de le mentionner dans le nom de la fonction, recherchez plusieurs API disponibles:PHP
C-Sharp
la source
En Java, l' API Collection définit une méthode d'ajout qui renvoie un booléen. Il retourne essentiellement si add a changé la collection. Ainsi, pour un
List
élément, il retourne généralement la valeur true, car l'élément a été ajouté, alors que pour un,Set
il peut renvoyer la valeur false, si l'élément était déjà présent, carSet
s autorise chaque élément unique au plus une fois.Cela dit, si vous ajoutez un élément non autorisé par la collection, par exemple une valeur null, l’ajout jettera un
NullPointerException
plutôt que de renvoyer faux.Lorsque vous appliquez la même logique à votre cas, pourquoi devez-vous renvoyer un booléen? S'il s'agit de cacher une exception, ne le faites pas. Il suffit de lancer l'exception. De cette façon, vous pouvez voir ce qui a mal tourné. Si vous avez besoin d'un booléen, parce que cela n'a peut-être pas été fait, pour une raison autre qu'une exception, nommez la méthode
DoStuff()
, car cela représente le comportement. Ça fait des trucs.la source
Pourrait échouer pour différentes raisons, exception, conditions normales, utiliserait donc ceci:
L'important est de documenter ce que le booléen signifie.
la source
J'ai l'habitude de méthodes renvoyer un
OperationResult
(ouOperationResult<T>
) et définir laIsSuccess
propriété sur leOperationResult
approprié. Si la méthode 'habituelle' est videOperationResult
, renvoyer , si la méthode 'habituelle' renvoie un objet, renvoyerOperationResult<T>
et définir laItem
propriété deOperationResult
manière appropriée. Je suggère également d'avoir des méthodesOperationResult
telles que.Failed(string reason)
et.Succeeded(T item)
.OperationResult
devient rapidement un type familier dans vos systèmes et les développeurs doivent savoir comment le gérer.la source
Cela dépend vraiment de la langue que vous utilisez. Comme pour certaines langues, il existe des conventions et des protocoles qui n'existent pas vraiment dans beaucoup de langues.
Par exemple, dans le langage Objective-C et dans le SDK iOS / Mac OS X, les noms de méthode sont généralement les suivants:
Comme vous pouvez le constater, il existe une méthode appelée viewDidLoad. Je préfère utiliser ce type de nommage chaque fois que je crée mes propres applications. Cela pourrait être utilisé pour vérifier si quelque chose était supposé se passer comme vous l'avez dit. Je pense que vous réfléchissez trop à ce que vous nommez vos méthodes. La plupart des méthodes renvoient le statut de ce qu'elles font, peu importe, prenez l'exemple suivant:
En PHP, mysql_connect () retournera false si la connexion échoue. Il ne dit pas qu'il le fera, mais il le fait et la documentation l'indique, de sorte qu'il ne puisse pas être mal interprété par le programmeur.
la source
J'aimerais suggérer d'utiliser le préfixe "Essayer". Il s'agit d'un modèle bien connu pour les situations dans lesquelles la méthode peut réussir ou non. Ce modèle de dénomination a été utilisé par Microsoft dans .NET Framework (par exemple, TryParseInt).
Mais, peut-être que ce n'est pas à propos de nommer. Il s'agit de la façon dont vous concevez les paramètres d'entrée / sortie de votre méthode.
Mon idée est que si une méthode a une valeur de retour, l'appel de cette méthode devrait alors avoir pour but d'obtenir cette valeur de retour. Donc, vous devriez éviter d'utiliser le type de retour pour indiquer le statut d'une opération.
En C #, je préfère utiliser un paramètre out. En utilisant un out, je marque le paramètre comme paramètre latéral. Spécialement, ce C # 6 supportera la déclaration de variable inline.
la source
Je choisirais un nom basé sur le rôle principal de la méthode. Le fait que cette méthode retourne une valeur booléenne ne requiert pas le préfixe 'Is'. Ayons du code Java, qui utilise le préfixe 'Is' assez souvent. Regarde
java.io.File.delete()
. Ça revientboolean
, mais ça ne s'appelle pasisFileDeleted()
. La raison en est que le rôle principal du métod est de supprimer un fichier. Quelqu'un appelle cette méthode avec l'intention de supprimer un fichier.Le booléen est juste là pour communiquer le résultat du travail. Par contre voyons
java.util.Map.isEmpty()
. Évidemment, vous appelez une telle méthode pour savoir si la collection est vide. Vous ne voulez rien faire. Vous voulez juste savoir quel est l'état actuel.Donc, personnellement, je resterais définitivement avec
DoStuff()
.C'est un problème très important pour moi. Souvent, lorsque je maintiens un code hérité, je tombe sur une méthode que j'appelle personnellement "méthode du mensonge". Le nom suggère l'action A, mais le corps effectue l'action B. L'exemple le plus intéressant est une méthode de lecture qui modifie les données de la base de données.
la source