web-dev-qa-db-fra.com

quand passer un paramètre et quand utiliser une variable d'instance

Comment décidez-vous entre garder une trace de quelque chose localement, puis simplement le transmettre à chaque méthode que vous appelez, ou déclarer une variable d'instance et l'utiliser dans les méthodes?

J'ai tendance à préférer les variables d'instance conservées dans une liste à la fin de la classe. Mais comme mes programmes deviennent de plus en plus compliqués, cette liste s'allonge de plus en plus ... Je pense que si quelque chose est passé assez souvent, il devrait juste être visible pour tous les garçons et les filles qui en ont besoin, mais alors je commence à me demander, "pourquoi ne pas tout rendre public! Alors il n'y aura plus besoin de passer quoi que ce soit!"

87
Ziggy

Puisque vous faites référence à des variables d'instance, je suppose que vous travaillez dans un langage orienté objet. Dans une certaine mesure, quand utiliser des variables d'instance, comment définir leur portée et quand utiliser des variables locales est subjectif, mais il y a quelques règles de base que vous pouvez suivre chaque fois que vous créez vos classes.

  • Les variables d'instance sont généralement considérées comme des attributs d'une classe. Considérez-les comme des adjectifs de l'objet qui sera créé à partir de votre classe. Si vos données d'instance peuvent être utilisées pour aider à décrire l'objet, alors il est probablement sûr de parier que c'est un bon choix pour les données d'instance.

  • Les variables locales sont utilisées dans le cadre des méthodes pour les aider à terminer leur travail. Habituellement, une méthode devrait avoir pour but d'obtenir des données, de renvoyer certaines données et/ou de traiter/exécuter un algorithme sur certaines Les données. Parfois, il est utile de considérer les variables locales comme des moyens d'aider une méthode à passer du début à la fin.

  • La portée des variables d'instance n'est pas seulement pour la sécurité, mais aussi pour l'encapsulation. Ne présumez pas que "l'objectif devrait être de garder toutes les variables privées". En cas d'héritage, la création de variables protégées est généralement une bonne alternative. Plutôt que de marquer toutes les données d'instance comme publiques, vous créez des getters/setters pour ceux qui doivent être accessibles au monde extérieur. Ne les rendez pas tous disponibles - uniquement ceux dont vous avez besoin. Cela viendra tout au long du cycle de vie du développement - il est difficile de deviner dès le départ.

Quand il s'agit de transmettre des données dans une classe, il est difficile de dire que ce que vous faites est une bonne pratique sans voir du code. Parfois, opérer directement sur les données d'instance est très bien; d'autres fois, ce n'est pas le cas. À mon avis, c'est quelque chose qui vient avec l'expérience - vous développerez une certaine intuition à mesure que vos capacités de réflexion orientée objet s'amélioreront.

51
Tom

Cela dépend principalement de la durée de vie des données que vous stockez dans la variable. Si les données ne sont utilisées que lors d'un calcul, passez-les en paramètre. Si les données sont liées à la durée de vie de l'objet, utilisez une variable d'instance.

Lorsque votre liste de variables devient trop longue, c'est peut-être un bon point de penser à refactoriser certaines parties de la classe dans une nouvelle classe.

43
H-Man2

À mon avis, les variables d'instance ne sont nécessaires que lorsque les données seront utilisées d'un appel à l'autre.

Voici un exemple:

myCircle = myDrawing.drawCircle(center, radius);

Permet maintenant d'imager la classe myDrawing utilise 15 fonctions d'assistance pour créer l'objet myCircle et chacune de ces fonctions aura besoin du centre et du rayon. Ils ne doivent toujours pas être définis comme variables d'instance de la classe myDrawing. Parce qu'ils ne seront plus jamais nécessaires.

D'un autre côté, la classe myCircle devra stocker à la fois le centre et le rayon en tant que variables d'instance.

myCircle.move(newCenter);
myCircle.resize(newRadius);

Pour que l'objet myCircle sache ce que sont son rayon et son centre lorsque ces nouveaux appels sont effectués, ils doivent être stockés en tant que variables d'instance, et pas seulement passés aux fonctions qui en ont besoin.

Donc, fondamentalement, les variables d'instance sont un moyen de sauvegarder "l'état" d'un objet. Si une variable n'est pas nécessaire pour connaître l'état d'un objet, elle ne doit pas être une variable d'instance.

Et quant à tout rendre public. Cela pourrait vous faciliter la vie dans l'instant. Mais il reviendra vous hanter. Ne le fais pas.

20
ng.mangine

A MON HUMBLE AVIS:

Si la variable fait partie de l'état de l'instance, elle doit être une variable d'instance - instance de classe HAS-A variable d'instance.

Si je me retrouvais à passer quelque chose à plusieurs reprises dans les méthodes d'une instance, ou si je trouvais un grand nombre de variables d'instance, j'essaierais probablement de regarder ma conception au cas où j'aurais oublié quelque chose ou fait une mauvaise abstraction quelque part.

J'espère que ça aide

4
brabster

Bien sûr, il est facile de garder une grande liste de variables publiques dans la classe. Mais même intuitivement, vous pouvez dire que ce n'est pas la voie à suivre.

Définissez chaque variable juste avant de l'utiliser. Si une variable prend en charge la fonction d'une méthode spécifique, utilisez-la uniquement dans le cadre de la méthode.

Pensez également à la sécurité, une variable de classe publique est sensible aux modifications indésirables du code "extérieur". Votre objectif principal devrait être de garder toutes les variables privées, et toute variable qui ne l'est pas devrait avoir une très bonne raison de l'être.

À propos de la transmission de paramètres tout au long de la pile, cela peut devenir très rapide. Une règle d'or consiste à garder vos signatures de méthode propres et élégantes. Si vous voyez de nombreuses méthodes utilisant les mêmes données, décidez si c'est assez important pour être membre de la classe, et si ce n'est pas le cas, refactorisez votre code pour qu'il ait plus de sens.

Cela se résume au bon sens. Pensez exactement où et pourquoi vous déclarez chaque nouvelle variable, quelle doit être sa fonction, et à partir de là, prenez une décision concernant l'étendue dans laquelle elle doit vivre.

3
Yuval Adam