Google C++コード仕様——2.命名規則

6815 ワード

Google C++Style Guide
引用:符号化仕様では、コードの命名規則が最も統一される必要がある.例えば、プロジェクトグループや実験室で一緒にプロジェクトを開発したり、コードを読みやすくしたり、チームの協力を容易にしたりする統一的な命名規則があります.
命名規則
最も重要なコンシステンシルールはネーミングルールであり、ネーミングスタイルからクラス、変数、関数、定数、マクロなどを直接見ることができます.宣言を検索する必要はありません.脳のモードマッチングエンジンは、これらの命名規則に非常に依存しています.ネーミングは自由ですが、個人の好みよりも一貫性が重要です.だから合理的かどうかにかかわらず、ルールはルールです.
一般的な命名規則
名前には記述性があり、略語を避ける必要があります.
可能な限り記述的な名前を付け、理由を説明します.より重要なのは符号化の可読性であるため、空間を占有する心配はありません.項目外の人に分からない略語を使わないでください.単語のアルファベットを削除して略語をしないでください.仕様の名前:
int price_count_reader;    //     
int num_errors;            // "num"       
int num_dns_connections;   //         "DNS"    

不正な名前:
int n;                     //     
int nerr;                  //      
int n_comp_conns;          //      
int wgc_connections;       //               
int pc_reader;             //         "pc"
int cstmr_id;              //        

なお、いくつかの一般的な略語は、iを反復変数、Tをテンプレートパラメータとして用いることができる.テンプレートパラメータは、そのプロパティの命名規則に従う必要があります.タイプテンプレートパラメータはタイプ命名規則に従うべきで、非タイプテンプレートパラメータは変数命名規則に従うべきです.
ファイル名
ファイル名をすべて小文字にするには、下線()を含めることができます.または短線(-)、プロジェクトの約束に従います.約束がなければ、一般的に使う傾向があります().
仕様の名前:
  • my_useful_class.cc
  • my-useful-class.cc
  • myusefulclass.cc
  • myusefulclass_test.cc//_unittest and _regtest are deprecated. C++ソースファイルは.ccの最後に、ヘッダファイルは.hエンディング.ヘッダファイルではないが含まれるべきものは.incエンディング.dbなどの/usr/includeにすでに存在するファイルは使用しないでください.h.(linux or unixシステム)一般的に、ファイル名は具体的であるべきです.たとえばhttp_を使用server_logs.logsではなくhh. 例えばfoo_bar.hとfoo_bar.ccのファイルで、FooBarというクラスを定義します.インライン関数は.hファイルにあります.もしあなたのインライン関数が短いなら、彼らは直接あなたのものに入るべきです.hファイル.(長い場合は別の-inl.hを使用)
  • タイプ名
    タイプ名は大文字で始まるべきで、各単語の先頭には大文字で下線はありません.例:MyExcitingClass,MyExcitingEnum.すべてのタイプのネーミング(クラス、構造、タイプ別名、列挙、タイプテンプレートパラメータ)には、同じネーミング規則があります.例:
    // classes and structs
    class UrlTable { ...
    class UrlTableTester { ...
    struct UrlTableProperties { ...
    
    // typedefs
    typedef hash_map PropertiesMap;
    
    // using aliases
    using PropertiesMap = hash_map;
    
    // enums
    enum UrlTableErrors { ...

    変数の名前付け
    変数(関数パラメータを含む)とデータ・メンバーの名前は小文字で、字の間に下線が引かれています.クラス(構造体ではない)のデータメンバーには、末尾の下線が必要です.例:a_local_variable,a_struct_data_member,a_class_data_member_.
    一般変数名:規則の書き方:
    string table_name;  // OK - uses underscore.
    string tablename;   // OK - all lowercase.

    非規範的な書き方:
    string tableName;   // Bad - mixed case.

    クラスメンバー変数
    クラスのデータ・メンバーは、静的および非静的にかかわらず、通常の非メンバー変数のように名前が付けられますが、末尾の下線が付いています.
    class TableInfo {
      ...
     private:
      string table_name_;  // OK - underscore at end.
      string tablename_;   // OK.
      static Pool* pool_;  // OK.
    };

    *構造体データメンバー*
    構造体のデータ・メンバー(静的および非静的)は、通常の非メンバー変数のように名前が付けられます.クラス内のデータ・メンバーの末尾下線はありません.
    定数ネーミング
    変数はconstexprまたはconstとして宣言され、その値はプログラムの持続時間内に固定され、プリアンブル「k」の後に混合大文字と小文字で命名される.例:
    const int kDaysInAWeek = 7;

    静的ストレージ持続時間を持つこれらのすべての変数(すなわち、静的およびグローバル変数)は、このように命名されるべきである.このルールは、他のストレージクラスの変数に対してオプションです.たとえばautoタイプ変数です.それ以外に、通常の変数名にはこのルールが使用されます.
    関数の名前付け
    通常の関数の名前には固定フォーマットがあり、アクセス関数は変数に対応する必要があります.
    通常、関数は大文字で始まり、「Camel Case」や「Pascal case」などの新しい単語ごとに大文字を使用します.下線はありません.一般に、大文字の頭文字略語は、StartRPC()ではなく、StartRpc()として単一の文字として使用されます.
    AddTableEntry()
    DeleteUrl()
    OpenFileOrDie()

    アクセス関数は、対応する変数に対応する必要があります.一般にクラスメンバー変数に対応します.ただし、int count()やvoid set_などは必須ではありません.count(int count).
    ネーミングスペースのネーミング
    ネーミングスペース名は小文字です.トップネームスペース名は、プロジェクト名に基づいています.ネストされたネーミングスペースと有名なトップネーミングスペースとの衝突を回避します.
    トップ・ネームスペースの名前は、通常、そのネームスペースに含まれるプロジェクトまたはチームの名前でなければなりません.このネーミングスペースのコードが存在するディレクトリ(またはそのサブディレクトリ)名は、ネーミングスペース名と一致する必要があります.変数名のように、名前を略すルールはネーミングスペースに適用されます.ネーミングスペースのコードはネーミングスペース名に言及する必要は少ないので、通常は省略は必要ありません.ネストされたネーミングスペースと有名なトップクラスのネーミングスペースの競合を回避します.名前検索ルールのため、ネーミングスペース名間の競合により、予期せぬ構築が中断される可能性があります.特に、ネストされたstdネーミングスペースは作成しないでください.名前の競合(websearch::index、websearch::index_util)では、一意のプロジェクト識別子(websearch::utilなど)が優先されます.内部ネーミングスペースの場合は、同じ内部ネーミングスペースに他のコード(チーム内の内部メンバー)が追加されると競合する可能性があることに注意してください.この場合、ファイル名を使用して一意の内部名を作成します(websearch::index::frobber_internalはfrobber.hに使用されます).
    列挙名
    列挙(scopedおよび非scoped列挙の場合)は、定数またはマクロのように名前を付ける必要があります:kEnumNameまたはENUM_NAME.
    列挙タイプは定数のように優先的に命名されます.ただし、マクロのように名前を付けることもできます.列挙名UrlTableErrors(およびAlternateUrlTableErrors)はタイプなので、大文字と小文字を混合します.
    enum UrlTableErrors {
      kOK = 0,
      kErrorOutOfMemory,
      kErrorMalformedInput,
    };
    enum AlternateUrlTableErrors {
      OK = 0,
      OUT_OF_MEMORY = 1,
      MALFORMED_INPUT = 2,
    };

    マクロの名前付け
    マクロを使う傾向は一般的ではありませんよね?使うなら、このように:MY_MACRO_THAT_SCARES_SMALL_CHILDREN
    一般的にマクロを使用するべきではありません.ただし、必要に応じて、大文字と下線で名前を付ける必要があります.
    #define ROUND(x) ...
    #define PI_ROUNDED 3.0

    命名規則の例外
    名前を付けるオブジェクトが既存のCまたはC++エンティティと似ている場合は、既存の名前規則スキームに従うことができます.bigopen()   function name, follows form of open() uint   typedef bigpos   struct or class, follows form of pos sparse_hash_map   STL-like entity; follows STL naming conventions LONGLONG_MAX   a constant, as in INT_MAX