スタイルガイド

コーディングスタイル



基本

  • ヘッダファイルの拡張子は「.hpp」。
  • すべてのヘッダファイルにインクルードガードを記述する。
    • #ifdef __PROJECT_PATH_FILE_H__
      #define__PROJECT_PATH_FILE_H__
      ...
      #endif // __PROJECT_PATH_FILE_H__
  • 関数はできるだけ短く。
    • 1画面に収まるように。
    • 初期化メソッドは例外。
  • 変数名は分かりやすくする。
    • 長くなっても構わない。
    • ハンガリアン記法は禁止する。(特に型を表すものなど)
      • クラスのフィールドを表すm_は例外。
        (フィールドは基本的にprivateであり、パラメータとかぶる可能性が高いため)
  • 名前空間の階層とフォルダの階層を一致させる。

表示

  • 1行を80文字以内に収める。
  • インデントにはタブではなくスペースを使用する。
    • 統一されていればインデント幅はスペース2個でも4個でもよい。
    • 名前空間にはインデントを適用しない。
  • クラスのメンバは基本的にpublic、protected、privateの順に定義する。
  • コメントはDoxygenに準拠させる。(コメントスタイル参照)

デザイン

  • スマートポインタを使用する。
    • deleteを記述しない設計を心がける。
    • boost::scoped_ptr : 所有権の移動を許可しない。
    • boost::shared_ptr : 所有権の移動を許可する。
    • boost::weak_ptr : 所有権の(一時的)コピーを許可する。
  • デフォルト引数は使用しない。
  • Cスタイルのキャストは使用しない。
  • マクロはなるべく使わない。
    • マクロ定数の代わりにconst変数を使用。
    • マクロ関数の代わりにインライン関数を使用。
  • コピーを想定しないクラスはboost::noncopyable をprivate継承する。
  • コピーコンストラクタ、仮想デストラクタ、代入演算子のいずれかを
    明示的に定義する場合は、可能なら残りの二つも明示的に定義する。
  • 安易な多重継承を避ける。
    • インターフェースクラス(フィールドを持たず、純粋仮想関数のみから成るクラス)の多重継承は可。
  • 純粋仮想デストラクタには定義を用意する。
  • 仮想関数、もしくは純粋仮想関数を持つクラスには必ず1つ以上の非インライン関数を持たせる。(vtblを確実に作るため)

テクニック

  • クラスの静的フィールドの使用を避ける。
    • グローバル変数と同様、使用しない場合もメモリを消費してしまう。
    • 静的変数を返す静的メソッドで解決できる。





コメントスタイル

基本

  • 基本的には C++スタイルのコメント( // )を使用する。
  • コメント量が多くなりすぎないように心がける(UML等で補足する)。下記は前提であり、ルールによって可読性低下が伴うと判断した場合はこの限りではない。
    • コメントレベルをアスタリスクの数で表現する(1 ~)
      • コメントレベルが高いほど注目度が高い
  • Doxygen の使用を前提としたコメントにする。
    • ソースに残すだけのコメントには // を、ドキュメント化したいコメントには /// を使用する。

ケース

  • ユーザ型定義 ()
    • コメントレベル:4
    • 対象:ヘッダ
    • 位置:クラス、クラステンプレート、構造体 定義上部
    • 内容:機能、目的、関連クラス

  • パブリックメンバ宣言 ()
    • コメントレベル:3
    • 対象:ヘッダ
    • 位置:各関数プロトタイプ上部
    • 内容:処理概要、状態遷移、引数、戻り値、(例外は含めない)

  • プライベートメンバ宣言 ()
    • コメントレベル:2
    • 対象:定義が記述されたファイル(主にソースファイル)
    • 位置:関数定義開始位置上部
    • 内容:処理概要、状態遷移、引数、戻り値、(例外は含めない)

  • ローカル変数宣言(ループパラメータ、イテレータなどはコメントなし)
    • コメントレベル:2
    • 位置:宣言と同一行(ラインコメント)
    • 内容:意味、場合によっては値域など

  • ループブロック(多重ループの場合最も外側のループ)
    • コメントレベル:2以上
    • 位置:ループ開始位置上部
    • 内容:処理内容(主目的)

  • リターンブロック
    • コメントレベル:1
    • 内容:意味(特殊ケースのみ)

  • 例外発生ブロック
    • コメントレベル:1
    • 位置:例外スローを含むifブロック上部
    • 内容:発生条件

  • 例外トラップブロック
    • コメントレベル:1
    • 位置:Catch finally ブロック内
    • 内容:対処内容



コメント例


クラス、クラステンプレート、構造体

  1. //****
  2. /// @brief 要約
  3. ///
  4. /// 詳細説明
  5. /// @sa 関連クラス
  6. ///
  7. template<typename T>
  8. class Sample{
  9. ...
  10. };
  11.  

パブリックメンバ宣言

  1. class Sample{
  2. ...
  3. public:
  4. //***
  5. /// @brief 要約
  6. ///
  7. /// 詳細説明
  8. /// @param[in] another 引数の説明
  9. ///
  10. bool Equals(const Sample &another);
  11. ...
  12. };
  13.  

プライベートメンバ宣言

  1. class Sample{
  2. ...
  3. private:
  4. //**
  5. /// @brief 要約
  6. ///
  7. /// 詳細説明
  8. /// @param[in,out] anyparam 引数の説明
  9. /// @retval true 真を返す場合の説明
  10. /// @retval false 偽を返す場合の説明
  11. ///
  12. bool AnyFunction(int anyparam);
  13.  
  14. /// @brief 1行で説明できるコメント(1)
  15. int m_anymember;
  16.  
  17. /** @brief 1行で説明できるコメント(2) */
  18. int m_anothermember;
  19. ...
  20. };
  21.  


[09/04/16 15:35][履歴][編集]
最終更新:2009年04月16日 15:35