Skip to content

16. 再代入をしない

変数に再び値を代入することを再代入といいます。もちろん、状況によっては再代入は許可されますが、単に変数を使いまわしたいだけなら、コードの途中で変数の用途が変わることになり可読性が低下します。目的ごとに異なる変数を使用しましょう。また、引数に再代入することもしてはいけません。

csharp
// ❌ Bad: 変数を使いまわしている
int result = baseAttack;
result = result * comboMultiplier;     // いつの間にか用途が変わっている
result = result - target.Defense;
result = Mathf.Max(result, 1);

// ✅ Good: 目的ごとに変数を分ける
int rawDamage = baseAttack * comboMultiplier;
int actualDamage = rawDamage - target.Defense;
int finalDamage = Mathf.Max(actualDamage, 1);
csharp
// ❌ Bad: 引数に再代入
void ApplyDamage(int damage)
{
    damage = Mathf.Max(damage - defense, 0); // 引数を上書き
    hitPoint -= damage;
}

// ✅ Good
void ApplyDamage(int damage)
{
    int actualDamage = Mathf.Max(damage - defense, 0);
    hitPoint -= actualDamage;
}

また、もし再代入されないことを保証したいフィールドがあれば、readonly 修飾子をつけましょう。これで一度値が代入されたらそれ以降変更できなくなります。また、再代入されないことが明らかとなり可読性が向上します。初期化時に一度代入したきり変更しないフィールドはよくあります。そういうフィールドは必ずreadonlyにしましょう。

csharp
// readonlyの例
public class CharacterStatus
{
    readonly int maxHitPoint;      // 一度設定したら変更できない
    readonly string characterName;

    public CharacterStatus(int maxHitPoint, string characterName)
    {
        this.maxHitPoint = maxHitPoint;
        this.characterName = characterName;
    }
}

Unity設計講習会 資料公開ページ