Skip to content

8. 間違った共通化をしない

先程繰り返しを避けよと言いましたが、単にロジックが同じだからという理由で共通化をしてはいけません。DRY原則の原典では、以下のように説明されています。

すべての知識は、システム内において、単一で、明確で、権威ある(信頼できる)表現を持たなければならない。

(Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.)

Andy Hunt, Dave Thomas The Pragmatic Programmer

あなたが共通化したロジックは本当に同じものでしょうか?もしかしたらたまたま同じロジックだっただけで、本質的な目的は全く別かもしれません。目的が異なるものを共通化すると、仕様変更でロジックが変わった場合にそれを利用している全ての箇所が巻き添えを食います。共通化する際には、ロジックだけでなく目的も同じかどうかを確かめましょう。

csharp
// ❌ Bad: たまたまロジックが同じだっただけなのに共通化してしまった
int CalcValue(int baseValue, float rate)
{
    return Mathf.RoundToInt(baseValue * rate);
}

// 攻撃ダメージ計算に使用
int damage = CalcValue(attackPower, damageRate);

// ショップの割引計算に使用
int discountedPrice = CalcValue(originalPrice, discountRate);

// → ダメージ計算の仕様が変わって防御力を考慮するようになったら、
//    ショップの割引計算まで巻き添えになってしまう!
csharp
// ✅ Good: 目的が違うので別々のメソッドにする
int CalcDamage(int attackPower, float damageRate)
{
    return Mathf.RoundToInt(attackPower * damageRate);
}

int CalcDiscountedPrice(int originalPrice, float discountRate)
{
    return Mathf.RoundToInt(originalPrice * discountRate);
}

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