Est-ce une odeur de code d'appeler une méthode publique dans une méthode privée de la même instance d'objet?
Est-ce une odeur de code d'appeler une méthode publique dans une méthode privée de la même instance d'objet?
Réponses:
Pas une mauvaise odeur. Cela pourrait être nécessaire, pourquoi pensez-vous que c'est faux? Une méthode au niveau atomique est une entité indépendante qui effectue une tâche. Tant qu'il exécute une tâche, toute personne qui y a accès peut l'appeler pour effectuer la tâche.
Odeur de code? Oui, pas vraiment mauvais, mais un bon indicateur que la classe peut avoir trop de responsabilités.
Prenez-le comme un signe que la classe peut avoir besoin d'être divisée en différents objets, les méthodes privées ne devraient pas vraiment avoir besoin d'appeler des méthodes publiques du même objet, certainement dans une conception OO propre.
Bien sûr, une fois que vous avez inspecté la classe et que les raisons de l'appel de méthode sont claires, cela peut être une utilisation parfaitement raisonnable, en général, vous vous attendez à ce que les méthodes utilitaires pour la classe soient privées, mais si l'une est suffisamment utile pour être publique et utilisée par d'autres méthodes, je m'attendrais généralement à ce que ces méthodes soient publiques également.
Comme pour toutes les odeurs de code, c'est une motivation pour une inspection plus approfondie du code, une rationalisation et peut-être une refonte, mais pas une cause d'alarme.
Cela peut entraîner des surprises désagréables si quelqu'un qui n'a pas lu le code source de cette classe essaie de le sous-classer et remplace la méthode publique. La question de savoir si cela est réel dépend évidemment de votre situation. Vous devriez peut-être envisager de rendre la méthode publique ou même la finale de la classe.
Non. Que faut-il faire d'autre dans ce cas? Rendre la méthode privée publique ou la méthode publique privée? Copiez-collez le code de la méthode publique vers la méthode privée?
NON , pas de mauvaise odeur ici.
si nous implémentons l'interface d'une file d'attente avec List, est-ce une mauvaise odeur d'appeler simplement les fonctions List appropriées afin de réaliser facilement l'implémentation de la file d'attente?
si vous avez quelque chose et que vous voulez le convertir en quelque chose d'autre (comme un wrapper), ce n'est pas une mauvaise odeur, sa réutilisation du code avec le modèle de conception a agi au niveau de la fonction (une fonction est-elle un objet?)
Je sais que c'est un ancien poste, mais c'est quelque chose dont j'ai débattu au travail. Je «considère» cela comme une odeur de code, et je ne comprends pas pourquoi vous voudriez faire cela. Si une méthode privée doit appeler une méthode publique, le contenu de la méthode publique doit être pris et placé dans une méthode privée, que les deux méthodes peuvent ensuite appeler. Pourquoi?
La méthode publique peut contenir des tests qui ne sont pas nécessaires une fois votre code exécuté en interne. Il peut recevoir un UserObj et vouloir tester les autorisations des utilisateurs par exemple.
Après un appel public, vous devrez peut-être verrouiller l'objet, si vous utilisez le threading, donc en interne, vous ne voudrez pas rappeler à une méthode publique.
Plus susceptibles d'introduire des erreurs circulaires et des boucles infinies et des exceptions hors mem à mon avis.
Simple et simplement, mauvais design et "paresseux". Les méthodes publiques permettent d'accéder au monde extérieur. Il n'y a aucune raison de retourner à l'extérieur lorsque vous êtes déjà à l'intérieur.
Imaginez le contraire. Vous êtes dans une méthode privée et vous avez besoin de fonctionnalités dans une méthode publique Et si vous ne pouviez pas appeler cette méthode publique à partir de la méthode privée. Qu'est-ce que tu ferais?
La réponse est clairement que lorsque vous voulez la fonctionnalité dans une méthode publique, vous devriez pouvoir appeler cette méthode à partir des méthodes de cette classe ou d'autres classes.
Dans mon code, je crée souvent des getters de chargement paresseux, c'est-à-dire que l'objet est initialisé la première fois qu'il est demandé et réutilise ensuite le même objet instancié. Cependant, un objet instancié à l'aide d'une charge différée implique qu'il ne peut pas nécessairement être instancié à un moment donné. Plutôt que d'enrouler ma tête autour de la séquence d'appels de telle sorte que je sache que cet objet est déjà instancié ou répète le même code d'un chargement paresseux dans une autre méthode, j'appelle simplement le chargeur paresseux chaque fois que j'ai besoin de cet objet.
Tout comme vous pouvez utiliser les méthodes publiques de manière intelligente, vous pouvez également les utiliser de manière incorrecte. Un exemple de ceci pourrait être une méthode publique qui traite ses paramètres avant d'appeler une autre méthode privée. Ce serait une erreur d'appeler cette méthode publique nonchalamment simplement parce que vous avez les mêmes paramètres. L'erreur est subtile mais c'est une erreur de conception plus que toute autre chose et nécessite que vous appreniez à gérer avec les paramètres de la méthode interne plutôt qu'avec les paramètres de la méthode publique.
Donc, pour répondre à votre question, ce n'est certainement pas un mauvais code si vous l'utilisez correctement.
La question que vous devez vous poser est pourquoi votre classe a-t-elle le même besoin que les clients de votre classe? Habituellement, une classe a des besoins très différents de ses clients. Alors oui, c'est une indication que vous avez soit
(a) exposé publiquement quelque chose qui devrait être privé; ou
(b) le comportement de la classe n'est pas assez étroit (pensez au principe de responsabilité unique).