DRY 原則

Don't Repeat Yourself の略で、知識の重複を排除し、単一の正を維持する設計原則

設計設計原則

DRY 原則とは

DRY (Don't Repeat Yourself) は、Andy Hunt と Dave Thomas が『達人プログラマー』(1999 年) で提唱した原則で、「あらゆる知識はシステム内で唯一の、曖昧さのない、信頼できる表現を持たなければならない」とする。単なるコードの重複排除ではなく、知識の重複を排除する原則。

コードの重複 vs 知識の重複

コードの重複と知識の重複の違いを、コード例で比較する。

// ✅ コードが同じだが、知識は異なる (共通化しないのが正しい)
function validateAge(age: number) { return age >= 0 && age <= 150; }
function validateQuantity(qty: number) { return qty >= 0 && qty <= 150; }
// 年齢と数量は別の知識。たまたま同じ条件でも共通化すべきでない

// ❌ コードは異なるが、知識が重複 (DRY 違反)
const TAX_RATE = 0.1;  // config.ts
const tax = price * 0.1; // order.ts ← 0.1 がハードコード

DRY の適用例

DRY の適用例のコード例を示す。

// ❌ 知識の重複: バリデーションルールが 2 箇所に
// フロントエンド
if (name.length < 1 || name.length > 50) { ... }
// バックエンド
if (name.length < 1 || name.length > 50) { ... }

// ✅ 共通の定義を共有
// shared/validation.ts
export const NAME_RULES = { minLength: 1, maxLength: 50 } as const;

DRY の過剰適用 (早すぎる抽象化)

DRY を過剰に適用して 1 つの関数に押し込んだ例と、適切に分離した例を示す。

// ❌ 過剰な DRY: 無理に共通化して複雑に
function processEntity(type: 'user' | 'order' | 'product', data: any) {
  if (type === 'user') { /* ... */ }
  else if (type === 'order') { /* ... */ }
  else if (type === 'product') { /* ... */ }
}
// 3 つの異なるロジックを 1 つの関数に押し込んでいる

// ✅ 適切な分離
function processUser(data: UserData) { /* ... */ }
function processOrder(data: OrderData) { /* ... */ }

DRY vs WET vs AHA

WET (Write Everything Twice) は DRY の対極を指す言葉で、同じ知識が層をまたいで何度も書かれている状態の呼び名 (「we enjoy typing」など別の読み替えもある)。守るべき原則ではなく、避けたい状態の名前である。一方の AHA (Avoid Hasty Abstractions) は早すぎる抽象化を避ける立場で、DRY と対立するのではなく、共通化に踏み切る時期を遅らせる判断基準として働く。実務では 3 度目の重複が現れてから共通化するといった線引きで、DRY を追いすぎた不自然な抽象化を防ぐ。

DRY の適用範囲

DRY の適用範囲を以下にまとめる。

対象
ビジネスルール税率、バリデーション
設定値環境変数、定数
スキーマ定義TypeScript の型から JSON Schema を生成
IaCCloudFormation の Mappings, Conditions

CloudFormation での DRY

CloudFormation での DRY の例を示す。

Mappings:
  EnvConfig:
    dev:
      LogLevel: DEBUG
    prod:
      LogLevel: WARN

# 1 箇所で定義、複数箇所で参照
Environment:
  Variables:
    LOG_LEVEL: !FindInMap [EnvConfig, !Ref Environment, LogLevel]

DRY 原則を扱う関連書籍も多い。

この記事は役に立ちましたか?

関連用語

関連する記事