ddd-aggregate について
ドメイン駆動設計の集約パターンを適用するスキルです。トランザクション上の不変条件に基づいてエンティティをまとめ、ルート経由のアクセスと参照方法を決めます。
主な機能
- 01集約境界とルートの定義
- 02トランザクション内での不変条件維持
- 03他の集約を ID で参照
- 04集約サイズとトランザクション範囲の評価
活用シーン
- 01同時に変更するエンティティの判断
- 02オブジェクト参照と ID 参照の選択
- 03ロック競合や過大なトランザクションの調査
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ yonatankarp/ software-design-skills --skill ddd-aggregateインストール後、Claude Code で/ddd-aggregateを入力して読み込まれたか確認します。
詳細
1 行での概要
集約とは、データ変更において単一の単位として扱われるエンティティと値オブジェクトのまとまりです。集約は、所有するルートエンティティを 1 つ持つトランザクション整合性境界です。
このスキルを使う場面
- どのエンティティを 1 つの単位としてまとめるかを決めるとき。
- 「大きなオブジェクト 1 つ」と「関連する複数のオブジェクト」のどちらにするかを選ぶとき。
- 参照ルールを決めるとき:「
OrderはCustomerオブジェクトを保持できるのか、それともcustomerIdだけにすべきなのか?」。 - 集約のサイズに起因するパフォーマンスやロックの問題に対処するとき。
このスキルを使わない場面
- 単一エンティティ内の振る舞いについては、
ddd-entityの領域です。 - コンテキストをまたぐ関係については、
ddd-context-mappingを参照してください。 - イベントを介した集約間の結果整合性については、
ddd-domain-eventを参照してください。
コアコンテンツ
集約には ルート エンティティが 1 つあります。外部のコードが参照を保持できるのはルートだけです。集約内のオブジェクト同士は、自由に相互参照できます。他の集約を参照する場合は、必ず ID のみを使い、オブジェクト参照は使いません。
1 つの集約内では、不変条件が同期的かつトランザクション的に保証されます。2 つのエンティティ間で常に成立する必要があるルールがあるなら、それらのエンティティは同じ集約に属します。ルールの反映に遅延が許容される(結果整合性で問題ない)なら、それぞれを別の集約に置き、ドメインイベントを介して連携できます。
1 つのトランザクションで扱うのは 1 つの集約です。 これが基本ルールです。2 つの集約を読み込んで、1 つのトランザクション内で両方を変更するのは要注意です。通常は集約の境界が適切でないか、処理をコマンドとイベント駆動の後続処理に分割すべきことを示しています。
集約の入口はルートだけです。集約の外部にあるコードはルートのメソッドを呼び出し、必要に応じてルートが内部のエンティティに処理を委譲します。各操作の後に集約の不変条件が保たれるようにする責任は、ルートにあります。
判断のヒント
- 大きな集約より、小さな集約を優先してください。迷ったら分割します。
- 2 つのエンティティを同じトランザクション内で変更する必要がないなら、それぞれ別の集約に属します。
- 2 つのエンティティが、常に同期的に維持すべき不変条件を共有するなら、同じ集約に属します。
- 他の 集約は ID のみで参照してください。
Order内にCustomerオブジェクトへの参照を保持すると、先行読み込みが強制され、トランザクションに関する問題が生じます。
アンチパターン
- ドメインモデルの半分を所有する巨大な集約。変更のたびにあらゆるデータが読み込まれ、ロックの競合が起き、データベーストランザクションが肥大化します。
- 集約をまたぐオブジェクト参照。モデルの大部分がメモリに読み込まれ、永続化が複雑になります。
- ルートを渡して呼び出し元に子要素をたどらせることで、集約の内部に立ち入ること。
- 「集約ルートごと」ではなく「エンティティごと」にリポジトリを作ること。呼び出し元に集約の内部を公開してしまいます。
関連項目
ddd-entity— エンティティは集約を構成する基本要素です。ddd-value-object— 値オブジェクトは集約内に自由にネストできます。ddd-repository— 集約ルートごとに 1 つのリポジトリを設けます。ddd-domain-event— 集約間の整合性はイベントを介して保ちます。ddd-anti-patterns— 巨大な集約と集約間の参照について説明します。
参考文献
- Evans, Domain-Driven Design (2003), 第 6 章(ドメインオブジェクトのライフサイクル)。
コメント
Markdown 対応