コンテンツにスキップ

判断ガイド: 抽象化すべきか・デザインパターンを使うべきか

抽象化の判断フロー

Q1. 抽象化の対象は「知識の重複」か「字面の重複」か?
    → 知識(同じ仕様が2か所)──> 即座に一元化([DRY](../01_design_basics/09_yagni_kiss_dry.md))
    → 字面(たまたま似ている)──> Q2へ
Q2. 同じ形が3回目に現れたか?
    → 2回まで ──> コピペのまま待つ(2例では共通部分を見誤る)
    → 3回目 ──> 具体例が揃った。共通部分を確信を持って抽出できる
Q3. 抽象の失敗コストを見積もったか?
    間違った抽象 > 重複(戻すコストが高い)。抽出は「全例を見て」行う

パターン適用の判断フロー

Q1. 今、破綻シグナルが出ているか?
    ・同じ型分岐のswitchが複数関数に複製 → [State](../03_design_patterns/state.md)/[Strategy](../03_design_patterns/strategy.md)/ポリモーフィズム
    ・フラグの組み合わせ地獄 → [FSM](../04_game_patterns/state_machines.md)
    ・変更が毎回複数ファイルに波及 → [SRP](../02_solid/srp.md)/[Observer](../03_design_patterns/observer.md)
    ・生成分岐の複製 → [Factory](../03_design_patterns/factory_method.md)
    ・SDK型の全域侵食 → [Adapter](../03_design_patterns/adapter.md)
    → シグナルなし ──> 適用しない(パターンは予防接種ではなく治療)
Q2. そのパターンの「使わない場面」に該当しないか?(各パターンページの当該節を確認)
Q3. パターンなしの簡潔案(関数分割・データ化・switch集約)と比較したか?
    → パターン適用は「比較の勝者」として選ぶ。デフォルト採用しない

判断材料

  • 適用するシグナル: 各ケーススタディの「破綻する過程」(第11部)と同じ症状が自分のコードに出ている
  • 適用しないシグナル: 「勉強したから使ってみたい」/仕様が固まっていない(抽象の軸を外す)/チームがそのパターンを読めない(保守者の語彙も設計制約)

例外(先に抽象化してよいもの)

変更コストが非対称な決定は3回ルールの例外: セーブ形式のバージョン(ケース06)、公開API、通信プロトコル、サウンドのID化(ケース11)、入力の意図構造体(ケース01)——いずれも「安い保険・高い後悔」型。

トレードオフ

  • 得: 変更の局所化、拡張の受け口、共通語彙(「ここObserverで」が通じる)
  • 失: 間接化と読解コスト、抽象の軸を外したときの二重コスト(剥がして作り直し)、「パターンを使った」という満足感が設計検証を止める危険

実践のコツ

  • パターン名でなく問題名で会話する: 「Strategyを使おう」より「アルゴリズムの差し替えが3種あるので分離しよう」——手段が目的化するのを防ぐ
  • 適用したら、ページの「過剰設計になる例」と自分のコードを見比べる習慣を

理解度チェック

  1. 「3回ルール」の根拠(2例では何が分からないか)を説明できますか。
  2. 3回ルールの例外となる決定の共通性質は?
  3. 「パターンは治療であって予防接種ではない」とはどういう意味ですか。

前: 継承かコンポジションか | カテゴリ目次 | 次: イベント・DI・Singletonの判断