Summary
- DDDの集約(Aggregate)設計ルールに基づくコードレビュー・設計支援・リファクタリングを行う。
- Evans Rules、Vernon's 4 Rules、Design by Contractに基づき、集約の境界定義、不変条件の検証、
- 不変(Immutable)設計、ID参照、結果整合性、ドメインイベント連携を包…
j5ik2o/okite-ai
DDDの集約(Aggregate)設計ルールに基づくコードレビュー・設計支援・リファクタリングを行う。 Evans Rules、Vernon's 4 Rules、Design by Contractに基づき、集約の境界定義、不変条件の検証、 不変(Immutable)設計、ID参? 以下のいずれかに該当する場合は? - 集約(Aggregate)の新規設計・実? - 既存の集約やエンティティクラスのDDD観点でのコードレビュー - 集約の境界決定(「AとBは同じ集約にすべきか?」「この集約は大きすぎるか?」) - 集約? - 集約間の連携方式の判断(ドメインイベント、結果整合性、Sagaパターン) - 可変(M…
npx skills add j5ik2o/okite-ai --skill aggregate-design
Related neighbors and high-traction skills in the same topics — useful to compare before installing.
Guidance for distinctive, intentional visual design when building new UI or reshaping an existi…
866.4K installsBrowser automation CLI for AI agents. Use when the user needs to interact with websites, includ…
810.4K installsReview UI code for Web Interface Guidelines compliance. Use when asked to "review my UI", "chec…
617.3K installsBuild, deploy, evaluate, optimize, fine-tune, and manage Microsoft Foundry agents, models, and …
576.5K installsDebug Azure production issues on Azure using AppLens, Azure Monitor, resource health, and safe …
568.9K installsOther skills from j5ik2o/okite-ai · top by installs.
npx skills add j5ik2o/okite-ai
Declared targets from SKILL.md / docs. Unmarked agents are not listed — the skill may still install via the CLI.
main
Files included with this skill beyond the listing page.
SKILL.md
11,254 B
SUMMARY.md
1,325 B
DDDにおける集約(Aggregate)設計の原則。
集約 = 整合性の境界
┌─────────────────────────────────────┐
│ Car集約 │
│ ┌──────────────────────────────┐ │
│ │ Car (集約ルート) │ │
│ │ - carId: CarId │ │
│ │ - tires: List[Tire] │ │
│ │ - engine: Engine │ │
│ └──────────────────────────────┘ │
│ ↓ 所有 ↓ 所有 │
│ ┌──────────┐ ┌─────────┐ │
│ │ Tire │ × 4 │ Engine │ │
│ │ (VoかEnt)│ │ (VoかEnt)│ │
│ └──────────┘ └─────────┘ │
└─────────────────────────────────────┘
集約は契約に基づいて設計する。
| 契約 | 説明 | 責任 |
|---|---|---|
| 事前条件 (Precondition) | メソッド呼び出し前に満たすべき条件 | 呼び出し側 |
| 事後条件 (Postcondition) | メソッド実行後に満たされる条件 | 実装側 |
| 不変条件 (Invariant) | 常に満たすべき条件 | 実装側 |
詳細な言語別実装パターンは [references/typescript.md](references/typescript.md)、[references/scala.md](references/scala.md)、[references/rust.md](references/rust.md)、[references/python.md](references/python.md) を参照。
現代においては不変(Immutable)を推奨する。特に理由がなければ不変。 状態更新時は既存値を引き継ぎ、変更するフィールドだけを上書きする。 これにより、フィールド追加時の修正漏れを防ぎ、更新意図が明確になる。
| 言語 | 不変更新パターン |
|---|---|
| TypeScript | Props型 + ...this.props スプレッド構文 |
| Scala | case class + copy() |
| Rust | struct + ..self 構造体更新構文 |
| Python | dataclass(frozen=True) + replace() |
集約は一つの強い整合性境界。集約内部の状態はすべてその集約の管理下に置く。
集約内部に別の集約の参照を保持しない。他の集約と関連を持つ場合はIDで間接参照する。
基本コンストラクタですべての状態を初期化する。オーバーロードする場合も必ず基本コンストラクタを利用する補助コンストラクタとして設計する。
可変オブジェクトを保持する場合、外部に返す際は必ずコピーを返すか不変オブジェクトに変換する。
どのような操作をされても不正な状態に陥ってはならない。不変な集約では基本コンストラクタで保護する。
集約内部のエンティティや値オブジェクトへの直接アクセスは、必ず集約ルートを経由する。
単一のトランザクションで複数の集約を更新しない。集約間の整合性は結果整合性で担保する。
大きすぎる集約は並行性の問題(ロック競合)を引き起こす。真に一貫性が必要な範囲のみを含める。
集約の状態変更時にドメインイベントを発行し、他の集約や外部システムはそれを購読して反応する。
並行更新の衝突検出が必要な場合にのみ、バージョン番号を持たせる。要件がなければ不要。
集約はドメインロジックに集中し、どう保存されるかは関知しない(リポジトリの責務)。
DDDの原典からの集約ルール。
集約ルートだけがリポジトリから直接取得できる。
境界内のエンティティはローカルな識別子を持つ。それは集約内でのみ一意であればよい。
「実践ドメイン駆動設計」からの設計ルール。
Design aggregates based on true invariants (整合性境界の中で真の不変条件を担保)
良い例:Order集約
- 注文合計 = 各明細の小計の合計(真の不変条件)
- この計算は即座に正しくなければならない
悪い例:結果整合性で十分な場合
- 在庫数の更新は別の集約で結果整合性
Keep aggregates small(集約は小さく)
大きな集約の問題:
❌ Bad: 大きな集約
Product集約
├── productId
├── name
├── backlogItems: List[BacklogItem] ← 数百件になる可能性
└── ...
✅ Good: 分割した集約
Product集約 BacklogItem集約
├── productId ├── backlogItemId
├── name ├── productId(IDで参照)
└── ... └── ...
Reference other aggregates by ID only(他の集約はIDで参照)
前述の「他集約への間接参照」と同じ原則。
Use eventual consistency outside the boundary(境界外は結果整合性)
既存の集約をレビューする際に使用する。
このスキルを使用する際は、以下のスキルも併せて参照すること:
domain-building-blocks: 集約を構成する要素(値オブジェクト、エンティティ、ドメインサービス)の設計aggregate-transaction-boundary: 集約とトランザクション境界の関係(1トランザクション=1集約ルール)cross-aggregate-constraints: 集約間の制約チェックと結果整合性の設計repository-placement: 集約のリポジトリインターフェースの配置場所