coding conventions - dsuz/csharp GitHub Wiki

ここではコーディング規約について説明し、例を紹介する。

コーディング規約とは

コーディング規約 (coding conventions, coding guideline) とは、プログラミングの文法上は守らなくても動作するが、人間にとってプログラムを読みやすくするために守る「プログラムの書き方」のルールのことである。

コーディング規約には「どのコーディング規約でも当然守るもの」もあり、そうでないものもあるが、重要なのは「プロジェクト内で一貫していること」「理由があること」である。

コーディング規約を守ることにより、コードの読みやすさは飛躍的に上がるが、一貫していないコーディング規約で書かれたプログラムは、人間にとって理解するのが困難な(読めない)ものになる。

コーディング規約は、プログラミング言語などによって異なる。ここで説明しているのはあくまで「C#」のコーディング規約であり、別のプログラミングを使う時には適用されない。

参考

  1. C# のコーディング規則(@microsoft.com)
  2. 名前付けのガイドライン(@microsoft.com)
  3. C# コーディングガイドライン&プラクティス 2021
  4. C# CODING GUIDELINES(@qiita)
  5. リーダブルコード(目次)

Unity 的な規約の例

これは私が使っている例です。基本的なもののみ挙げています。

命名規則

変数・クラス・メソッド等にはその用途・機能を表した名前をつける

クラス名はパスカルケースを使う

変数名はキャメルケースを使う

フィールド名にはプレフィックス _ をつける

以前は Unity Technologies のコーディング規則である m_ プレフィックスをつけていたが、マイクロソフトによる名前付けガイドラインが変更されたため、_ プレフィックスを使うように変えた。

メソッド名はパスカルケースを使う

プロパティ名はパスカルケースを使う

レイアウト規則

演算子の両側には半角スペースを一つ空ける

セミコロン (;) の後に命令が続く時は半角スペースを一つ空ける

カンマ (,) の後は半角スペースを一つ空ける

不必要な改行を入れない

ブロック ({ }) を作る時は、{(波括弧開く)の前に改行を入れる

以下のように、{ の前に改行する。

void Start()
{
    ...
}

以下の書き方は C/C++/java 等のインデントであるため、C# では使わない。

void Start() {
    
}

制御構文(if, for, foreach 等)を書く時にブロックを省略しない

制御構文を書く時、もしくはメソッド・プロパティを定義する時に、その前後が { または } でない場合は一行空ける

{
    if (x < 0)		// if の前後が {, } である時は行を空けない
    {
        ...
    }
                    // ここで一行空ける
    int a = 1;
    int b = 2;
                    // ここで一行空ける
    if (a > 0)
    {
        ...
    }
}					// if の前後が {, } である時は行を空けない

ブロックを作る時はインデントを正しく使う

{ からまっすぐ下に下りれば、それに対応する } があるように正しくインデントをレイアウトする。

インデントはスペースではなく Tab 文字で字下げする

コメント規則

クラス定義にドキュメント コメントをつける

クラスがコンポーネントの場合はそのコンポーネントの機能と用途(何にアタッチすることを想定しているのか)をドキュメント コメントとして記述する。

フィールドの宣言時には必要に応じてドキュメント コメントをつける

名前のみでは用途が明確でないフィールドにはドキュメント コメントによって用途を説明する。単に「自分自身が追加されている GameObject に追加されたコンポーネント」への参照を入れておく(キャッシュする)だけの変数にはコメントで説明する必要はない。

Inspector から設定させる変数については、必要に応じて Header もしくは ToolTip 属性をつけて、説明を表示する。

メソッド定義にドキュメント コメントをつける

メソッドには、その機能・目的・使うタイミングを説明したドキュメント コメントをつける。

コーディング規則

マジックナンバー及びリテラルのハードコーディングはしない

マジックナンバーのハードコーディングはしない。メンバ変数にその値の意味を示す名前をつけて値を格納する。必要であれば Inspector から設定できるようにしておく。

パブリック フィールドを宣言しない

カプセル化のコンセプトに則り、フィールドは全て private にする。内部変数を取得・更新したい時はプロパティかメソッドを経由する。

参考

Visual Studio のフォーマット機能・リファクタリング機能を使うことで、規約に沿ったコーディングに簡単に修正できる。

  1. 【Visual Studio】プログラムのフォーマットを整形するショートカットをお伝えします
  2. Visual Studio コード整形ショートカット
  3. Visual Studio リファクタリング