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:
En C++,
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.
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.
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.
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.
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)
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.