Google Style Guide en C ++. Partie 9

Partie 1. Introduction
...
Partie 8. DĂ©nomination
Partie 9. Commentaires
...


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 .

Commentaires


Des commentaires sont requis pour le code (si vous prĂ©voyez de le lire). Les rĂšgles suivantes dĂ©crivent ce que vous devez commenter et comment. Mais rappelez-vous: bien que les commentaires soient trĂšs importants, le code parfait est auto-documentĂ©. L'utilisation de noms "parlants" pour les types et les variables est bien meilleure que les noms obscurs, qui doivent ensuite ĂȘtre Ă©crits dans les commentaires.

Commentez le code en tenant compte de ses lecteurs suivants: des programmeurs qui ont besoin de comprendre votre code. Gardez Ă  l'esprit que vous pouvez ĂȘtre le prochain lecteur!

Style de commentaire


Utilisez // ou / * * / jusqu'à ce que l'uniformité soit violée.

Vous pouvez utiliser // ou / ** / , cependant // est de loin préférable. Cependant, alignez toujours votre style de commentaire sur le code existant.

Commentaires dans l'en-tĂȘte du fichier


InsĂ©rez un en-tĂȘte de licence en haut de chaque fichier.

Les commentaires dans le fichier doivent dĂ©crire son contenu. Si un fichier dĂ©clare, dĂ©crit ou teste une abstraction (pour laquelle il existe dĂ©jĂ  un commentaire), une description supplĂ©mentaire dans l'en-tĂȘte du fichier n'est pas nĂ©cessaire. Sinon, insĂ©rez une description du contenu en haut du fichier.

Informations légales et liste des auteurs


Chaque fichier doit contenir des informations de licence. Le format de la description dépend de la licence utilisée dans le projet. Chaque licence (Apache 2.0, BSD, LGPL, GPL, etc.) peut avoir ses propres exigences de conception.

Si vous apportez des modifications importantes au fichier, pensez à supprimer la liste précédente des auteurs. Les fichiers mis à jour ne peuvent plus contenir de mention du droit d'auteur et une liste d'auteurs.

Contenu du fichier


Si .h dĂ©clare plusieurs abstractions, le commentaire dans l'en-tĂȘte du fichier doit gĂ©nĂ©ralement dĂ©crire le contenu du fichier et comment les abstractions sont liĂ©es les unes aux autres. Une, deux phrases dans un commentaire suffisent gĂ©nĂ©ralement. Des informations plus dĂ©taillĂ©es sont signĂ©es ailleurs (pas dans l'en-tĂȘte du fichier).

Ne dupliquez pas les commentaires dans les fichiers .h et .cc - les commentaires deviennent différents au fil du temps.

Commentaires de classe


Chaque dĂ©claration de classe (Ă  l'exception des dĂ©clarations trĂšs Ă©videntes) doit ĂȘtre accompagnĂ©e d'un commentaire, Ă  quoi sert la classe et comment l'utiliser.

//   GargantuanTable. // : // GargantuanTableIterator* iter = table->NewIterator(); // for (iter->Seek("foo"); !iter->done(); iter->Next()) { // process(iter->key(), iter->value()); // } // delete iter; class GargantuanTableIterator { ... }; 

Le commentaire sur la classe doit ĂȘtre suffisant pour comprendre: comment et quand utiliser la classe, des exigences supplĂ©mentaires pour une utilisation correcte de la classe. DĂ©crivez, si nĂ©cessaire, les restrictions (hypothĂšses) sur la synchronisation dans la classe. Si une instance de la classe peut ĂȘtre utilisĂ©e Ă  partir de diffĂ©rents threads, assurez-vous de noter les rĂšgles multi-thread.

Vous pouvez Ă©galement fournir de courts exemples de code dans le commentaire de la classe pour montrer Ă  quel point il est plus facile d'utiliser la classe.

En rĂšgle gĂ©nĂ©rale, une classe est dĂ©clarĂ©e / dĂ©finie dans diffĂ©rents fichiers ( .h et .cc ). Les commentaires dĂ©crivant l'utilisation de la classe doivent ĂȘtre Ă  cĂŽtĂ© de la dĂ©finition de l'interface. Les commentaires sur les subtilitĂ©s de l'implĂ©mentation doivent ĂȘtre proches du code des mĂ©thodes elles-mĂȘmes.

Commentaires sur la fonction


Les commentaires sur une déclaration de fonction doivent décrire l'utilisation de la fonction (sauf dans les cas les plus évidents). Les commentaires sur la définition de la fonction décrivent l'implémentation.

DĂ©claration de fonction


La dĂ©claration de chaque fonction doit avoir un commentaire (juste avant la dĂ©claration), ce que fait la fonction et comment l'utiliser. Un commentaire ne peut ĂȘtre omis que si la fonction est simple et son utilisation Ă©vidente (par exemple, la fonction de soustraction de valeurs de variable). Essayez de commencer les commentaires Ă  titre indicatif («Ouvrir le fichier»). L'utilisation de l'humeur impĂ©rative («Ouvrir un fichier») n'est pas recommandĂ©e. Un commentaire dĂ©crit l'essence d'une fonction, pas comment elle le fait.

Dans le commentaire sur la déclaration de fonction, notez ce qui suit:

  • Ce qui est envoyĂ© Ă  l'entrĂ©e de la fonction, qui est retournĂ© en consĂ©quence.
  • Pour une fonction membre d'une classe: l'instance conserve-t-elle des arguments de rĂ©fĂ©rence,
    Dois-je libérer de la mémoire?
  • La fonction alloue-t-elle la mĂ©moire que le code appelant doit supprimer.
  • Peut-il y avoir des arguments nullptr.
  • La complexitĂ© de la fonction (algorithmique).
  • Les appels provenant de diffĂ©rents threads sont-ils autorisĂ©s en mĂȘme temps? Et la synchronisation?

Un exemple:

 //    .    //   .    //    GargantuanTable  . // //      . // //    : // Iterator* iter = table->NewIterator(); // iter->Seek(""); // return iter; //         , //    NewIterator()     . Iterator* GetIterator() const; 

Cependant, ne mĂąchez pas les choses Ă©videntes.

Lorsque vous documentez des fonctions surchargées, effectuez les principaux changements tenaces par rapport à la fonction d'origine. Et s'il n'y a pas de changement (ce qui arrive souvent), des commentaires supplémentaires ne sont pas du tout nécessaires.

Lorsque vous commentez des constructeurs et des destructeurs, gardez à l'esprit que le lecteur de code connaßt leur objectif. Par conséquent, le commentaire du type "détruit cet objet" est stupide. Vous pouvez décrire ce que le constructeur fait avec les arguments (par exemple, changer la propriété des pointeurs) ou quel type d'opérations de nettoyage le destructeur fait. Si tout est clair, ne commentez rien. En général, les destructeurs n'ont généralement aucun commentaire (lorsqu'ils sont déclarés).

DĂ©finition de fonction


S'il y a des astuces dans l'implémentation de la fonction, vous pouvez ajouter un commentaire explicatif à la définition. Vous pouvez y décrire des astuces avec le code, donner un aperçu de toutes les étapes des calculs, expliquer le choix de telle ou telle implémentation (surtout s'il existe de meilleures alternatives). Vous pouvez décrire les principes de la synchronisation du code (ici nous bloquons, mais ici nous emballons le poisson).

Notez que vous ne devez pas rĂ©pĂ©ter le commentaire sur la dĂ©claration de la fonction (Ă  partir d'un fichier .h ou similaire). Il est possible de dĂ©crire briĂšvement ce que fait la fonction, mais l'essentiel devrait ĂȘtre comment elle le fait.

Commentaires sur les variables


Dans le bon sens, le nom de la variable devrait immédiatement dire de quoi il s'agit et pourquoi, mais dans certains cas, des commentaires supplémentaires sont nécessaires.

Membre de données de classe


Le but de chaque membre de la classe doit ĂȘtre Ă©vident. S'il y a des subtilitĂ©s non Ă©videntes (significations spĂ©ciales, liens avec d'autres membres, restrictions sur la durĂ©e de vie) - tout cela doit ĂȘtre commentĂ©. Cependant, si le type et le nom sont suffisants - vous n'avez pas besoin d'ajouter de commentaires.

En revanche, des descriptions de valeurs spéciales (et non évidentes) (nullptr ou -1) seront utiles. Par exemple:

 private: //       // -1 - ,         int num_total_entries_; 

Variables globales


Toutes les variables globales doivent ĂȘtre commentĂ©es sur leur objectif et (si elles ne sont pas Ă©videntes) pourquoi elles doivent ĂȘtre globales. Par exemple:

 //   ,     const int kNumTestCases = 6; 

Commentaires sur la mise en Ɠuvre


Commentez l'implémentation d'une fonction ou d'un algorithme dans le cas de morceaux de code non évidents, intéressants et importants.

Commentaires descriptifs


Les blocs de code complexes ou non standard doivent ĂȘtre prĂ©cĂ©dĂ©s d'un commentaire. Par exemple:

 //    2.  x    for (int i = 0; i < result->size(); ++i) { x = (x << 8) + (*result)[i]; (*result)[i] = x >> 1; x &= 1; } 

Commentaires de ligne


Il est conseillĂ© de complĂ©ter les lignes de code avec une signification non Ă©vidente par un commentaire (gĂ©nĂ©ralement situĂ© Ă  la fin de la ligne) Ce commentaire doit ĂȘtre sĂ©parĂ© du code par 2 espaces. Par exemple:

 //   ,    mmap_budget = max<int64>(0, mmap_budget - index_->length()); if (mmap_budget >= data_size_ && !MmapData(mmap_chunk_bytes, mlock)) return; //    

Notez qu'il y a 2 commentaires sur le bloc de code: l'un décrit ce que fait le code, l'autre rappelle que l'erreur est déjà dans le journal s'il y a un retour de la fonction.

Commentaires sur les arguments de fonction


Lorsque l'affectation d'un argument Ă  une fonction n'est pas Ă©vidente, envisagez les options suivantes:

  • Si l'argument est une valeur fixe (constante littĂ©rale) et cette valeur
    utilisĂ© dans diffĂ©rents blocs de code (et il est entendu que cette valeur est la mĂȘme chose)
    vous devez créer une constante et l'utiliser explicitement.
  • Vous devriez peut-ĂȘtre remplacer l'argument de type bool par
    énumération énumération. Cela rendra l'argument autodéterminé.
  • Pour les fonctions qui utilisent plusieurs options de configuration dans les arguments, vous pouvez
    créer une classe (ou structure) distincte qui combine toutes les options. Et passer à fonctionner
    une instance de cette classe.
    Cette approche présente plusieurs avantages: les options sont indiquées par des noms, ce qui explique
    leur but. Le nombre d'arguments dans la fonction est réduit - le code est plus facile à écrire et à lire.
    Et si vous devez ajouter plus d'options, vous n'aurez pas Ă  modifier l'appel de fonction lui-mĂȘme.
  • Au lieu d'expressions complexes dans les arguments, utilisez une variable intermĂ©diaire Ă  laquelle vous affectez une expression.
  • En dernier recours, Ă©crivez des commentaires Ă  l'endroit de l'appel pour clarifier le but des arguments.

Considérez les exemples suivants:

 //    ? const DecimalNumber product = CalculateProduct(values, 7, false, nullptr); 

Essayons de peigner le code:

 ProductOptions options; options.set_precision_decimals(7); options.set_use_cache(ProductOptions::kDontUseCache); const DecimalNumber product = CalculateProduct(values, options, /*completion_callback=*/nullptr); 

Que ne pas faire


N'expliquez pas l'Ă©vidence. En particulier, il n'est pas nĂ©cessaire d'expliquer des choses qui sont Ă©videntes pour une personne qui connaĂźt le C ++. Au lieu de cela, vous pouvez dĂ©crire pourquoi ce code le fait (ou mĂȘme rendre le code auto-descriptif).

Comparez:

 //    . <-- :  ! auto iter = std::find(v.begin(), v.end(), element); if (iter != v.end()) { Process(element); } 

Avec ceci:

 //  (Process) "element"     auto iter = std::find(v.begin(), v.end(), element); if (iter != v.end()) { Process(element); } 

Le code auto-descriptif ne nécessite aucun commentaire.
Le commentaire sur le code ci-dessus peut ĂȘtre gĂ©nĂ©ralement Ă©vident (et non nĂ©cessaire):

 if (!IsAlreadyProcessed(element)) { Process(element); } 

Ponctuation, orthographe et grammaire


Faites attention Ă  la ponctuation, l'orthographe et la grammaire: il est beaucoup plus facile de lire des commentaires correctement Ă©crits.

Les commentaires doivent ĂȘtre Ă©crits comme une histoire: avec la disposition correcte des majuscules et des signes de ponctuation. Dans la plupart des cas, des phrases complĂštes sont plus faciles Ă  comprendre que des fragments de phrases. Les commentaires courts, tels que ligne par ligne, peuvent ĂȘtre moins formels, mais devraient toujours suivre un style commun.

Bien que l'accent mis par le rĂ©viseur de code sur l'utilisation de virgules au lieu de points-virgules puisse ĂȘtre lĂ©gĂšrement ennuyeux, il est important de maintenir un niveau Ă©levĂ© de lisibilitĂ© et de comprĂ©hensibilitĂ©. Une ponctuation, une orthographe et une grammaire appropriĂ©es y contribuent grandement.

Commentaires TODO


Utilisez les commentaires TODO pour un code temporaire ou une solution suffisamment bonne (intermédiaire, pas parfaite).

Le commentaire doit inclure la ligne TODO (toutes les majuscules), suivie du nom, de l'adresse e-mail, de l'ID du défaut ou d'autres informations pour identifier le développeur et la nature du problÚme pour lequel TODO est écrit. Le but de cette description est de pouvoir trouver plus de détails plus tard. TODO avec description ne signifie pas que le programmeur spécifié résoudra le problÚme. Par conséquent, lorsque vous créez TODO , le nom usuel est votre nom.

 // TODO(kl@gmail.com):  "*"  . // TODO(Zeke)   . // TODO(bug 12345):   " ". 

Si votre TODO ressemble Ă  «Faisons-le diffĂ©remment Ă  l'avenir», indiquez soit une date spĂ©cifique («Corriger en novembre 2005») ou un Ă©vĂ©nement («Supprimer ce code lorsque tous les clients traiteront les requĂȘtes XML»).

Remarque:
- Les liens peuvent conduire à des sections du manuel qui n'ont pas encore été traduites.
- une discussion des questions générales est mieux faite dans la partie 1. Introduction

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


All Articles