設計原則 レッスン4

DRY・KISS・YAGNI

重複を避けるDRY、単純さを保つKISS、将来の機能を先取りしないYAGNIという3つの実践的な原則を学ぶ

DRY(Don't Repeat Yourself)

DRY原則は「同じ知識を複数箇所に重複させない」 という原則です。ここでの「知識」とは、コードの見た目の重複だけでなく、同じビジネスルールや仕様が複数箇所に 散らばっている状態を指します。

// 悪い例: 送料無料の閾値(5000円)が複数箇所に重複している
function calculateShipping(cart) {
  if (cart.total >= 5000) return 0
  return 500
}

function showFreeShippingBanner(cart) {
  if (cart.total < 5000) return "送料無料まであと少し!"
  return ""
}

// 5000円という閾値を変更する際、両方の箇所を修正し忘れるリスクがある
// 良い例: ビジネスルールを1箇所にまとめる
const FREE_SHIPPING_THRESHOLD = 5000

function calculateShipping(cart) {
  if (cart.total >= FREE_SHIPPING_THRESHOLD) return 0
  return 500
}

function showFreeShippingBanner(cart) {
  if (cart.total < FREE_SHIPPING_THRESHOLD) return "送料無料まであと少し!"
  return ""
}

ポイント

DRYは「見た目が似ているコードを無理に共通化する」原則ではありません。 たまたま今のコードが似ているだけで、変更理由が異なる場合は無理に共通化すべきではなく、 共通化しすぎるとかえって結合度が上がってしまいます(DRYのやりすぎ)。

KISS(Keep It Simple, Stupid)

KISS原則は「不必要な複雑さを持ち込まず、 シンプルな設計を保つ」という原則です。将来の柔軟性を見越して抽象化やパターンを 先回りして導入した結果、今の要件に対しては過剰に複雑な実装になってしまうことがあります。

複雑にしすぎた例

単純な条件分岐で済む処理に対して、汎用的な「ルールエンジン」フレームワークを 独自に構築し、設定ファイルでルールを組み立てる方式にしてしまう

シンプルに保った例

条件分岐がそのまま読みやすいコードとして書かれており、 仕様変更があれば該当箇所だけを素直に修正できる

YAGNI(You Aren't Gonna Need It)

YAGNI原則は「今必要とされていない機能を、 将来使うかもしれないという理由だけで先取りして実装しない」という原則です。

// 悪い例: 現時点で通貨は日本円しか扱わないのに、
// 「将来海外展開するかもしれない」という理由で多通貨対応の抽象化を先取りする
class Price {
  constructor(amount, currency, exchangeRateProvider, roundingStrategy) {
    // 使われない拡張ポイントが実装の複雑さを増している
  }
}

// 良い例: 今必要な範囲だけをシンプルに実装し、
// 実際に多通貨対応が必要になった時点で設計を見直す
class Price {
  constructor(amountInYen) {
    this.amountInYen = amountInYen
  }
}

「将来のための先取り実装」は、その予測が外れた場合には使われないコードの保守コストだけが残ります。 実際にその機能が必要になったタイミングで設計するほうが、正確な要件に基づいた 設計判断ができます。

3原則のバランス

DRY・KISS・YAGNIは、それぞれ単独ではなく互いにバランスを取りながら適用する必要があります。

1

DRYのやりすぎに注意する

見た目が似ているだけの偶然の重複を共通化すると、無関係な箇所同士が結合し、KISSを損なう

2

YAGNIとKISSは相性が良い

今使わない機能を作らないことは、そのままシンプルさの維持につながる

3

重複が本当に「同じ知識」かを見極める

DRYを適用する前に、その重複が同じビジネスルールに由来するのか確認する

ポイント

  • • DRYは「同じビジネスルール・知識」の重複を1箇所にまとめる原則で、見た目の重複を機械的に共通化する原則ではない
  • • KISSは、今の要件に対して不必要な複雑さを持ち込まないという原則
  • • YAGNIは、将来使うかもしれないという理由だけで機能を先取り実装しない原則
  • • DRYのやりすぎは無関係な箇所を結合させ、KISSを損なうことがある
  • • 重複を共通化する前に、それが「同じ変更理由から生まれる同じ知識」かを見極める

確認クイズ

1 / 3

DRY原則における「重複」が本来指しているものはどれか?