Laravelを使用して、DDDで開発しています。これらのサービスは、宅配クリーニングというサービスの性質上、ネットだけでなく、工場や物流といったリアルな事業ドメインも扱うことになるため、DDDのやりがいがあるサービスだと思います。TL;DRこの記事は前回の続きです。前回は、架空の宅配クリーニングのモデルを例にとって、『エリック・エヴァンスのドメイン駆動設計』で紹介されている仕様パターンについて書きました。今回は、引き続き架空の宅配クリーニングのモデルを例にとって、複数の仕様を組み合わせる方法について書いてみます。仕様を使っていると、それらを組み合わせたいと思う状況はよくあります。Specification)を実装して仕様を組み合わせるパターンが紹介されています。仕様を抽象化して組み合わせ可能にするために、仕様インタフェースを作成します。isSatisfiedBy($candidate);}次に、仕様インタフェースを実装する抽象仕様クラスを作成します。}}最後に、抽象仕様クラスを継承したAnd仕様クラス、Or仕様クラス、Not仕様クラスを作成します。}}最終的に、クラス設計は次のようになりました。例によって、モデルはあくまで架空であり、実在するサービス・企業とは一切関係ありません。今回仕様インタフェースと抽象仕様クラスを追加したため、前回の記事で作成したキャンセル可能クリーニング品仕様クラスを次のように変更します。}}さて、クリーニング品の中には特殊なクリーニングが必要なもの(特殊クリーニング品)もあるでしょう。皮革・毛皮などがそうかもしれません。ここで、特殊クリーニング品のうちキャンセル不可能なものを判定したいという要件が出てきたとします。このときに、「特殊かつキャンセル不可能クリーニング品」などといったひとつの仕様クラスを作成してしまうと、あまりに用途が限定された特殊な仕様となり再利用できそうにありません。そこで今回作成した合成仕様を使います。特殊クリーニング品仕様(SpecialItemSpecification)という汎用的な仕様クラスを作成し、すでにあるキャンセル可能クリーニング品仕様クラスと組み合わせて、「特殊かつキャンセル不可能クリーニング品」という仕様を表現してみます。まとめ合成仕様を使って複数の仕様を組み合わせてみました。「小劇場俳優が企業広報やってみた」です。ホワイトプラスではエンジニアを募集していますホワイトプラスでは、「ネット」×「リアル」なサービスをDDDで実現するぜ!という技術で事業に貢献したいエンジニアを募集しております。