【スペシフィケーションパターン】
Specificationパターン とは?
最終更新:
💡 条件を部品にして、同じ対象に組み合わせる
対象が条件を満たすかという判定ルールを、対象自身や選択処理から分離して表す設計パターン。複合SpecificationではAND・OR・NOTで条件を組み合わせられる。再利用に役立つが、任意の判定を自動でSQLへ変換できるわけではない。
📌 このページのポイント
- 判定ルールを、対象や選択処理から分ける
- isSatisfiedByなどで、条件を満たすか調べる
- 複合仕様ではAND・OR・NOTで組み合わせる
- 条件の再利用と、設計の複雑さを見比べる
条件は、if文で書いてはいけない?
if文でもよいよ。同じ判定をいろいろな場所で使い、条件を組み合わせたいとき、ルールを独立した部品にする方法がSpecificationなんだ。小さな一度きりの条件に、必ず導入するものではないね。
部品では、どうやって判定する?
たとえば商品の在庫があるかを、isSatisfiedBy(product)のような操作で判定するよ。対象の商品と判定ルールを分ければ、同じルールを複数の商品に適用して確かめられるんだ。
ANDやORも、使えるの?
複合仕様では使えるよ。同じ商品に対して「在庫あり」と「公開中」をANDで組み合わせると、両方を満たす商品を選べる。ORはどちらか、NOTは条件の否定。異なる種類の対象の条件を、無条件で混ぜるわけではないんだ。
そのまま、データベース検索に使える?
実装によるよ。メモリ上の判定処理が、そのままSQLに変わるわけではない。検索で使うなら、対応する式や変換の仕組みが必要。全件を読み出して判定する設計では、件数と性能にも注意しよう。
どんな作り方でも、同じなの?
元の資料は、コードに条件を書く方法、値をパラメーターにする方法、部品を組み合わせる方法を区別しているよ。柔軟にするほど仕組みを作る手間もある。必要な再利用や変更に合わせて選ぶことが大切だね。
まとめ:ざっくりこれだけ覚えればOK!
「Specificationパターン」って出てきたら「条件を部品として取り出し、組み合わせて判定する設計」と思えばだいたいOK!
📖 おまけ:英語の意味
「Specification pattern」 = 条件を仕様として表すパターン
💬 Eric EvansとMartin FowlerのSpecificationsで説明されているよ。対象と、その対象が満たすべき条件を分ける考え方なんだ。