100 votes

Comment accéderiez-vous aux propriétés d'un objet depuis une méthode d'objet?

Qu'est-ce que le "puriste" ou de la "bonne" façon d'accéder aux propriétés d'un objet à partir d'une méthode de l'objet qui n'est pas un getter/setter de la méthode?

Je sais qu'à partir de l'extérieur de l'objet, vous devez utiliser un getter/setter, mais de l'intérieur serait que tu viens de faire:

Java:

String property = this.property;

PHP:

$property = $this->property;

ou voulez-vous faire:

Java:

String property = this.getProperty();

PHP:

$property = $this->getProperty();

Pardonnez-moi si mon Java est un peu hors, cela fait un an depuis que j'ai programmé en Java...

EDIT:

Il semble que les gens sont en supposant que je suis en train de parler privés ou protégés des variables/propriétés. Quand j'ai appris OO on m'a appris à utiliser des getters/setters pour tous les biens, même si c'était le public (et en fait on m'a dit de ne jamais faire de n'importe quelle variable/public à la propriété). Donc, j'ai peut-être commencer à partir d'une hypothèse fausse. Il semble que les gens de répondre à cette question sont peut-être dire que vous devriez avoir des propriétés publiques, et que ceux qui n'ont pas besoin de getters et setters, qui va à l'encontre de ce que j'ai appris, et ce que j'étais en train de parler, bien que peut-être qui doit être discuté. C'est probablement un bon sujet pour une autre question...

64voto

Greg Hurlman Points 10944

Cela a un potentiel de guerre religieux, mais il me semble que si vous utilisez un getter / setter, vous devriez également l’utiliser en interne: utiliser les deux risque de poser des problèmes de maintenance plus tard (par exemple, quelqu'un ajoute du code à un setter qui a besoin à exécuter à chaque fois que cette propriété est définie, et que la propriété est définie en interne sans que ce paramètre soit appelé).

44voto

MojoFilter Points 3730

Personnellement, je pense que c'est important de rester cohérent. Si vous avez des getters et les setters, les utiliser. La seule fois où je voudrais accéder à un champ directement, c'est quand l'accesseur a beaucoup de frais généraux. Il peut se sentir comme vous êtes des ballonnements votre code inutilement, mais il peut certainement sauver beaucoup de maux de tête à l'avenir. L'exemple classique:

Plus tard, vous pouvez le désir de changer la façon dont les travaux de terrain. Peut-être il devrait être calculé à la volée ou peut-être vous souhaitez utiliser un autre type de mémoire de sauvegarde. Si vous accédez directement des propriétés, un changement qui peut casser beaucoup de code dans un seul récit foop.

26voto

moffdub Points 3757

Je suis assez surpris de voir comment l'unanimité, le sentiment est que les getters et les setters sont beaux et bons. Je suggère que les incendiaires de l'article par Allen Holub "Getters Et les Setters Sont du Mal". Accordé, le titre est pour la valeur de choc, mais l'auteur a fait des points valides.

Essentiellement, si vous avez des getters et setters pour chaque et chaque domaine privé, vous êtes à la fabrication de ces domaines aussi bien que public. Vous seriez très difficile de changer le type d'un champ privé sans effets secondaires pour chaque classe que les appels de lecture.

En outre, sur un plan strictement OO point de vue, des objets doit être de répondre aux messages (méthodes) qui correspondent à leurs (espérons-le) de responsabilité unique. La grande majorité des getters et setters ne faites pas de sens pour leurs objets constitutifs; Pen.dispenseInkOnto(Surface) plus de sens pour moi que Pen.getColor().

Les accesseurs et mutateurs également encourager les utilisateurs de la classe pour demander à l'objet de certaines données, effectuer un calcul, puis de définir une autre valeur dans l'objet, mieux connu sous le nom de procédure de programmation. Vous seriez mieux servi tout simplement de dire l'objet pour en faire ce que vous alliez en premier lieu, également connu comme le spécialiste de l'Information de l'idiome.

Getters et setters, cependant, sont un mal nécessaire à la limite des couches -- de l'INTERFACE utilisateur, de la persistance, et ainsi de suite. L'accès restreint à une classe interne, tels que C++ami de mots clés, de Java package d'accès protégé, .NET d'accès à l'interne, et l' Ami de la Classe de Patron peut vous aider à réduire la visibilité des getters et setters à ceux qui en ont besoin.

19voto

Shawn Points 8120

Il dépend de la façon dont la propriété est utilisée. Par exemple, disons que vous avez un étudiant objet qui a un nom de propriété. Vous pouvez utiliser votre méthode Get pour extraire le nom de la base de données, si elle n'a pas été récupéré déjà. De cette façon, vous êtes en réduisant les appels à la base de données.

Maintenant, disons que vous avez un entier privée comptoir dans votre objet qui compte le nombre de fois que le nom a été appelé. Vous souhaitez peut-être pas utiliser la méthode Get de l'intérieur de l'objet, car il serait de produire un nombre non valide.

13voto

pix0r Points 17854

Suis-je tout simplement d'aller à la mer ici?

Peut-être ;)

Une autre approche serait d'utiliser un privé/protégé méthode pour réellement faire la obtenir (cache/db/etc), et un public wrapper pour ce qui incrémente le compteur:

PHP:

public function getName() {

et puis, à partir de l'intérieur de l'objet lui-même:

PHP:


De cette façon, vous pouvez toujours utiliser ce premier argument en faveur de quelque chose d'autre (comme l'envoi d'un indicateur pour savoir si ou de ne pas utilisé les données mises en cache peut-être ici).

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