Top > CrossFramework > コード規約

* コード規約 [#m8a05d57]
#contents
** C++ [#wc6ececc]

*** ソースコード [#f828ee0e]
- 文字コードはUTF8(コードページ65001)BOMあり。
- 改行コードはCRLF。
- タブは使用禁止。空白インデント幅4を使う。
*** ポリシー [#cb47bdb1]
- final版でフェールセーフにできる箇所はフェールセーフにする。
- フェールセーフな関数とそうじゃない関数があるとき,フェールセーフの関数のほうを短い名前付けにする。
-- Copy()とCopyStrict()みたいな感じ。

*** その他 [#q707cb80]
:共通|
#code(c,){{
// [パスカル形式]
// ・単語の頭を大文字,それ以外を小文字で表記する方法。
//  例:SuperVector3
//
// [キャメル形式]
// ・パスカル形式と基本的に同じで最初の一文字目だけ小文字で表記する方法。
//  例:superVector3
//
// [略語について]
// ・Microsoft C#方式をとり,2文字以下と3文字以上で分ける。
//  例:Identity = ID(パスカル) id(キャメル)
//    Object = Obj(パスカル) obj(キャメル)
//      Hyper text markup language = Html(パスカル) html(キャメル)
//
// [宣言]
// ・static変数の初期化コードで他のstatic変数・関数にアクセスすることがないようにする。
//
// [スコープ]
// ・原則,括弧の位置は縦に揃える。ただし下記の場合のみ例外。
//  ・namespaceの宣言。
//  ・1行で記述したほうが見栄えがいいとき。 例: if ( hoge ) { foo = false; }
// ・スコープ括弧が省略できる文は省略してはならない。必ず括弧をつけること。
//
// [using]
// ・using namespaceおよびusingは関数の実装でのみ使ってよい。
//  それ以外の箇所での使用はシンボルの衝突がおこる可能性があるため禁止。
//
// [doxygen関連]
// ・ユーザーが直接触ることがないシンボルに対するコメントはdoxygenスタイルで書いてはいけない。
// ・doxygenコメントで使用してよいタグリスト。これ以外は使用禁止。
// @code @endcode @n @e @ref @addtogroup
// 以下のものはこの順番で記述すること。
// @copydoc
// @brief
// @return
// @param
// @see
// @details
// ・doxygenの@name機能は原則使用禁止。シンボルはabcの名前でsortしたいため。

// [class][struct][union]
// classは非POD型,structはPOD型で使い分ける。
class Class
    // 継承クラスの記述順番は次の通り。
    // ・実装があるクラス(1つまで)。
    // ・インターフェースクラス(何個でも)。
    : public Base
    , public ICallback
{
public: // public,protected,privateの順番。
    // 定義・宣言の順番
    // 1. 型
    // 2. static変数
    // 3. static関数
    // 4. インスタンス変数
    // 5. デフォルトコンストラクタ
    // 6. その他コンストラクタ
    // 7. デストラクタ
    // 8. インスタンス関数
    // 9. 継承関数実装
    // 10. 実装都合用変数

    // 各要素の名前の付け方。
    struct PublicType {};
    static int  PublicStaticVar;
    static void PublicStaticFunc();
    int  publicVar;
    void publicFunc();
    int  forImplementPublicVar_; // 「POD型のメンバ変数だけどユーザーが直接アクセスするものでない」といった実装の都合でpublicに置いている変数はこの名前の付け方。
protected:
    // 定義順はpublicと同じ。

    // 各要素の名前の付け方。
    struct ProtectedType {};
    static int  protectedStaticVar;
    static void ProtectedStaticFunc();
    int  protectedVar;
    void protectedFunc();
    
private:
    // 定義順はpublicと同じ。

    // 各要素の名前の付け方。
    strict PrivateType {};
    static int  sPrivateStaticVar;
    static void PrivateStaticFunc();
    int  mPrivateVar;
    void privateFunc();
};

// enumの説明。
struct ColorKind
{
    enum enum_t
    {
        // 定義・宣言の順番
        // 1. 列挙値の定義
        // 2. TERMINATE,MIN,MAXの定義
        // 3. エイリアス値の定義
        Red,
        Green,
        Blue,
        // term
        TERM,
        MIN = 0,
        MAX = TERM-1,
        // alias
        Default = Blue
    };
};
enum ColorKind
{
    // 定義・宣言の順番
    // 1. 列挙値の定義
    // 2. TERMINATE,MIN,MAXの定義
    // 3. エイリアス値の定義
    ColorKind_Red,
    ColorKind_Green,
    ColorKind_Blue,
    // term
    ColorKind_TERMINATE,
    ColorKind_MIN = 0,
    ColorKind_MAX = ColorKind_TERMINATE-1,
    // alias
    ColorKind_Default = ColorKind_Blue
};

// [namespace]
// 名前空間のスコープはinは1行1名前空間,outは一気に。
// 括弧の位置は下記の例に習う。
namespace RootName {
namespace InName {
}}
namespace {
    // [無名空間]
    // 定義順は下記の通り。
    // 1. 型定義
    // 2. 変数定義。
    // 3. 関数定義。
    //
    // 無名空間の名前付けルールは下記の通り。
    struct tType {};
    int  tVar;
    void tFunc();
}

// [function]
// ・非インスタンスな関数の記述は禁止。
//  他のヘッダとぶつかる可能性があるため関数をnamespace直下に書いてはいけない。
//  structやclassのstatic関数として記述する。
struct FunctionSet
{
    // 引数の名前は a + パスカル。
    // 引数が2つ以上の場合は改行する。
    // 括弧の位置は下記に習う。
    static void Func(
        int aArg1
        , bool aArg2
        )
    {
        // ローカル変数の名前は下記の通り。
        int localVar;
    }
}

// [macro]
// 名前は大文字とアンダーバーでのみ構成できる。アンダーバーは単語の区切りに使う。
#define MACRO_CONSTANT (1)
#define MACRO_FUNC( aVar ) do{}while(false)
// 名前の衝突がおきないように,cppローカルなmacroは頭にtをつけること。
#define tMACRO_DEBUG_MODE (true)

// [preprocessor]
// #ifもインデントすること。
#if defined(DEBUG_VERSION)
    #include "Debug.hpp"
#endif

}}

:ヘッダファイル|
#code(c,){{
/**
 * @file
 * @brief このファイルに対する説明。
 * @author ファイル作成者名。
 */
#if defined(大文字モジュール名_INCLUDED_大文字ファイル名_HPP)
#else
#define 大文字モジュール名_INCLUDED_大文字ファイル名_HPP

//-----------------------------------------------------------
// インクルードするものがあればここに記述。
// システムヘッダインクルード(abc順) -> 通常ヘッダインクルード(abc順) の順番。
#include <XBase/Matrix34.hpp>
#include <XBase/Vector3.hpp>
#include "App/EntryPoint.hpp"

//-----------------------------------------------------------
namespace モジュール名 {

    // ・クラスなどシンボルを記述する場合原則は1ヘッダ1クラス。

}
//-----------------------------------------------------------
// EOF
}}

:ソースファイル|
#code(c,){{
/**
 * @file
 * @brief このファイルに対する説明。
 * @author ファイル作成者名。
 */
#include "Hoge/Foo.hpp" // 実装対象となるヘッダファイル。

//-----------------------------------------------------------
// インクルードするものがあればここに記述。
// システムヘッダインクルード(abc順) -> 通常ヘッダインクルード(abc順) の順番。
#include <XBase/Matrix34.hpp>
#include <XBase/Vector3.hpp>
#include "App/EntryPoint.hpp"

//-----------------------------------------------------------
namespace Hoge {
//-----------------------------------------------------------
// 無名空間が必要なら随時挿入。
namespace {
}
//-----------------------------------------------------------
// 実装順番はhppに記述されているものに合わせる。
// 名前空間の中だからといってインデントをする必要はない。
void Foo::func()
{
}

//-----------------------------------------------------------
}
//-----------------------------------------------------------
// EOF
}}

    ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS