101 votes

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

Comment faites-vous pour choisir entre garder la trace de quelque chose localement et puis juste de passage pour chaque méthode que vous appelez, ou la déclaration d'une variable d'instance et de l'utiliser dans les méthodes?

J'ai tendance à préférer les variables d'instance conservé dans une liste à la fin de la Classe. Mais comme mes programmes deviennent de plus en plus compliqué, cette liste est plus longue et plus... je me dis que si quelque chose est passé assez souvent qu'il devrait être visible à tous les garçons et les filles qui en ont besoin, mais ensuite j'ai commencer à se demander, "pourquoi ne pas simplement faire tout publique! Alors il n'y aura plus besoin de passer quoi que ce soit!"

60voto

Tom Points 5872

Puisque vous faites référence à des variables d'instance, je suis en supposant que vous travaillez dans un langage orienté-objet. Dans une certaine mesure, lors de l'utilisation de variables d'instance, la façon de définir leur portée, et quand utiliser des variables locales est subjectif, mais il ya quelques règles de base que vous pouvez suivre chaque fois que la création de vos classes.

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

  • Les variables locales sont utilisées dans le champ d'application de méthodes pour les aider à terminer leur travail. Généralement, une méthode doit avoir un objectif de l'obtention de certaines données, la restitution d'une partie des données, et/ou proccessing/en cours d'exécution d'un algorithme sur des données. Parfois, il aide à penser à des variables locales comme des moyens d'aider une méthode get du début à la fin.

  • Variable d'Instance de la portée n'est pas seulement pour la sécurité, mais pour l'encapsulation, ainsi. Ne présumez pas que le "but devrait être de garder toutes les variables privées". En cas de succession, de prise de variables protégées est généralement une bonne alternative. Plutôt que de marquage de toutes les données de l'instance publique, vous créez des getters/setters pour ceux qui doivent être accessibles au monde extérieur. Ne pas les rendre disponibles uniquement ceux dont vous avez besoin. Cela viendra tout au long du cycle de développement - il est difficile de deviner dès le départ.

Quand il s'agit de la transmission des données autour d'une classe, il est difficile de dire ce que vous faites est de bonne pratique sans voir un peu de code . Parfois, opérant directement sur les données de l'instance est très bien; d'autres fois, il ne l'est pas. À mon avis, c'est quelque chose qui vient avec l'expérience, vous aurez la chance d'acquérir une certaine intuition que l'objet de votre réflexion orientée vers l'amélioration des compétences.

49voto

H-Man2 Points 1919

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 pendant un calcul, transmettez-les en tant que 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 est trop longue, il est peut-être bon de penser à refactoriser certaines parties de la classe dans une nouvelle classe.

25voto

ng.mangine Points 922

À mon avis, les variables d'instance ne sont nécessaires que lorsque les données seront utilisées entre les appels.

Voici un exemple:

myCircle = myDrawing.drawCircle(center, radius);

Maintenant passons à l'imagerie de la myDrawing classe utilise des 15 fonctions d'assistance à créer l'objet myCircle et chacune de ces fonctions devront le centre et le rayon. Ils doivent pas encore être définies comme des variables d'instance de la myDrawing classe. Car ils ne pourront jamais être à nouveau nécessaire.

D'autre part, la myCircle classe aurez besoin pour stocker à la fois le centre et le rayon que les variables d'instance.

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

Pour que l'objet myCircle savoir ce que c'est le rayon et le centre sont quand ces nouveaux appels sont effectués, ils doivent être stockés en tant que variables d'instance, pas juste passé pour les fonctions qui en ont besoin.

Donc, fondamentalement, les variables d'instance sont un moyen d'économiser de l ' "état" d'un objet. Si une variable n'est pas nécessaire de connaître l'état d'un objet, alors il ne devrait pas être une variable d'instance.

Et comme pour tout public. Il peut rendre votre vie plus facile en ce moment. Mais il va revenir vous hanter. Pease ne le font pas.

4voto

Brabster Points 18764

Imho:

Si la variable fait partie de l'état de l'instance, alors il devrait être une variable d'instance - instance de classe HAS-A instancevariable.

Si je me trouvais en passant quelque chose à plusieurs reprises dans les méthodes d'une instance, ou j'ai trouvé que j'avais un grand nombre de variables d'instance, je serais probablement essayer de regarder ma conception au cas où j'avais manqué quelque chose ou fait une mauvaise abstraction quelque part.

J'espère que cela aide

3voto

Yuval Adam Points 59423

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

Définir chaque variable juste avant que vous allez utiliser. Si une variable prend en charge la fonction d'une méthode spécifique de l'utiliser uniquement dans le champ d'application de la méthode.

Pensez également à la sécurité du public, un variable de classe est sensible à des changements non désirés à partir de "l'extérieur" du code. Votre principal objectif devrait être de garder toutes les variables privées, et toute variable qui n'est pas, doit avoir une très bonne raison de l'être.

À propos d'un passage de paramètres tout ce qu'ils chemin jusqu'à la pile, cela peut devenir laid très rapide. Une règle de base est de garder vos signatures de méthode propre et élégant. Si vous voyez beaucoup de méthodes en utilisant les mêmes données, décider si elle est suffisamment important pour être un membre de la classe, et si elle ne l'est pas, restructurer le code pour avoir plus de sens.

Il se résume à du bon sens. Pense exactement où et pourquoi vous devez déclarer chaque nouvelle variable, ce qu'il devrait être, et à partir de là prendre une décision à l'égard de laquelle il doit vivre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X