web-dev-qa-db-fra.com

Traits de soulignement pour les variables membres en C ++

J'ai vu des gens utiliser un trait de soulignement pour les variables membres dans les classes, par exemple dans le célèbre C++ FAQ Lite .

Je pense que son but n'est pas de marquer les variables comme membres, c'est à ça que sert "m_". Son but réel est de permettre d'avoir une méthode d'accesseur nommée comme le champ, comme ceci:

class Foo {
public:
    bar the_bar() { return the_bar_; }
private:
    bar the_bar_;
}

Avoir des accesseurs omettant la partie "get_" est courant dans la STL et boost, et j'essaie de développer un style de codage aussi proche que possible de ceux-ci, mais je ne peux pas vraiment les voir utiliser l'astuce de soulignement. Je n'ai pas été en mesure de trouver un accesseur en STL ou boost qui retournerait simplement une variable privée.

J'ai quelques questions, j'espère que vous pourrez y répondre:

  1. D'où vient cette convention? Smalltalk? Objectif c? Microsoft? Je me demande.
  2. Dois-je utiliser le trait de soulignement de fin pour tous les membres privés ou simplement comme solution de contournement au cas où je voudrais nommer une fonction comme une variable?
  3. Pouvez-vous me pointer vers STL ou augmenter le code qui illustre les traits de soulignement finaux pour les variables membres?
  4. Quelqu'un sait-il ce que Stroustrup pense de la question?
  5. Pouvez-vous m'indiquer une discussion plus approfondie de la question?
41
eomer

En C++,

  1. identificateurs commençant par un trait de soulignement, suivi d'un caractère majuscule
  2. identifiants ayant deux traits de soulignement consécutifs n'importe où
  3. identificateurs dans l'espace de noms global commençant par un trait de soulignement

sont réservés à la mise en œuvre. (Plus d'informations à ce sujet peuvent être trouvées ici .) Plutôt que d'essayer de se souvenir de ces règles, beaucoup n'utilisent tout simplement pas d'identifiants commençant par un trait de soulignement. C'est pourquoi le trait de soulignement de fin a été inventé.

Cependant, C++ lui-même est ancien et s'appuie sur 40 ans de C (qui n'ont jamais eu une seule entreprise derrière eux) et possède une bibliothèque standard qui a "grandi" pendant plusieurs décennies, plutôt que de voir le jour en un seul acte de la création. Cela fait qu'il existe de nombreuses conventions de dénomination différentes. Le soulignement de fin pour les privés (ou uniquement pour les données privées) n'en est qu'un, beaucoup en utilisent d'autres (pas peu d'entre eux faisant valoir que, si vous avez besoin de soulignements pour distinguer les membres privés des variables locales, votre code n'est pas assez clair).

Quant aux getters/setters - ils sont une abomination et un signe certain de " quasi classes " , que je déteste.

32
sbi

J'ai lu The C++ Programming Language et Stroustrup n'utilise aucune sorte de convention pour nommer les membres. Il n'en a jamais besoin; il n'y a pas un seul accesseur/mutateur simple, il a un moyen de créer des conceptions orientées objet très fines donc il n'est pas nécessaire d'avoir une méthode du même nom. Il utilise des structures avec des membres publics chaque fois qu'il a besoin de structures de données simples. Ses méthodes semblent toujours être opérations. J'ai également lu quelque part qu'il déconseille l'utilisation de noms qui ne diffèrent que par un caractère.

16
forceal

Je suis personnellement un grand fan de cette directive: http://geosoft.no/development/cppstyle.html

Cela inclut l'omission du préfixe m_, l'utilisation d'un suffixe de soulignement pour indiquer les variables de membre privé et l'abandon de l'habitude horrible et ennuyeuse d'utiliser des traits de soulignement au lieu de l'espace, et d'autres suggestions plus détaillées et spécifiques, telles que la dénomination booléenne appropriée (isDone au lieu de simplement done) et en utilisant getVariable() au lieu de simplement variable() pour n'en nommer que quelques-uns.

12
identity

Je ne parle que pour moi ... J'utilise toujours un trait de soulignement de fin pour les membres de données privées, qu'ils aient ou non des fonctions d'accesseur. Je n'utilise pas m_ principalement parce qu'il gêne quand j'épelle mentalement le nom de la variable.

9
usta

En tant que développeur de maintenance qui aime la recherche, je penche vers m_ comme son plus consultable. Lorsque vous, comme moi, maintenez de grands projets avec de grandes classes (ne demandez pas), vous vous demandez parfois: "Hmmm, qui mute l'état?". Une recherche rapide de m_ peut donner un indice.

Je suis également connu pour utiliser l_ pour indiquer les variables locales mais le projet actuel ne l'utilise pas, donc je suis "propre" de nos jours.

Je ne suis pas fan de la notation hongroise. C++ a un système de type fort, je l'utilise à la place.

Je suppose que l'utopie aurait été d'utiliser un trait de soulignement de premier plan - cela est assez courant dans Java et C # pour les membres.

Cependant, pour C, les traits de soulignement principaux ne sont pas une bonne idée, donc je suppose que la recommandation du C++ FAQ Lite pour aller à la fin du trait de soulignement:

Tous les identifiants qui commencent par un trait de soulignement et soit une lettre majuscule ou un autre trait de soulignement sont toujours réservés à toute utilisation.

Tous les identificateurs qui commencent par un trait de soulignement sont toujours réservés pour être utilisés comme identificateurs avec une portée de fichier dans les espaces de nom ordinaires et de balise.


(Spécification ISO C99, section 7.1.3)

3
StuartLC

Pour autant que je m'en souvienne, ce n'est pas Microsoft qui a poussé le style de code de soulignement de fin pour les membres.

J'ai lu que Stroustrup est le trait de soulignement final.

1
Stephane Rolland