domain-driven-design
エンティティ、値オブジェクト、集約、ドメインサービス、リポジトリ、仕様、境界づけられたコンテキストなど、複雑なビジネスモデリングに対応するDDDの戦術的パターンを提供します。PythonのdataclassによるImplementationとTypeScriptの代替実装に対応しており、リッチなドメインモデルの構築、不変条件の強制、またはドメインロジックとインフラストラクチャの分離が必要な際に活用してください。
description の原文を見る
DDD tactical patterns for complex business modeling including entities, value objects, aggregates, domain services, repositories, specifications, and bounded contexts. Python dataclass implementations with TypeScript alternatives. Use when building rich domain models, enforcing invariants, or separating domain logic from infrastructure.
SKILL.md 本文
Domain-Driven Design 戦術パターン
エンティティ、値オブジェクト、境界付けられたコンテキストで複雑なビジネスドメインをモデル化します。
概要
- 複雑なビジネスロジックのモデリング
- ドメインとインフラストラクチャの分離
- サブドメイン間の明確な境界の確立
- ビジネスロジックを含むリッチドメインモデルの構築
- ユビキタス言語をコードに実装
ビルディングブロック概要
┌─────────────────────────────────────────────────────────────┐
│ DDD Building Blocks │
├─────────────────────────────────────────────────────────────┤
│ ENTITIES VALUE OBJECTS AGGREGATES │
│ Order (has ID) Money (no ID) [Order]→Items │
│ │
│ DOMAIN SERVICES REPOSITORIES DOMAIN EVENTS │
│ PricingService IOrderRepository OrderSubmitted │
│ │
│ FACTORIES SPECIFICATIONS MODULES │
│ OrderFactory OverdueOrderSpec orders/, payments/ │
└─────────────────────────────────────────────────────────────┘
クイックリファレンス
エンティティ(アイデンティティを持つ)
from dataclasses import dataclass, field
from uuid import UUID
from uuid_utils import uuid7
@dataclass
class Order:
"""Entity: アイデンティティを持つ、可変状態、ライフサイクル。"""
id: UUID = field(default_factory=uuid7)
customer_id: UUID = field(default=None)
status: str = "draft"
def __eq__(self, other: object) -> bool:
if not isinstance(other, Order):
return NotImplemented
return self.id == other.id # アイデンティティによる等値性
def __hash__(self) -> int:
return hash(self.id)
完全なパターンについては Read("${CLAUDE_SKILL_DIR}/references/entities-value-objects.md") を参照してください。
値オブジェクト(イミュータブル)
from dataclasses import dataclass
from decimal import Decimal
@dataclass(frozen=True) # 必ずfrozen=True!
class Money:
"""Value Object: 属性によって定義され、アイデンティティではない。"""
amount: Decimal
currency: str
def __add__(self, other: "Money") -> "Money":
if self.currency != other.currency:
raise ValueError("Cannot add different currencies")
return Money(self.amount + other.amount, self.currency)
Address、DateRangeの例については Read("${CLAUDE_SKILL_DIR}/references/entities-value-objects.md") を参照してください。
重要な判断
| 判断 | 推奨事項 |
|---|---|
| エンティティ vs 値オブジェクト | 一意なID + ライフサイクルがある? エンティティ。それ以外は値オブジェクト |
| エンティティの等値性 | IDで比較、属性では比較しない |
| 値オブジェクトの可変性 | 常にイミュータブル(frozen=True) |
| リポジトリのスコープ | アグリゲートルートごとに1つ |
| ドメインイベント | エンティティで収集、永続化後に発行 |
| コンテキスト境界 | 技術的ではなく、ビジネス機能によって分ける |
ルールクイックリファレンス
| ルール | 影響 | カバー範囲 |
|---|---|---|
aggregate-boundaries (${CLAUDE_SKILL_DIR}/rules/aggregate-boundaries.md を参照) | 高 | アグリゲートルート設計、IDによる参照、トランザクションごとに1つ |
aggregate-invariants (${CLAUDE_SKILL_DIR}/rules/aggregate-invariants.md を参照) | 高 | ビジネスルール強制、スペシフィケーションパターン |
aggregate-sizing (${CLAUDE_SKILL_DIR}/rules/aggregate-sizing.md を参照) | 高 | 適切なサイズ設定、分割のタイミング、最終的一貫性 |
使用してはいけない場合
エンティティが5個未満? DDDは全く使わないでください。儀式のコストが利益より大きいです。
| パターン | インタビュー | ハッカソン | MVP | 成長期 | エンタープライズ | よりシンプルな代替案 |
|---|---|---|---|---|---|---|
| アグリゲート | オーバーキル | オーバーキル | オーバーキル | 選択的 | 適切 | 検証付きの普通のdataclass |
| 境界付けられたコンテキスト | オーバーキル | オーバーキル | オーバーキル | 境界線上 | 適切 | 明確なインポートを持つPythonパッケージ |
| CQRS | オーバーキル | オーバーキル | オーバーキル | オーバーキル | 正当化されたとき | 読み取り/書き込みの単一モデル |
| 値オブジェクト | オーバーキル | オーバーキル | 境界線上 | 適切 | 必須 | エンティティの型付きフィールド |
| ドメインイベント | オーバーキル | オーバーキル | オーバーキル | 選択的 | 適切 | サービス間の直接メソッド呼び出し |
| リポジトリパターン | オーバーキル | オーバーキル | 境界線上 | 適切 | 必須 | サービスレイヤーの直接ORM クエリ |
経験則: DDDはコード量が約40%増加します。ドメイン複雑性が本当に要求する場合のみ価値があります(複数オブジェクト間で広がる不変条件を持つ5個以上のエンティティ)。CRUDアプリでDDDを使用することは赤信号です。
アンチパターン(禁止)
# 決してドメインモデルを貧血化させてはいけません(データのみのクラス)
@dataclass
class Order:
id: UUID
items: list # 間違い - ビジネスロジックがない!
# インフラストラクチャをドメインに漏らしてはいけません
class Order:
def save(self, session: Session): # 間違い - DBのことを知っている!
# イミュータブルでない値オブジェクトを使用してはいけません
@dataclass # 間違い - frozen=True がない
class Money:
amount: Decimal
# リポジトリがORMモデルを返してはいけません
async def get(self, id: UUID) -> OrderModel: # 間違い - ドメイン型を返す!
関連スキル
aggregate-patterns- アグリゲート設計の詳細な掘り下げork:distributed-systems- アグリゲート間の調整ork:database-patterns- DDDのためのスキーマ設計
参考資料
Read("${CLAUDE_SKILL_DIR}/references/<file>") で必要に応じて読み込んでください:
| ファイル | 内容 |
|---|---|
entities-value-objects.md | エンティティと値オブジェクトの完全なパターン |
repositories.md | リポジトリパターンの実装 |
domain-events.md | イベント収集と発行 |
bounded-contexts.md | コンテキストマッピングとACL |
機能の詳細
entities
キーワード: entity、identity、lifecycle、mutable、domain object 解決内容: Pythonでのエンティティのモデル化、アイデンティティ等値性、ビジネスロジックの追加
value-objects
キーワード: value object、immutable、frozen、dataclass、structural equality 解決内容: イミュータブルな値オブジェクトの作成、VOとエンティティの使い分け
domain-services
キーワード: domain service、business logic、cross-aggregate、stateless 解決内容: ドメインサービスの使用時期、複数アグリゲート間のロジック
repositories
キーワード: repository、persistence、collection、IRepository、protocol 解決内容: リポジトリパターンの実装、DB アクセスの抽象化、ORM マッピング
bounded-contexts
キーワード: bounded context、context map、ACL、subdomain、ubiquitous language 解決内容: 境界付けられたコンテキストの定義、ACLとの統合、コンテキスト関係
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- yonatangross
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/yonatangross/orchestkit / ライセンス: MIT
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。