コーディングスタイル
基本
- ヘッダファイルの拡張子は「.hpp」。
- すべてのヘッダファイルにインクルードガードを記述する。
- #ifdef __PROJECT_PATH_FILE_H__
#define__PROJECT_PATH_FILE_H__
...
#endif // __PROJECT_PATH_FILE_H__
- 関数はできるだけ短く。
- 変数名は分かりやすくする。
- 長くなっても構わない。
- ハンガリアン記法は禁止する。(特に型を表すものなど)
- クラスのフィールドを表す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
- 位置:例外スローを含むifブロック上部
- 内容:発生条件
- 例外トラップブロック
- コメントレベル:1
- 位置:Catch finally ブロック内
- 内容:対処内容
コメント例
クラス、クラステンプレート、構造体
//****
/// @brief 要約
///
/// 詳細説明
/// @sa 関連クラス
///
template<typename T>
class Sample{
...
};
パブリックメンバ宣言
class Sample{
...
public:
//***
/// @brief 要約
///
/// 詳細説明
/// @param[in] another 引数の説明
///
bool Equals(const Sample &another);
...
};
プライベートメンバ宣言
class Sample{
...
private:
//**
/// @brief 要約
///
/// 詳細説明
/// @param[in,out] anyparam 引数の説明
/// @retval true 真を返す場合の説明
/// @retval false 偽を返す場合の説明
///
bool AnyFunction(int anyparam);
/// @brief 1行で説明できるコメント(1)
int m_anymember;
/** @brief 1行で説明できるコメント(2) */
int m_anothermember;
...
};
最終更新:2009年04月16日 15:35