Google Style Guide en C ++. Partie 8

Partie 1. Introduction
...
Partie 8. Dénomination
Partie 9. Commentaires
...



Lors de l'écriture de code, nous utilisons tous les règles de conception du code. Parfois, leurs propres règles sont inventées, dans d'autres cas, des guides de style prêts à l'emploi sont utilisés. Bien que tous les programmeurs C ++ lisent plus facilement en anglais que dans leur langue maternelle, il est plus agréable d'avoir un manuel dans cette dernière.
Cet article est une traduction d'une partie du guide de style Google en C ++ en russe.
Article original (fork sur github), traduction mise à jour .

Nommer


Les règles de base pour le style de codage sont la dénomination. L'apparition immédiate du nom (sans rechercher d'annonce) nous dit de quoi il s'agit: type, variable, fonction, constante, macro, etc. Les règles de dénomination peuvent être arbitraires, mais la cohérence est importante et les règles doivent être suivies.

Principes généraux de dénomination


  • Utilisez des noms que même les membres de l'autre équipe comprendront.
  • Le nom doit parler du but ou de l'applicabilité de l'objet.
  • N'économisez pas sur la longueur du nom, il vaut mieux avoir un nom plus long et plus compréhensible (même pour les débutants).
  • Moins d'abréviations, surtout si elles ne sont pas familières en dehors du projet.
  • N'utilisez que des abréviations connues (Wikipedia les connaît-il?).
  • Ne raccourcissez pas les mots.

En général, la longueur du nom doit correspondre à la taille de la portée. Par exemple, n est un nom approprié dans une fonction de 5 lignes, cependant, lorsque vous décrivez une classe, cela peut être un peu court.

class MyClass { public: int CountFooErrors(const std::vector<Foo>& foos) { int n = 0; //       for (const auto& foo : foos) { ... ++n; } return n; } void DoSomethingImportant() { std::string fqdn = ...; //      } private: const int kMaxAllowedConnections = ...; //     }; 

 class MyClass { public: int CountFooErrors(const std::vector<Foo>& foos) { int total_number_of_foo_errors = 0; //       for (int foo_index = 0; foo_index < foos.size(); ++foo_index) { //   `i` ... ++total_number_of_foo_errors; } return total_number_of_foo_errors; } void DoSomethingImportant() { int cstmr_id = ...; //   ( ) } private: const int kNum = ...; //       }; 

Notez que les noms typiques sont également valides: i pour un itérateur ou un compteur, T pour un paramètre de modèle.

À l'avenir, lors de la description des règles, «mot» / «mot» est tout ce qui est écrit en anglais sans espaces, y compris les abréviations. En un mot, la première lettre peut être mise en majuscule (selon le style: " camel case " ou "Pascal case"), les lettres restantes sont en minuscules. Par exemple, de préférence StartRpc () , de préférence StartRPC () .

Les paramètres des modèles suivent également les règles de leurs catégories: noms de types, noms de variables, etc.

Noms de fichiers


Les noms de fichiers doivent être écrits uniquement en lettres minuscules, vous pouvez utiliser un trait de soulignement ( _ ) ou un trait d'union ( - ) pour les séparer. Utilisez le séparateur utilisé dans le projet. S'il n'y a pas d'approche unique, utilisez "_".

Exemples de noms appropriés:

  • my_useful_class.cc
  • my-useful-class.cc
  • myusefulclass.cc
  • myusefulclass_test.cc // _unittest et _regtest sont déconseillés.

Les fichiers C ++ doivent se terminer par .cc , l'en-tête doit être en
.h . Les fichiers inclus en tant que texte doivent se terminer par .inc (voir également la section En- têtes indépendants ).

N'utilisez pas de noms qui existent déjà dans / usr / include , tels que db.h.

Essayez de donner des noms spécifiques aux fichiers. Par exemple, http_server_logs.h est meilleur que logs.h. Lorsque les fichiers sont utilisés par paires, il est préférable de leur donner le même nom. Par exemple, foo_bar.h et foo_bar.cc (et contiennent la classe FooBar ).

Noms des types


Les noms de type commencent par une majuscule, chaque nouveau mot commence également par une majuscule. Les traits de soulignement ne sont pas utilisés: MyExcitingClass , MyExcitingEnum .

Les noms de tous types - classes, structures, alias, énumérations, paramètres de modèle - sont nommés dans le même style. Les noms de type commencent par une majuscule, chaque nouveau mot commence également par une majuscule. Les tirets bas ne sont pas utilisés. Par exemple:

 // classes and structs class UrlTable { ... class UrlTableTester { ... struct UrlTableProperties { ... // typedefs typedef hash_map<UrlTableProperties *, std::string> PropertiesMap; // using aliases using PropertiesMap = hash_map<UrlTableProperties *, std::string>; // enums enum UrlTableErrors { ... 

Noms de variables


Les noms des variables (y compris les paramètres de fonction) et des membres de données sont écrits en lettres minuscules avec un trait de soulignement entre les mots. Les membres de ces classes (et non les structures) sont complétés par un trait de soulignement à la fin du nom. Par exemple: a_local_variable , a_struct_data_member , a_class_data_member_ .

Noms de variable communs


Par exemple:

 std::string table_name; // OK -     

 std::string tableName; //  -   

Membres de données de classe


Les membres de ces classes, statiques et non statiques, sont appelés variables ordinaires avec l'ajout d'un trait de soulignement à la fin.

 class TableInfo { ... private: std::string table_name_; // OK -    static Pool<TableInfo>* pool_; // OK. }; 

Structurer les membres de données


Les membres des données de structure, statiques et non statiques, sont appelés variables régulières. Aucun trait de soulignement ne leur est ajouté à la fin.

 struct UrlTableProperties { std::string name; int num_entries; static Pool<UrlTableProperties>* pool; }; 

Voir aussi Structures vs Classes , qui décrit quand utiliser les structures, quand les classes.

Noms des constantes


Les objets sont déclarés constexpr ou const, de sorte que la valeur ne change pas pendant l'exécution. Les noms des constantes commencent par le symbole "k", puis vient le nom dans un style mixte (lettres majuscules et minuscules). Le soulignement peut être utilisé dans de rares cas où les lettres majuscules ne peuvent pas être utilisées pour la séparation. Par exemple:

 const int kDaysInAWeek = 7; const int kAndroid8_0_0 = 24; // Android 8.0.0 

Tous les objets constants similaires avec un type de stockage statique (c'est-à-dire statique ou global, pour plus de détails ici: Durée de stockage ) sont également nommés. Cette convention est facultative pour les variables d'autres types de stockage (par exemple, les objets constants automatiques).

Noms des fonctions


Les fonctions communes sont nommées dans un style mixte (majuscules et minuscules); les fonctions d'accès aux variables (accesseur et mutateur) doivent avoir un style similaire à la variable cible.

En règle générale, un nom de fonction commence par une lettre majuscule et chaque mot du nom est mis en majuscule.

 void AddTableEntry(); void DeleteUrl(); void OpenFileOrDie(); 

(Des règles similaires s'appliquent aux constantes dans une zone de classe ou d'espace de noms qui font partie de l'API et doivent ressembler à des fonctions (et le fait qu'elles ne soient pas des fonctions n'est pas critique))

Les accesseurs et les mutateurs (fonctions get et set) peuvent être nommés comme les variables correspondantes. Ils correspondent souvent à de vraies variables membres, mais ce n'est pas nécessaire. Par exemple, int count () et void set_count (int count) .

Espace de noms Espace de noms


L'espace de noms est appelé en minuscules. L'espace de noms de niveau supérieur est basé sur le nom du projet. Évitez les collisions de vos noms et d'autres espaces de noms bien connus.

Un espace de noms de niveau supérieur est généralement le nom d'un projet ou d'une équipe (qui a créé le code). Le code doit être situé dans un répertoire (ou sous-répertoire) avec un nom correspondant à l'espace de noms.

N'oubliez pas la règle de ne pas utiliser d'abréviations - cela s'applique également aux espaces de noms. Il est peu probable que le code à l'intérieur nécessite une référence d'espace de noms, les abréviations sont donc superflues.

Évitez d'utiliser des noms connus pour les espaces de noms imbriqués. Les collisions entre noms peuvent créer des surprises lors de l'assemblage. En particulier, ne créez pas d'espaces de noms imbriqués nommés std . Des identifiants de projet uniques ( websearch :: index , websearch :: index_util ) sont recommandés au lieu d'être dangereux contre les collisions websearch :: util .

Pour les espaces de noms internes / internes , des collisions peuvent se produire lorsqu'un autre code est ajouté (les assistants internes ont tendance à se répéter sur différentes équipes). Dans ce cas, l'utilisation d'un nom de fichier pour nommer un espace de noms aide beaucoup. ( websearch :: index :: frobber_internal à utiliser dans frobber.h )

Noms d'énumération


Les énumérations (à la fois avec des contraintes de portée et sans contraintes de portée) doivent être appelées constantes ou macros . C'est-à-dire: kEnumName ou ENUM_NAME .

Il est préférable de nommer les valeurs individuelles de l'énumérateur sous forme de constantes. Cependant, il est permis de se référer à des macros. Le nom de l' énumération UrlTableErrors (et AlternateUrlTableErrors ) lui - même est un type. Par conséquent, un style mixte est utilisé.

 enum UrlTableErrors { kOk = 0, kErrorOutOfMemory, kErrorMalformedInput, }; enum AlternateUrlTableErrors { OK = 0, OUT_OF_MEMORY = 1, MALFORMED_INPUT = 2, }; 

Jusqu'en janvier 2009, le style de dénomination des valeurs d'énumération était semblable à celui des macros. Cela a créé des problèmes avec les noms de macro et les valeurs d'énumération en double. L'application d'un style constant résout le problème et il est préférable d'utiliser un style constant dans le nouveau code. Cependant, il n'est pas nécessaire de réécrire l'ancien code (tant qu'il n'y a pas de problème de duplication).

Noms de macro


Tu ne vas pas définir des macros ? Juste au cas où (si vous y allez), ils devraient ressembler à ceci:
MY_MACRO_THAT_SCARES_SMALL_CHILDREN_AND_ADULTS_ALIKE .

Veuillez lire comment définir des macros ; Normalement, les macros ne doivent pas être utilisées. Cependant, si vous en avez absolument besoin, nommez-les en majuscules avec des traits de soulignement.

 #define ROUND(x) ... #define PI_ROUNDED 3.0 

Exceptions de dénomination


Si vous devez nommer quelque chose qui a des analogues dans le code C ou C ++ existant, suivez le style utilisé dans le code.

bigopen ()
nom de fonction dérivé de open ()

uint
définition similaire aux types standard

bigpos
struct ou classe dérivée de pos

sparse_hash_map
Entité de type STL; suivre le style stl

LONGLONG_MAX
constante comme INT_MAX

Remarque: Les liens peuvent conduire à des sections du manuel qui n'ont pas encore été traduites.

Source: https://habr.com/ru/post/fr477722/


All Articles