集約のトランザクション Link to heading

DDDの集約について学ぶと、必ず「集約はトランザクション境界である」という説明がされている。

整合性の境界の論理的な意味は、「その内部にあるあらゆるものは、どんな操作をするにかかわらず、特定の不変条件のルールに従う」ということだ。この境界の外部にある、あらゆるものの整合性は、集約とは無関係になる。つまり、集約はトランザクション整合性の境界と同義である

ヴァーン・ヴァーノン. 実践ドメイン駆動設計 (Japanese Edition) (Kindle の位置No.8139-8141). Kindle 版.

この「トランザクション」という言葉は技術者的には技術的領域(DB等)のトランザクションと同一視したくなる。

DDDの概念としてはその認識でも厳密には間違いではない。

ただ、個人的にはそこへ至る前に「ドメイン的関心のトランザクション」という考えを1つ挟む必要があるのではないか、と考えている。

ドメイン的関心のトランザクション Link to heading

この記事で言及している「ドメイン的関心のトランザクション」とは「ドメインエキスパートが業務の処理をするにあたっての区切り」を指している。

この「ドメイン的関心のトランザクション」を意識しないと適切なトランザクションの切れなくなってしまう。

たとえば、1つの契約書から複数の請求書を作成する、といった請求書作成の処理の区切りを例に取ってみる。

1つの契約書には複数の契約項目があり、それ毎に請求書が作成されるとする。

その作成の中で、契約書の契約項目にミスが有った場合、技術的関心のトランザクションだけに目が行っていると「契約項目が不正な状態だったため請求書作成の処理全体をロールバック」ということをしてしまいたくなる。

このような処理を実現するにはデータの構造とトランザクションだけを表現すればいいのでドメイン貧血症になりがち。

ですが、実際に業務をしているドメインエキスパートは「不正な契約項目だけ差し戻して、正しい契約項目からは請求書を作成する」といったことをしている可能性がある。

その場合、「不正な契約項目」というものを表現する必要があり、契約項目が不正だからということで一概にロールバックはできない。

もちろん、上記の「不正な契約項目」というものを表現したとしても、契約書や請求書といったオブジェクトとの整合性は保つ必要があるため、最終的には技術的なトランザクションを意識する必要がある。

しかしDDDで開発を進める上ではその手前に必ず「ドメイン的関心のトランザクション」があり、それを意識して集約を考えることでドメインを深堀りすることに繋がり、結果的に正しい集約を作ることができるのではないかと思う。