Est l'aide de souligner suffixe pour les membres bénéfique?
class C {
private:
int member_; //here is the underscore I refer to.
}
Ce trait de soulignement est recommandé par Google Guide De Style et Geosoft du C++ Guide de Style.
Je comprends qu'il y a des opinions différentes et des goûts.
Je veux demander à des gens qui ont utilisé ou qui ont été forcés de l'utiliser si ils ont jugé bénéfique, neutre ou nocif pour eux. Et pourquoi?
Voici ma réponse:
Je comprends poser des motivations derrière elle, mais elle ne me convainc pas.
Je l'ai essayé et je n'ai eu un peu de désordre partout dans la classe, mais en plus simple initialisation des membres dans le constructeur. Je n'ai pas rencontré de situation où le trait de soulignement contribué à différer entre la variable membre privée et d'une autre variable (sauf dans les cités de l'initialisation).
Dans cette lumière, je considère que ce style de nuisibles.
- Subjectif en fait. Je ne suis pas en faveur de cette convention de nommage soit.
- Pourriez-vous préciser pourquoi vous ne l'aimez pas?
- Fuite des traits de soulignement sont pas plus faciles à 'spot' si vous voyez ce que je veux dire. Et c'est moche. Ha...
- Je suis peut-être fou, mais il semble que la mise il underscore à la fin, c'est la violation d'autres guides de style que de l'état les plus importantes variations d'un nom doit être au début. Pour moi, division des variables dans les régions (membre vs non-membre, etc) est à peu près aussi grands que vous pouvez obtenir, mais j'ai une préférence hiérarchique des conventions.
- Mais alors, vous êtes mieux éviter d'utiliser des caractères de soulignement au début, à cause de la norme ANSI C. C'est pourquoi beaucoup aussi utiliser un
m_
préfixe.
Vous devez vous connecter pour publier un commentaire.
Eh bien, puisque personne ne le mentionne: l'ajout d'un trait de soulignement à la variable de membre vous permet de nommer votre getter et setter avec "conceptuelles" nom de la variable.
ex:
pas que j'utilise ce style si.
m_
) fait le même travail. Aussi, plutôt que d'ajouter un_
suffixe je pense qu'il est préférable d'utiliserthis->
chaque fois que vous accédez à un membre.this->
précise que je suis se référant à un objet contenu par*this
. Aussithis
est un mot clé qui est mis en évidence et highlightning est flatteur vos yeux (sauf si vous changé de rose sur fond vert) 🙂void someMember( int newValue ) { validate(newValue); someMember_ = newValue; }
size()
,begin()
, etc. dans de nombreux contenants (pasget_size()
,get_begin()
). De même pour certains des rares organismes de réglementation, par exemplewidth(streamsize)
. Évidemment, le Standard ne veut pas dire la façon dont les variables membres devraient être nommés, mais il empêche de nommage est la même que pour leur respective des "getters" (en fonction de la mise en œuvre).size()
etbegin()
etc. d'un côté, et ces méchants getters et setters [PDF] tout le monde semble aimer l'autre, c'est que les premiers sont des concepts inhérents à l'idée d'un conteneur. (Il n'est pas beaucoup d'utilité à avoir des trucs dans un récipient si vous ne pouvez pas compter un énumérer il.) Aussi, en C++03,std::list
a été autorisé à calculersize()
à la demande, plutôt que de chercher une valeur stockée.get_x()
,set_x()
ne pas exposer au client, qu'il est nécessairement un membrex
à l'intérieur de la classe qui est en train d'être lues et écrites par ces méthodes. Cela peut tout simplement pas être vrai. Les membres seulement dire qu'il y a une propriété conceptuellex
d'une classe, qui peut être lu et écrit. Comment cette propriété est mis en oeuvre, eh bien, encapsulé.Si vous besoin ce trait de soulignement afin d'informer les membres de la classe à partir d'autres variables, vous avez probablement trop grandes fonctions de membre pour voir instantanément ce qui est une variable ou le paramètre.
J'aime toujours parce qu'il facilite membre paramètre de la fonction de nommage:
_
suffixe pour les paramètres (et ce serait que de l'acheter moi, sauf pour le fait d'avoir mon propre convention qui est en arrière de tout le monde) ou je suis de retour pour ad-hoc paramètre de renommer en raison des affrontements avec les membres de la classe (qui à éviter, c'est la raison pour laquelle j'ai ajouter un_
pour les membres de la classe).person(const string &the_first_name, const string &the_last_name);
l'Ajout d'un arbitraire de la décoration pour les noms de paramètre dans le constructeur que apparaissent dans le constructeur. Alors quefirst_name
etlast_name
doivent être utilisés plusieurs fois dans le contexte de la classe. Il semble que le trait de soulignement suffixe et des conventions similaires pour les membres de sacrifier la lisibilité des noms de membres afin de rendre les paramètres du constructeur plus lisible. La lisibilité des paramètres du constructeur noms vraiment d'importance?the_...
préfixe de façon plus visuelle de l'encombrement de mon..._
suffixe. Mais j'insiste sur ni objectivement mieux. J'ai travaillé dans de nombreux projets avec les différentes conventions et, peu importe à quel point ils semblent au premier abord, après quelques mois, ils sont tous à un autre.:first_name(first_name)
pourrait fonctionner ici, si vous n'utilisez pas_
suffixe.- Je utiliser "m_" comme préfixe pour un membre normal de variables et de "s_" statique des variables membres.
Ainsi, le champ d'application est directement visible.
m_
, ce qui est beaucoup plus d'une verrue (et n'était même pas demandé à ce sujet), est voté par une foule silencieuse. Voilà pour les arguments rationnels.:)
Pour moi l'avantage de ce style de décoration des variables de membre est qu'il fonctionne bien avec l'auto complète des fonctionnalités des éditeurs de texte. Un préfixe de décoration vous demande de taper plus de caractères avant un solide deviner ce que tu veux dire peut être faite.
Je pense que c'est important de faire la distinction entre les variables de classe et locales (et mondial si vraiment nécessaire). Comment vous le faites, n'est pas importante - juste être cohérente.
Tous les styles vous donner les informations dont vous avez besoin. Aussi longtemps que vous restez avec le même style de tous les temps, pas de problème. Parfois, d'autres personnes ont besoin de travailler avec votre code (par exemple, lorsque vous créez une bibliothèque, ou si vous travaillez avec une communauté). Ensuite, il pourrait être une bonne idée de coller avec le plus utilisé de style dans le C++ de la communauté.
Désolé, je ne peux pas répondre à ce style.
\w*__\w*
et_[A-Z]\w*
); 2. Un identificateur commence par un trait de soulignement est réservé à la mise en œuvre dans portée globale (_\w*
). Je ne me souviens pas exactement paragraphe, mais c'est quelque part sur DONC.Je suis venu avec ce style de façon indépendante au début de mon codage C++ jours (fin des années 80, début des années 90), car j'ai rencontré plusieurs situations confuses dans lequel j'avais toujours revenir à la classe d'en-tête pour déterminer la variable qui a été vraiment une variable membre.
Une fois que j'ai commencé à voir d'autres personnes de code C++ qui a fait la même chose, j'étais plutôt heureux de constater que j'avais remarqué un problème que d'autres personnes et que la solution que j'ai adopté pour moi était quelque chose que d'autres personnes ont aussi pensé.
Ce n'est pas souvent utile, mais c'est assez inoffensif et quand il est utile, il est très utile.
C'est aussi pourquoi je déteste vraiment l'm_ style. Il n'est pas anodin, et je pense que l'ajout de la laideur n'est pas la peine de la prestation.
J'utilise un S_ préfixe de fichier portée des variables statiques de classe et les variables statiques qui ne sont pas constantes. Ils sont un peu comme des variables globales, et je pense que leur utilisation doit être signalé à voix haute.
C'est essentiellement un argument religieux de sorte que vous n'ayez pas l'intention de parvenir à un consensus sur ce style. FWIW, je utiliser ce style pour mon variables de membre pour les raisons déjà exposées par d'autres, par exemple:
Suffit pas d'adopter quelque chose que vous êtes heureux avec et rester avec elle.
C'est venu dans la discussion où je travaille, mais avec la programmation Java. Mais je pense que cela s'applique à C++. Ma réponse est que les IDE ont une fonction pratique de la coloration variables de membre de classe. Dans Eclipse, ils virent au bleu. Le trait de soulignement est superflu. Comme une autre affiche, "il EW, hongrois verrues!!". 1980 appelle et veut, c'est la notation hongroise de retour.
Nous suivre possibility.com's norme de codage C++ , qui dit de préfixer les variables de membre avec un "m", mais j'ai aussi fait un peu de travail en vertu de Google guide de style.
Comme vous le dites, il n'est pas strictement nécessaire, surtout si vous avez une IDE qui attribue différentes coloration syntaxique pour les variables membres. Cependant, je pense que certains type de schéma cohérent de nommage, pour vous permettre de voir en un coup d'œil si une variable est une variable de membre, est très intéressant:
(Vous avez mentionné que vous avez donné à ce style d'essayer, mais si c'est seulement pour une partie de code et uniquement pour le code qui vous étaient déjà familiers avec, alors il est plus difficile de voir la lisibilité des prestations qu'à la suite d'un style de codage comme ceci pour l'ensemble de la base de code peut apporter.)
Tout cela est dans mon expérience, votre kilométrage peut varier, etc.
il ya un plus de "style", qui suggère de déclarer des membres de la classe ci-dessous:
j'ai trouvé qu'il utilisable. mais c'est juste mon point de vue.
Je suis d'accord avec Tobias qu'il y a un avantage pour certains de la convention-quelle qu'elle soit -- la mise en évidence des variables de classe. D'autre part, j'ai invariablement trouver que de telles conventions de rendre le code "flux" de moins en moins bien. C'est juste plus facile à lire "totalPrice = productPrice + tva", puis "m_totalPrice = l_productPrice + l_salesTax" ou quoi que ce soit.
En fin de compte, je préfère juste les laisser tous les noms de champ sans décor, et ont assez peu de variables de classe que de garder une trace d'eux n'est pas un problème. Dans les constructeurs et les setters, j'ai mis un préfixe ou un suffixe sur le paramètre, ou en Java en général, je distinguer la variable de classe avec".", comme:
(Pouvez-vous le faire en C++? Ça fait tellement longtemps que je ne m'en souviens pas.)
bar
est une chaîne de caractères, vous ne voulez pas.Je suis d'accord avec vous que le trait de soulignement variable suffixe n'est pas l'idéal style de codage, et que l'ajout d'un peu de complexité dans le constructeur est mieux que d'ajouter plus de complexité tout au long de l'ensemble de la classe.
L'autre jour, j'ai pris un coup d'oeil à un de mes vieux projets Java où j'avais appliqué le trait de soulignement suffixe de noms de variables, et j'ai trouvé qu'il n'rendre la lecture du code plus difficile. Il n'était pas trop dur de s'y habituer, mais je l'ai trouvé légèrement distraire sans l'ajout d'aucun avantage réel.
J'ai toujours envie de distinguer les membres de la classe à partir des variables. J'utilise le _ comme préfixe pour les membres et personnellement cela permet de maintenir le code propre et lisible. Les préfixes beau travail avec l'éditeur de l'intellisense. Préfixant avec m_ ou s_ est utile, mais Il semble laid pour moi.