【スペシフィケーションパターン】

Specificationパターン とは?

最終更新:
💡 条件を部品にして、同じ対象に組み合わせる

対象が条件を満たすかという判定ルールを、対象自身や選択処理から分離して表す設計パターン。複合SpecificationではAND・OR・NOTで条件を組み合わせられる。再利用に役立つが、任意の判定を自動でSQLへ変換できるわけではない。

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

参考資料

← 用語集にもどる