イベントに依存するリソース

リソースなんだけれども日付をもったりイベントから導出された結果を持っているようなモデルを作成していろいろ考えてみます。

シナリオ

顧客に対して、会員契約、過去取引実績による割引率を管理するようなマスタを利用するシナリオで、顧客・注文・商品の3つの概念を用います。台帳であらわすとこんな感じです。

顧客マスタの中に会員契約日や終了日が入っています。また前年購入金額は注文エンティティからの導出された値になっています。顧客マスタが注文イベントに依存しているような構造です。

ドメインモデル

上記をそのままドメインモデルしたらこんな感じですね。

顧客と注文が双方向で参照しています。また、顧客リソースにイベント特性である日付が含まれています。これらは、顧客に他の概念の属性が混入している可能性があるので、分離して安定化させます。
上記の顧客エンティティから、ライフサイクルの違いの観点で会員契約日と会員終了日を内部エンティティとして取り出して、さらに顧客_会員契約の内部状態を分離します。前年購入金額は注文イベントの導出項目なので注文のサマリクラスとしてしまってもよいのですが、ここでは顧客に関連した注文の代理(役割)の<>注文IN顧客を導入します。割引率も前年購入金額から導出されるので合わせて配置します。

もし、割引率を顧客に含めたいのであれば、以下のようなインタフェースを導入すれば、顧客から注文IN顧客を参照することなしに前年購入金額を利用できるようになります。(これはドメインモデルでDIを使うパターンにできます)

論理モデル

最後にドメインモデルを論理ERで表現してみます。注文IN顧客は注文+注文明細のビューで実装することももちろん可能です。

気付いたこと

リソース/イベントの意識することで、今回の顧客マスタようなリソースにもかかわらずイベント的な要素がある場合に、積極的に概念を分離していく方向にドライブされるメリットがあった。