35 votes

A quoi servent les variables publiques alors?

Je suis un total newbie avec des tonnes de ?'s dans mon esprit et beaucoup d'expérience avec C++ encore! Il y a eu quelque chose que je trouve vraiment déroutant et c'est l'utilisation de variables publiques, j'ai vu des tonnes de code comme ceci:

class Foo {

private:
    int m_somePrivateVar;

public:
    void setThatPrivateVar (int const & new_val) {
        m_somePrivateVar = new_val;
    }

    int getThatPrivateVar (void) const {
        return m_somePrivateVar;
    }

};

Pourquoi serait-on cacher cette variable et de mettre en œuvre des accesseurs et des mutateurs quand il n'y a rien fait, en plus de l'affectation de la nouvelle valeur juste comme il a obtenu reçu (pas de vérification de plage, etc.) ou le retour de la valeur sans juste que c'est? Eh bien, j'ai entendu dire que certaines raisons, et certains d'entre eux sont convaincants dans certains cas, mais imaginer la mise en œuvre d'une vaste classe de telle manière, avec beaucoup de variables qui n'ont pas besoin de vérifier et d'autres choses! Permettez-moi de vous poser cette façon, Lorsque vous utilisez des variables publiques? Utilisez-vous cela?

Merci à l'avance.

41voto

Mark B Points 60200

En cachant la variable et l'ajout de méthodes de maintenant, le concepteur de classes permettant l'insertion de code arbitraire dans ces méthodes dans le futur sans rupture des tonnes de code qui utilisent les attributs directement.

Notez également que la fourniture d'un lot de accesseur/mutateur méthodes est généralement un signe que votre classe les besoins de conception d'un nouveau look pour l'amélioration possible. Les méthodes de la classe doit implémenter la logique réelle, et pas seulement de fournir un accès à chaque membre.

J'utilise les variables, en struct formulaire. Par exemple, je pourrais avoir une table de base de données qui représente une chaîne->valeur de cartographie, d'où la valeur est une structure composite de données. Je venais d'écrire d'une structure et d'utiliser, par exemple, std::map<std::string, MyStruct> pour représenter la table de base de données. Je n'ai pas besoin de le faire réellement le travail sur les données, simplement en mesure de regarder et d'en faire usage quand il le faut.

Comme indiqué dans un couple des commentaires, même structs peuvent souvent bénéficier de l'utilisation judicieuse des méthodes, par exemple un couple de la commune de constructeurs de tenir les membres sainement initialisé, la fonction effacer la réutilisation de la structure, etc.

23voto

Doug T. Points 33360

OMI La raison la plus convaincante pour les setters / getters est d' isoler le changement . Si vous devez ajouter une vérification de plage, par exemple, si vous avez déjà un setter, vous pouvez le faire facilement dans votre setter sans affecter le code client. Si vous n'avez pas encore de setter, alors tout le code client doit être mis à jour pour utiliser des accesseurs / setters, ce qui pourrait être un cauchemar.

17voto

Tony Points 5945

Je suis d'accord, en partie, avec les autres réponses concernant l'utilisation des méthodes getter et setter pour permettre aux futurs changements, mais il y a encore un problème fondamental, en vous exposant les données internes de votre objet pour d'autres objets à modifier.

Il est préférable de demander l'objet pour effectuer une certaine action sur les données qu'il détient, par l'intermédiaire d'une méthode, plutôt que de traiter l'objet comme un ensemble de valeurs.

Voici un article intéressant sur le Pourquoi des Accesseurs et des mutateurs sont Mauvais, c'est écrit avec Java à l'esprit, mais le même s'applique à C++.

5voto

BillThor Points 3319

Rien exposées en public devient partie intégrante du contrat de cet objet. Si vous exposer publiquement des informations, ensuite, il faut continuer à se comporter correctement lorsque les valeurs des données sont modifiées. Pour struct type les objets peuvent être appropriées.

Ayant un nombre élevé de getters et setters peut être un signe d'avertissement que l'objet est vraiment une struct et il peut être mieux exposer les champs directement. Cependant, j'ai mis en œuvre struct type d'objets, afin de permettre à des champs d'avoir plusieurs noms. Les champs peuvent avoir plusieurs incubateurs ou des getters comme requis permettant la traduction de noms entre les différents domaines. Le véritable champs avaient des noms descriptifs. Supplémentaires getters et setters utilisé le domaine des codes spécifiques pour ces zones.

Comme d'autres l'ont noté, les accesseurs et mutateurs sont un indicateur de la présence d'un champ. Il n'est pas nécessaire qu'un tel champ n'existent pas, que son comportement existe. Faire les getters et setters public implique qu'il n'y est une raison pour le public d'être en mesure de modifier ou de lire la valeur de ce champ. Réfléchir à deux fois sur l'objet, et vous pouvez changer le nom de la méthode ou de ne pas le rendre public.

4voto

luke Points 16255

Un argument fonctionne à peu près comme ceci:

Si le code externe à la classe en question repose directement sur un membre particulier, modifier ce dernier signifie modifier chaque élément de code qui y accède. Si, au contraire, les fonctions membres y accèdent, vous pouvez conserver la même partie de l'interface et ne devoir modifier que cette classe pour que le code externe fonctionne.

L'utilisation de "getters" et de "setters" vous donne une certaine flexibilité intégrée dans le couplage de vos objets.

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