ドメイン駆動設計(DDD)における集約とは何か?
p.164 複雑な関連を伴うモデルでは、オブジェクトに対する変更の一貫性を保証するのは難しい。
維持すべき不変条件には、個々のオブジェクトに適用されるものだけでなく、密接に関連するオブジェクトのグループに適用されるものもある。
だが、慎重にロックしすぎると、今度は複数のユーザが指針もなく相互に干渉し合い、システムが使いものにならなくなる。
不変条件とは
そこに含まれるルールの集合は、これらのオブジェクトとその所有者を変更するトランザクションを実装するためのものである1。
集約とは、関連するオブジェクトの集まりであり、データを変更するための単位として扱われる。
各集約にはルートと境界がある。 境界は集約の内部に何があるかを定義するものだ。 ルートは集約に含まれている特定の 1 エンティティである。 集約のメンバの中で、外部のオブジェクトが参照を保持してよいのはルートだけである。 ただし、境界内のオブジェクトは互いに参照を保持し合ってもよい。
ルート以外のエンティティは局所的な同一性を持っているが、その同一性は集約内部でのみ識別できればよい。 外部のオブジェクトは、ルートエンティティのコンテキストを外れると、それらのエンティティを見ることさえできないからだ。
自動車が集約のルートエンティティとなり、集約の境界がタイヤも囲い込むことになる。 一方、エンジンブロックにはシリアル番号が刻印されていて、自動車とは独立して追跡されることがある。 アプリケーションによっては、エンジンが集約を持ち、同時にそのルートになるだろう。
不変条件とは、データが変更される時は常に維持されなければならない一貫性のルールで、集約のメンバ間の関係も含んでいる。 複数の集約にまたがるルールはどれも、常に最新の状態にあるということが期待できない。
エンティティと値オブジェクトを集約の中にまとめ、各集約の周囲に境界を定義すること。 各集約に対してルートとなるエンティティを1つ選び、境界の内部に存在するオブジェクトへのアクセスは、そのルートを経由して制御すること。 外部のオブジェクトが参照を保持できるのは、ルートのみとすること。 内部のメンバに対する一時的な参照を渡してよいのは、単一の操作で使用する時だけだ。ルートがアクセスを制御するので、内部が知らないうちに変更されることはなくなる。 この取り決めにより、どんな状態変化においても、集約内にあるオブジェクトと集約全体に対して、不変条件をすべて強制することが現実的になる。