次の方法で共有


コーディングのガイドライン

CNTKコーディング スタイル

このページでは、CNTKのソース コードで使用される規則について説明します。 新しいコードを記述するときは、これらの規則に従ってください。 一般的な感覚に従い、妥当な制限を超える機能(画面ページのカップル)を分割し、意味のある名前を使用し、よくコメントし、コメントとコードを同期させます。

基本: インデント、間隔、中かっこ

コードは 4 つのスペースを使用して一貫してインデントされます。 タブ文字はコード内のどこにも使用できません。 唯一の例外は、タブ文字が構文的に必要なメイクファイル、その他のビルド システム、またはデータ ファイルです。

次のコード ブロックはインデントされます。

  • 制御ステートメントの本体: for、if、while、switch など。
  • Free ステートメント ブロック、つまり、コントロール ステートメントの後に続かない開始中かっこと右中かっこ。 これらは、オブジェクトの有効期間を制限するために使用される場合があります。
  • クラスと関数の本体。
  • 前の行から続いたステートメント。
  • case ステートメントのコードは、case ステートメントの後の行で開始され、インデントされます。

次の点はインデントされません。

  • 名前空間の内容。
  • case ラベル
  • アクセス制御指定子。

長いパラメーター リストを持つ関数宣言は、複数の行に分割できます。 分割行のパラメーター宣言は、関数宣言の左かっこにインデントする必要があります。 長いパラメーター リストを持つ関数の呼び出しは複数の行に分割できます。分割行は、関連付けられた関数ステートメントの左かっこにインデントする必要があります。

コードは Allman または BSD Unix スタイルの中かっこを使用して記述されます。 このスタイルでは、コントロール ステートメントに関連付けられている中かっこが次の行に配置され、コントロール ステートメントと同じレベルにインデントされます。 中かっこ内のステートメントは次のレベルにインデントされます。小さなブロックの場合でも、中かっこは省略しないでください。

スペースは次の場所に存在します。

  • 代入を含むすべての二項演算子を中心に
  • キーワードとかっこの間
  • 識別子またはキーワードと中かっこの間
  • 行を終えないコンマとセミコロンの後

スペースは次の場所に存在しません。

  • セミコロンとコンマの前
  • かっこの内側
  • 関数名とその引数リストの間
  • 単項演算子とそのオペランドの間
  • 空の引数リスト内
  • ラベルとコロンの間
  • スコープ演算子 ::

複数のクラスを含むメンバー初期化子リストと基底クラス リストは、別の行に記述する必要があります。 これにより、エラーを簡単に見つけることができます。

namespace Microsoft { namespace MSR { namespace CNTK {

Matrix ImplodeSelf(int x);
int ConfuseUs(float y);

class MainPart:
    public Head,
    protected Heart
{
public:
    MainPart():
        m_weight(99),
        m_height(180)
    {}
private:
    void EatMore();
    int m_consume, m_repeater;
};

template <typename Box>
void Inspect(Box & container)
{
    switch (container)
    {
    case 1:
        PrepareIt();
        break;

    case 2:
        Finish();
        break;

    default:
        break;
    }

    for (int i = 0; i < 30; ++i)
    {
        container << EatMore();
    }
    return container;
}

} } }

名前付け規則

  • クラス名と名前空間名は 、UpperCamelCase (PascalCase) を使用します。
  • 通常、すべて大文字 (SQL、CNTK、... ) でスペルが付いた名前は、すべての大文字で維持できます。
  • グローバルおよびパブリックの静的関数、スタック変数、およびクラス メンバー (クラス変数) は lowerCamelCase を使用します。
  • クラス メンバー関数 (メソッド) は UpperCamelCase を使用します。
  • マクロと定数は、UPPER_SNAKE_CASEを使用します。
  • 型であるテンプレート パラメーターは UpperCamelCase を使用します。
  • 型プレフィックス、ハンガリー語表記などは使用できません。 floatMatrix や normalizedDoubleMatrix など、あいまいさを解消する必要がある場合は、意味のあるサフィックスを使用します。

プレフィックスに名前を付けます

  • m_ メンバー変数の場合
  • s_ 任意のコンテキストの静的変数の場合
  • g_ グローバル変数の場合は、最初に避ける必要があります(可能な限り)

変数名は名詞にする必要があります。 関数名は動詞にする必要があります。ただし、getter を除き、名詞を使用できます。 たとえば、position というクラス プロパティには setter SetPosition() と getter Position() があります。

ファイル名の規則

C++ ファイルの拡張子は .cpp で、ヘッダー ファイルの拡張子は .h である必要があります。 スペースとアンダースコアは使用できません。 ファイル名に数値を使用することはお勧めしません。

#define GOOD_MACRO(x) x
void CallOut();
unsigned const g_theAnswer = 42;

class SolveAllProblems 
{
public:
    void DoWhatWeNeed();
    static void SetBugsOff();
    int m_countReasons;
protected:
    void NeverWorking();
    static void GetReason();
    int internalCounter;
private:
    void InternalNeeds();
    static void ShowReason();
    int m_countShows;
};

template <typename TypeParam, int numberOfReasons>
void CallGlobal(boost::array<TypeParam, numberOfReasons> const &array);

プリプロセッサ

プリプロセッサを使用した条件付きコンパイルは、コードの低下につながるため、強くお勧めします。 省略可能な依存関係を使用する場合など、避けられない場合にのみ使用します。 特殊なケースは、条件付きコンパイルを使用して、許可されているプラットフォームに基づいてファイル全体を除外することです。

条件付きでコンパイルされたプラットフォーム固有のコードを優先して、プラットフォームに関係なく同じように動作する移植可能なコードを記述することを目指す必要があります。 Boost ライブラリを使用すると、この点で大いに役立ちます。 プラットフォームに応じて異なるコードを使用する必要がある場合は、ヘルパー関数にカプセル化して、プラットフォーム間で異なるコードの量を最小限に抑えるようにしてください。