Existe-t-il une convention de capitalisation commune en C ++? [fermé]

13

Je fais beaucoup de travail en Python et Java, et ces deux langages ont des conventions assez communes (mais pas universelles) sur la façon dont la capitalisation doit être utilisée dans les identificateurs: à la fois utiliser PascalCasepour les noms de classe et ALL_CAPSpour les constantes "globales", mais pour d'autres identifiants un beaucoup de code Java utilise mixedCasealors que beaucoup de code Python utilise underscore_delimiters. Je sais qu'aucun langage ou bibliothèque n'impose une majuscule particulière, mais j'ai constaté que lorsque je m'en tiens aux conventions standard pour la langue que j'utilise, mon code semble beaucoup plus lisible.

Maintenant, je démarre un projet en C ++, et j'aimerais appliquer la même idée. Y a-t-il une convention de capitalisation la plus courante que je devrais connaître?

David Z
la source
Le problème avec camelCase est qu'il ne fonctionne pas bien avec le préprocesseur. Pas un gros problème, d'autant plus que le préprocesseur peut généralement être évité.
Pubby
J'ai dû faire face à cette décision il y a quelques jours à peine. En fin de compte, c'était une évidence, car la bibliothèque standard et le boost utilisent underscore_lowercase_delimiters. Puisque j'utilise boost comme booster STL, il sera saupoudré de mon code. Les autres bibliothèques que j'utilise qui sont PascalCase (SFML) peuvent plus facilement être contenues, donc toute méthode donnée est assez standard.
Max
@ Pubby8: par curiosité: comment camelCase se heurte-t-il au préprocesseur?
Joachim Sauer
@JoachimSauer Les mots individuels dans camelCase peuvent avoir une casse différente, mais les macros ne peuvent pas changer la casse. Cela devient un problème si vous voulez une macro qui prend une partie d'un mot comme argument - vous devrez peut-être fournir les deux cas comme arguments: macro (x, X). C'est un problème assez mineur, mais devrait être connu si vous avez l'intention d'utiliser le préprocesseur.
Pubby

Réponses:

27

Y a-t-il une convention de capitalisation la plus courante que je devrais connaître?

C ++ est basé sur C, qui est assez vieux pour avoir développé tout un tas de conventions de nommage au moment où C ++ a été inventé. Ensuite, C ++ en a ajouté quelques-uns, et C n'a pas hésité à en penser de nouveaux non plus. Ajoutez à cela les nombreux langages dérivés du C, qui ont développé les conventions de nommage C de leur inventeur, au point où ils se sont fertilisés en retour sur C et C ++ ... En d'autres termes: C ++ n'en a pas, mais beaucoup de ces conventions.

Cependant, si vous recherchez la seule convention de dénomination, vous pouvez aussi bien regarder la convention de dénomination de la bibliothèque standard , car c'est la seule que tous les développeurs C ++ devront connaître et être habitués.

Quoi que vous utilisiez, la règle la plus importante est: soyez cohérent!

Fait intéressant, alors que j'ai commencé avec un mélange de PascalCase et camelCase, et que j'ai été impliqué dans de nombreux projets avec des conventions de nommage encore plus nombreuses, au fil des ans, je me suis retrouvé de plus en plus coincé avec la convention_library_convention. Ne me demandez pas pourquoi.

sbi
la source
Merci pour l'info ... donc la bibliothèque standard est soulignée, alors? (au moins plus que toute autre chose?) Je pensais dans ce sens, mais c'était un peu difficile à dire à cause de choses comme iostream dans laquelle la moitié des noms de méthode semblent être le même genre de fragments de mots en masse que ANSI C :-P
David Z
5
@David: La bibliothèque iostreams a probablement 25 ans et (à l'exception de la bibliothèque C ou du cours) pourrait être la partie la plus ancienne de la bibliothèque std C ++. Espérons que personne de bon sens ne le concevrait comme il l'est de nos jours, et j'espère que même ceux qui ne sont pas sensés ne choisiraient pas d'identifiants comme ils sont utilisés dans la bibliothèque de flux. (Allez, il y a des fonctions nommées egptr, sputnet uflowaussi bien underflow. C'est juste hilarant!) Quoi qu'il en soit, oui, la lib std utilise de nos jours all_lowercase_with_underscores.
sbi
@sbi J'ai découvert que la bibliothèque iostream n'est plus considérée comme une bibliothèque standard pour C ++. Et comme vous le mentionnez, ses identifiants ne sont pas utiles comme convention de programmation ;-)
umlcat
2
@umlcat: La bibliothèque iostreams (dans son modèle comme acceptée pour C ++ 03) est très certainement considérée comme faisant partie de la bibliothèque standard C ++.
sbi
J'ai emprunté le même chemin aussi. Je pense que la raison pour laquelle je suis est camelCase est légèrement plus facile à taper et je voulais être paresseux là-bas. Plus tard, j'ai appris que je passais plus de temps à lire et à refactoriser mon code qu'à l'écrire, et snake_case est plus facile à lire. Il s'agit donc de minimiser les dépenses énergétiques. Maintenant, je joue avec l'utilisation de minuscules pour les cours. Ce n'est pas conventionnel, mais je pense que le basculer et mettre en majuscule des instances importantes et des types en minuscules améliore en fait la lisibilité de mon code. Je pense que c'est peut-être la voie à suivre. En majuscules ce qui est important, comme en humanese.
PSkocik
19

Convenons d'abord que ALL UPPERCASE est une horreur et doit être minimisé.

En C et C ++, il est donc utilisé comme convention pour les macros, et les macros uniquement, car les macros sont tout aussi laides, pour ne pas dire mal.

Les premiers C n'avaient pas const, donc les constantes devaient être exprimées sous forme de macros. De plus, à ces débuts, les programmes étaient beaucoup plus courts, de sorte que les pratiques qui étaient mauvaises aujourd'hui pouvaient être utilisées (par exemple, l'IIRC Brian Kernighan a écrit du code avec beaucoup de macros non majuscules). Et aussi, à cette époque, les claviers qui n'avaient pas de lettres minuscules existaient; J'en ai utilisé un, sur l'ordinateur norvégien Tandberg EC-10, vers 1980 ou 1979, je crois.

Ainsi, Java a repris la convention en majuscules pour les constantes du début C. Pendant ce temps, et peut-être même avant (je ne suis pas sûr de la chronologie ici), C a obtenu des constantes. Cependant, bien que certains / nombreux programmeurs C étaient coincés dans la convention précédente par nécessité de constantes comme macros majuscules, les programmeurs C ++ étaient plus sensés.

Le gros problème de nos jours est que les gens apprennent d'abord Java ou C (avec les conventions du moyen âge), puis viennent en C ++, emportant avec eux cette fausse convention majuscule.

Donc,

    int const answer = 42;    // Nice, good, OK.
    const int ANSWER = 0x2A;  // Ouch!
    #define COMPANYNAME_ANSWER 052  // Oh kill me, please.

Eh bien, vous auriez pu penser que j'ai mentionné des claviers en majuscules uniquement pour plaisanter. Oh non. Parce qu'il s'agit simplement de la limitation technologique la plus ancienne et la plus archaïque qui a conduit aux conventions de dénomination, ou du moins affecté à quel point elles semblent fausses / correctes. Ensuite, il y a eu le problème de la transmission série 7 bits, qui a provoqué des problèmes correspondants avec les codes de caractères (encodages de caractères de newspeak) utilisés, ce qui signifiait que vous deviez vous limiter aux lettres de l'alphabet anglais, de A à Z.

En fait, je recommande de continuer à le faire. Voilà où nous en sommes! Nous ne sommes pas allés plus loin.

À l'heure actuelle, à partir de 2011, le C ++ standard prend en charge Unicode général dans les noms (et il le fait depuis 1998), contrairement aux implémentations C ++ réelles. En particulier, le compilateur g ++ a un caractère national contesté. Elle découle de cette limitation technologique des âges sombres.

Donc,

    double blueberryJamViscosity  = 0.0;    // OK
    double blåbærsyltetøyViskositet = 0.0;  // Ouch!

Enfin, au sujet des caractères de soulignement par rapport aux lettres majuscules entrecoupées,

  • Réservez un formulaire facilement reconnaissable pour les noms de type.
  • Réservez ALL UPPERCASE pour les macros.
  • Être cohérent.

Je pense que c'est vraiment, sauf pour les règles comme "généralement éviter le nom à une seule lettre sauf pour (boucle, paramètre de modèle, bla bla)" et "éviter d'utiliser l, facilement confondu avec 1" et "éviter les majuscules O, facilement confondu avec 0 ". Évitez également d'utiliser des noms réservés, comme commencer par un trait de soulignement suivi de majuscules, contenant deux traits de soulignement successifs, ou commencer par un trait de soulignement et se trouver dans l'espace de noms global.

Santé et hth

Alf P. Steinbach
la source
Alf, ISTR Stroustrup mentionnant dans D&E C la copie à constpartir de C ++, donc cela a dû se produire il y a très longtemps, et bien avant Java, probablement pour C89.
sbi
2
Oh, et sincère +1pour "Soyez cohérent!" En le lisant, je me demande pourquoi j'ai oublié de mentionner cette règle, la plus importante, dans ma réponse, alors que c'est celle que je n'ai jamais oublié de dire à mes élèves. Je suppose que vous me pardonnerez si je l'ajoute maintenant à ma réponse après coup?
sbi
2

J'ai généralement tendance à m'en tenir à la convention que je vois le plus dans les bases de code existantes pour la langue. Dans le cas de C ++, je vois généralement camelCase. Dans le cas de Ruby ou PHP, je vois généralement stuff_like_this.

De manière réaliste, cependant, la chose la plus importante est que vous choisissez une convention de style qui n'est pas totalement folle (dOnT_dO_tHiS) et que vous soyez cohérent avec elle. Faites en sorte que le style ne change pas dans le code d'un projet particulier. Si vous travaillez sur un projet existant, vous voudrez choisir le style qui existe déjà.

DeM0nFiRe
la source
1

Eh bien, il y a des systèmes hongrois qui sont vraiment communs même maintenant, mais je préfère me couper la gorge que de le recommander. Les applications en hongrois sont meilleures car ses marques annotatives sont vraiment indicatives de la sémantique, bien que je pense que c'est un peu trop vif des abréviations quand un mot court ferait l'affaire. (Pour utiliser l'exemple de cette page Wikipédia, pourquoi utiliser rwpour la ligne quand rowun seul caractère est-il plus long? Ce n'est pas comme s'il y avait une pénurie mondiale de voyelles.)

En réalité, la chose la plus importante est de suivre les conventions des personnes avec lesquelles vous travaillez . Vraiment. La plupart des conventions fonctionnent assez bien, surtout si elles sont utilisées de manière cohérente. L'incohérence est pire (encore plus que les systèmes hongrois, que je déteste). Et si vous êtes seul, utilisez ce que vous voulez.

Associés Donal
la source
1

D'après ce que j'ai vu, cela varie selon les projets.

Les traits de soulignement intégrés sont probablement plus traditionnels / plus couramment utilisés en C sur Unix. La bibliothèque standard suit également cela, donc elle devrait presque certainement être traitée comme la valeur par défaut, à utiliser à moins qu'il y ait suffisamment de code existant utilisant une autre convention pour forcer absolument à utiliser cette autre convention.

Windows (pour un exemple) utilise le cas de chameau pour la plupart de ses fonctions, donc pas mal de gens qui développent pour Windows font de même. Ceci est également assez fréquent chez les personnes qui sont vraiment plus habituées à d'autres langages et tentent de traiter le C ++ comme s'il ne s'agissait que d'une variante étrange d'autre chose.

Jerry Coffin
la source
1

J'ai utilisé à la fois la bibliothèque standard et le boost comme référence pour les conventions de nommage. Cependant, il y a un problème avec cette solution.

La bibliothèque standard utilise une convention de dénomination conçue pour tenter de réduire les collisions avec votre code. Une partie de la solution consiste à utiliser toutes les lettres minuscules. D'où l'utilisation de soulignements au lieu de camelCase.

Je trouve que camelCase est lisible. PascalCase est souvent utilisé pour les noms de classe car il représente l'équivalent d'un nom propre. Cependant, je briserai cette règle pour les foncteurs qui sont plus représentatifs d'un verbe.

J'essaie de ne pas utiliser de macros. Cependant, quand je le fais, les macros sont conçues pour ressembler à des fonctions quand elles le peuvent. J'utilise également des valeurs const ou des énumérations au lieu de constantes manifestes, ce qui évite davantage les majuscules. Je préfixe généralement ces symboles avec un «k» pour indiquer qu'ils sont constants.

// instead of a manifest constant
#define HOURS 24

// use const
const int kHours = 24; 

// or enum
enum {
    kHours   = 24,
    kMinutes = 60
};
Bill Door
la source
0

Cette référence décrit une convention de dénomination qui est assez similaire à celles que j'ai vues utilisées avec succès dans au moins trois entreprises pour lesquelles j'ai travaillé dans le passé.

Contrairement à une réponse antérieure, j'éviterais de suivre la convention de dénomination de la bibliothèque standard C ++ dans mon propre code, ne serait-ce que pour éviter les collisions de noms avec la bibliothèque standard.

Cette réponse SO précédente sur un sujet connexe peut également être intéressante: /programming/228783/what-are-the-rules-about-using-an-underscore-in-ac-identifier

Gnawme
la source
Umm, vous pouvez utiliser la même convention de dénomination sans utiliser les mêmes noms ... et si vous voulez vraiment les mêmes noms, vous êtes toujours protégé par les espaces de noms, par exemple std::stringcontre gnawme::string.
einpoklum