マイクロソフトのコーディング規約を読んで考えた事などのメモ

# この記事について
自分用に命名規則をまとめたメモです。
誤字脱字や間違っている部分があればコメントにてご指摘ください。

:::note warn
またよくわからなかった部分には🐹?がついています。
ご迷惑をおかけしますが有識者の方、教えていただけると幸いです。
:::

# インターフェースの先頭名は`I`で始める
```C#
public interface ITest
```

# 属性型には`Attribute`という単語をつけて終わる
Attributeを継承しているクラスの最後に`Attribute`をつける
上のクラスを利用しているクラスには`Attribute`は必要ない
```C#
public class TestAttribute : Attribute
```

# 列挙型はフラグとして使うかどうかで命名を分ける

- フラグじゃない時は単数名詞にする(通常の使い方)
```C#
public enum Name
{
    A, 
    B, 
    C
}
```

- フラグを利用する時は複数形の命名にする🐹?
```C#
[Flags]
public enum Names
{
    A = 0, 
    B = 1, 
    C = 2
}
```
# 連続して2回`_`を使わない

::: note alert
悪い例
```C#
public class Test
{
    int __num;
    string test__Name; 
}
```
:::

:::note 
良い例
```C#
public class Test
{
    int _num = 0;
    string _testName;
}
```
:::
連続して2回`_`を利用すると内部識別子と衝突する可能性があるらしい🐹?

# 変数、メソッド、クラスには分かりやすい名前を使う

:::note alert
悪い例 (極端な例しか思いつかなかった...)
```C#
public class P_Move
{
    float ms = 0.0f;

    public void CMS(float cms)
    {
        ms = cms;
    }
}
```
:::

:::note
良い例
```C#
public class PlayerMove
{
    float currentMoveSpeed = 0.0f;

    public void ChangeMoveSpeed(float changeMoveSpeed)
    {
        currentMoveSpeed = changeMoveSpeed;
    }
}
```
:::

# 簡潔さを優先する
冗長なコードは避ける、また分かりやすさも意識する事。

- boolの判定

:::note alert
悪い例
```C#
if(isJump == true)
```

:::

:::note 
良い例
```C#
if(isJump)
```
:::

- クラス、メソッド、変数名を分かりやすくする(既に書いたのでスキップ)

[確認にする](#変数、メソッド、クラスには分かりやすい名前を使う)
  <br>
- 分かりやすい処理のコメントは避ける
:::note alert
悪い例
```C#
// 1 + 1 を行っている
int a = 1 + 1;
```
:::

:::note 
良い例
```C#
int a = 1 + 1;
```
:::

見るだけで分かるコードのコメントはなるべく避けよう。
ただし、複雑な処理や仕組みを理解していないと分からない処理はコメントを書くことを
推奨します。

- ifのネストを深くしない
:::note alert
悪い例
```C#
 if (!isDeath)
 {
     if (isDodge)
     {
         if (isJump)
         {
             if (isAttack)
             {

             }
         }

         if (isAttack)
         {
             if (isJump)
             {

             }
         }
     }
 }
```
:::

:::note 
良い例　早期リターンやメソッド分割を利用する
```C#
 public void Dodge()
 {
     if (isDeath)
     {
         return;
     }

     if (isDodge)
     {
         Jump();
         Attack();
     }
 }

 public void Jump()
 {
     if (isJump)
     {
         if (isAttack)
         {

         }
     }
 }

 public void Attack()
 {
     if (isAttack)
     {
         if (isJump)
         {

         }
     }
 }
```
:::

- 似たような処理は共通化する
:::note alert
悪い例
```C#
int currentHP;

void damage()
{
    currentHP -= 10;
}

void heal()
{
    currentHP += 10;
}

void poison()
{
    currentHP -= 5;
}
```
:::

:::note 
良い例
```C#
int currentHP;

void ChangeHP(int changeHP)
{
    currentHP = changeHP;
}
```
:::

# クラス名とメソッドにはパスカルケースを使う

先頭を大文字にして、それ以降単語の始まりを大文字にする
例えるとこんな感じになります → PlayerMove 
単語が切り替わった時に、その単語の先頭を大文字にすれば大丈夫です。

```C#
public class PlayerMove
{
    void Move()
    {

    }
}
```
# メソッド引き数とローカル変数にはキャメルケースを使う
上と違い先頭を小文字にしてそれ以降の単語の始まりを大文字にします。
例えるとこんな感じです → playerMove
上のパスカルケースと違い最初の単語を小文字にしていますがそれ以降は上と同じです。

※あまり関係のないメモ
キャメルケースという名前は、変数がラクダのコブみたいに見えるためキャメルケースと名付けられたとか。また上のパスカルケースの事をアッパーキャメルケースとも呼ぶらしいです。

```C#
int moveSpeed;
int currentHP;
```

# 定数にはパスカルケースを使う
[確認する](#クラス名とメソッドにはパスカルケースを使う)

```C#
enum Action
{
    Idle,
    Move,
}

const int MaxHp = 100;
readonly int MaxSpeed = 5;
```

# プライベート変数は`_`で始まり残りはキャメルケース
[確認する](#メソッド引き数とローカル変数にはキャメルケースを使う)
プライベート変数が定数の場合、定数を強調するためにこの命名は適用しない。

```C#
int _currentHP;
float _moveSpeed;
```

# 静的フィールドの先頭に`s_`をつける🐹?
あまり見かけない気がするけどどうなんだろう...?
```C#
static int s_num;
```