| name | gof-functional-patterns |
| description | GoF/オブジェクト指向デザインパターンを関数型プログラミング(pure functions, higher-order functions, ADT, composition, immutability, effect boundaries)でシンプルに整理・設計・リファクタリングする。Strategy/Factory/Adapter/ObserverなどGoF全23パターンのFP置き換え、適用判断、具体事例を提示する必要があるときに使う。 |
GoF Functional Patterns
GoF の全23デザインパターンを、関数型プログラミング(FP)の考え方でシンプルに説明・設計・リファクタリングするための Skill です。
「クラス階層を作る」ことを目的にせず、データ・関数・合成・不変性・明示的な副作用境界で問題を小さく解くことを優先してください。
この Skill を使う場面
ユーザーが次のような依頼をしたときに使います。
- GoF デザインパターンを関数型で説明してほしい
- OO のパターン実装を FP っぽく簡略化したい
- Strategy / Factory / Adapter / Observer などを、クラスなしで実装したい
- ある設計課題にどのパターンを当てるべきか判断したい
- パターンごとの適用ユースケースと具体事例を知りたい
- 既存コードの「過剰なパターン適用」を見直したい
基本方針
-
パターン導入ありきにしない
まず「普通の関数・データ構造・合成」で足りるか確認する。
-
継承より合成を優先する
Template Method / Factory Method / State など、継承で表現されがちなものは、関数引数・レコード・ADT・パターンマッチ・fold に置き換える。
-
副作用を境界に寄せる
I/O、DB、HTTP、ログ、キャッシュ、時刻、乱数などは、純粋関数の外側に閉じ込める。必要なら Env や「関数のレコード」を渡す。
-
状態は明示的な値として扱う
State / Memento / Command / Observer などは、ミュータブルオブジェクトではなく、状態値・イベント・コマンド・Reducer・Stream として扱う。
-
「いつ使うか」「いつ使わないか」を必ず述べる
各パターンについて、適用条件、非適用条件、具体的な業務例をセットで説明する。
回答フロー
ユーザーの依頼に対して、原則として次の順序で考えてください。
-
問題の力点を特定する
例: アルゴリズム差し替え、生成ロジック、外部API変換、状態遷移、イベント通知、木構造、横断的関心事など。
-
GoF パターン名を対応づける
必要なら複数候補を挙げ、最小のものを選ぶ。
-
FP での最小形に落とす
クラス図ではなく、関数、関数レコード、ADT、Reducer、fold、middleware、pipeline、memoization などで表現する。
-