DRYとKISSは矛盾する?設計原則を使いこなすためのバランス感覚とは

設計原則の代表であるDRYとKISSは時に矛盾することがあります。本記事ではその本質的な違いと、実践でどうバランスを取れば良いかをわかりやすく解説します。

ソフトウェア設計において、「良いコード」とは何かを考える際にしばしば登場するのが DRY(Don't Repeat Yourself)KISS(Keep It Simple, Stupid) という2つの原則です。

どちらも保守性と可読性を高めるための重要な指針ですが、実際の開発現場では両立が難しい場面もしばしばあります。本記事では、この2つの原則の違いと、実践でバランスを取るための考え方を解説します。


DRY原則とは?

DRYは「同じことを繰り返すな」という原則です。

  • 目的:重複コードを排除し、単一の情報源(Single Source of Truth)にする
  • メリット:変更が一箇所で済み、整合性が保ちやすい
  • 典型的な適用例:共通ロジックを関数やクラスに抽出する、共通定数を設定ファイルに切り出す など

KISS原則とは?

KISSは「とにかくシンプルに」という原則です。

  • 目的:複雑な設計・実装を避け、理解しやすくする
  • メリット:初見でも理解しやすく、ミスが起きにくい
  • 典型的な適用例:過度な設計パターンや抽象化を避ける、ストレートな処理を心がける

なぜDRYとKISSは衝突するのか?

よくある衝突パターン

共通化のしすぎによる複雑化(DRYの過剰適用)

# 例:3つの似た関数を共通化しようとしたが…

def process_item(item, type):
    if type == "A":
        # 処理A
    elif type == "B":
        # 処理B
    elif type == "C":
        # 処理C

if文が肥大化し、コードの可読性が低下

逆に、KISSを重視して重複が発生するケース

# 似たような処理を3つに分けて書く

def process_A(item):
    # 処理A

def process_B(item):
    # 処理B

def process_C(item):
    # 処理C

→ 重複しているが、それぞれの責務が明確で読みやすい


バランス感覚を持って設計するコツ

1. 「抽象化の価値」を評価する

  • 共通化によって実際に保守が楽になるか?
  • 将来の変更頻度や拡張性に貢献するか?

→ 無理に1つにまとめるより、「目的の明確化」が重要


2. 「複雑さの移動」に注意する

共通化すると、その分だけ抽象度が上がります。

それがチーム全体にとって「扱いやすい抽象化」かどうかを常に意識しましょう。


3. 最初はKISS寄り、必要があればDRYへ

いきなり抽象化せず、まずはシンプルに書いておく。

同じようなコードが3回以上出てきたら、はじめてDRYを検討するのが現場での定石です。


まとめ:原則に従うのではなく、原則を使いこなす

  • DRYとKISSはどちらも「正しい」
  • しかし、目的や文脈が異なるため、盲目的に適用すると逆効果になることも
  • 原則を道具として使いこなすためには、バランス感覚が必要

設計原則を学ぶことは「ルールを守る」ことではなく、設計の判断軸を持つことです。

最適解は常にコードとチームの状況にあります。

DRYとKISS、それぞれのメリット・リスクを理解しながら、場面に応じた設計判断を積み重ねていきましょう。

編集部

編集部