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;
}
}