mcpField
D
design-patterns

design-patterns

github.com/ratacat開発58134 回インストール39 週間前に更新
リポジトリ

design-patterns について

開発者が定番のデザインパターンを選び、適用するためのリファレンススキルです。問題や症状ごとにパターンを整理し、テンプレートの機械的な適用ではなく、状況に合った利用を重視します。

主な機能

  1. 01問題・症状別のパターン選択
  2. 02設計の基本原則
  3. 03一般的な分類ごとのパターン参照
  4. 04アンチパターンと誤用の指針
  5. 05実装チェックリスト

活用シーン

  1. 01繰り返し起きる設計課題にパターンを選ぶ
  2. 02コードの症状から適用候補を探す
  3. 03過剰な設計のリスクを確認する

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/ratacat/claude-skills --skill design-patterns

インストール後、Claude Code で/design-patternsを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

patterns/
adapter.md
builder.md
chain-of-responsibility.md
command.md
composite.md
decorator.md
dto.md
facade.md
factory.md
identity-map.md
lazy-load.md
mediator.md
observer.md
proxy.md
repository.md
service-layer.md
state.md
strategy.md
template-method.md
unit-of-work.md

詳細

デザインパターン

概要

デザインパターンは、繰り返し発生するソフトウェア設計上の問題に対する、実証済みの解決策です。設計について議論するための共通語彙を提供し、何十年にもわたる実践を通じて磨かれてきた知見を集約しています。

基本理念: パターンは、状況に合わせて応用するためのテンプレートであり、そのままコピーする設計図ではありません。設計を本当にシンプルにできる場合に適切なパターンを使いましょう。感心させたり、必要以上に複雑にしたりするために使うものではありません。

基礎となる原則

次の原則は、優れた設計すべてを支えています。

原則意味違反したときの兆候
変化するものをカプセル化する変化する部分を安定した部分から分離する変更の影響がコードベース全体に波及する
インターフェースに対してプログラミングする具象ではなく抽象に依存する実装を入れ替えられない
継承よりコンポジションを優先するオブジェクトを組み合わせて振る舞いを構築する深くて柔軟性のないクラス階層になる
疎結合にするオブジェクト間の相互依存を最小限にするあるものを変更すると別のものが壊れてしまう
オープン・クローズドの原則拡張に対して開き、変更に対して閉じる新機能の追加に既存コードの編集が必要になる
単一責任の原則クラスを変更する理由を1つにするクラスが多くのことをしすぎている
依存性逆転の原則上位モジュールが下位モジュールに依存しないビジネスロジックがインフラストラクチャと密結合している

パターンの選び方

問題の種類から選ぶ
CREATING OBJECTS
├── Complex/conditional creation ──────────→ Factory Method
├── Families of related objects ───────────→ Abstract Factory
├── Step-by-step construction ─────────────→ Builder
├── Clone existing objects ────────────────→ Prototype
└── Single instance needed ────────────────→ Singleton (use sparingly!)

STRUCTURING/COMPOSING OBJECTS
├── Incompatible interface ────────────────→ Adapter
├── Simplify complex subsystem ────────────→ Facade
├── Tree/hierarchy structure ──────────────→ Composite
├── Add behavior dynamically ──────────────→ Decorator
└── Control access to object ──────────────→ Proxy

MANAGING COMMUNICATION/BEHAVIOR
├── One-to-many notification ──────────────→ Observer
├── Encapsulate requests as objects ───────→ Command
├── Behavior varies by internal state ─────→ State
├── Swap algorithms at runtime ────────────→ Strategy
├── Algorithm skeleton with hooks ─────────→ Template Method
├── Reduce N-to-N communication ───────────→ Mediator
└── Sequential handlers ───────────────────→ Chain of Responsibility

MANAGING DATA ACCESS
├── Abstract data source ──────────────────→ Repository
├── Track changes for atomic commit ───────→ Unit of Work
├── Ensure object identity ────────────────→ Identity Map
├── Defer expensive loading ───────────────→ Lazy Load
├── Map objects to database ───────────────→ Data Mapper
└── Shape data for transfer ───────────────→ DTO
症状から選ぶ
症状検討するパターン
型に対する巨大な switch/if-else 文があるStrategy、State、またはポリモーフィズム
クラス間でコードが重複しているTemplate Method、Strategy
多数のオブジェクトに変更を通知する必要があるObserver
オブジェクトの生成ロジックが複雑であるFactory、Builder
機能の追加でクラスが肥大化するDecorator
サードパーティ製 API がコードに適合しないAdapter
コンポーネント間の依存関係が多すぎるMediator、Facade
データベースやネットワークなしではテストできないRepository、Dependency Injection
元に戻す/やり直す必要があるCommand
オブジェクトの振る舞いが状態に依存するState
リクエストを複数のハンドラーで処理する必要があるChain of Responsibility
ドメインロジック:トランザクションスクリプトとドメインモデル
要素トランザクションスクリプトドメインモデル
ロジックの複雑さシンプル(500行未満)複雑で、ルールが多い
ビジネスルール少なく、単純多く、互いに作用する
操作CRUD が中心豊かな振る舞い
チーム/期間小規模チーム、短期間でのリリース長期的な保守
テスト結合テストドメインの単体テスト

経験則: まずはトランザクションスクリプトから始めます。手続き型コードの保守が難しくなったら、ドメインモデルにリファクタリングします。

クイックリファレンス

Tier 1:必須パターン(最初に習得)
パターン一言で言うと使用する場面リファレンス
Strategy交換可能なアルゴリズムをカプセル化する何かを実現する方法が複数あり、実行時に切り替える場合strategy.md
Observer依存するオブジェクトに状態の変更を通知するイベントシステム、リアクティブな更新observer.md
Factoryオブジェクトの生成をカプセル化する生成が複雑、または条件に依存する場合factory.md
Decorator振る舞いを動的に追加する継承せずに拡張する場合decorator.md
Commandリクエストをオブジェクトとしてカプセル化する元に戻す/やり直す、キューイング、ロギングcommand.md
Tier 2:構造パターン
パターン一言で言うと使用する場面参考資料
Adapterインターフェースを変換する互換性のないコードを統合するadapter.md
Facade複雑なサブシステムを単純化するシンプルな API の背後に複雑さを隠すfacade.md
Composite均一なツリー構造を実現する全体と部分の階層構造を扱うcomposite.md
Proxyオブジェクトへのアクセスを制御する遅延読み込み、アクセス制御、キャッシュproxy.md
Tier 3:エンタープライズ/アーキテクチャパターン
パターン一言で言うと使用する場面参考資料
Repositoryコレクションのようなデータアクセスを提供するドメイン層とデータ層を分離するrepository.md
Unit of Work原子的な変更を調整するトランザクション管理unit-of-work.md
Service Layerビジネス処理を統括するアプリケーションの境界を定義するservice-layer.md
DTO転送用にデータを整形するAPI コントラクト、過剰な情報公開の防止dto.md
その他の重要なパターン
パターン一言で言うと使用する場面参考資料
Builderオブジェクトを段階的に構築する複雑なオブジェクト、流れるような APIbuilder.md
State状態に応じて振る舞いを変えるステートマシン、ワークフローstate.md
Template Methodフックを備えたアルゴリズムの骨格フレームワークの拡張ポイントtemplate-method.md
Chain of Responsibilityハンドラーにリクエストを順に渡すミドルウェア、パイプラインchain-of-responsibility.md
Mediator複雑な通信を一元化するコンポーネント間の結合を減らすmediator.md
Lazy Loadコストの高い読み込みを遅らせるパフォーマンス、大規模なオブジェクトグラフlazy-load.md
Identity Mapオブジェクトの同一性を保証するORM、重複の防止identity-map.md

よくある間違い

間違い症状対処法
パターンの使いすぎ単純な操作にも多くのクラスをたどる必要がある実際の問題を解決する場合にのみ使う
不適切なパターンコードに無理があり、不自然に感じられる実際の問題を見直す
継承の乱用深い階層、壊れやすい基底クラス継承よりコンポジションを優先する(Strategy、Decorator)
Singleton の乱用グローバル状態、隠れた依存関係、テストの難しさ代わりに依存性注入を使う
時期尚早な抽象化実装が1つしかないインターフェース実際に変更の必要が生じるまで待つ

注意すべきアンチパターン

  • God Object: 1つのクラスがすべてを担う → SRP に従って分割する
  • Anemic Domain Model: オブジェクトが単なるデータの入れ物になっている → 振る舞いをオブジェクトに移す
  • Golden Hammer: どこでも同じパターンを使う → 問題に合ったパターンを選ぶ
  • Lava Flow: 誰も削除しないデッドコード → 削除する。VCS が変更を記録してくれる

現代的なバリエーション

現代的なパターン基になるパターン説明
Dependency InjectionStrategy + Factoryコンテナーが依存関係を作成し、注入する
MiddlewareDecorator + Chain of Responsibilityリクエスト/レスポンスのパイプライン
Event SourcingCommand状態の変更をイベントとして保存する
CQRSCommand/Query の分離読み取りモデルと書き込みモデルを分離する
Hooks (React/Vue)Observer + Strategy関数型のライフサイクル購読

実装チェックリスト

パターンを実装する前に確認してください。

  • このパターンは、このコードベースの実際の問題を解決する
  • よりシンプルな代替案を検討した
  • この状況においてトレードオフを許容できる
  • チームがこのパターンを理解している
  • 解決策を過剰に設計しない

コメント