domain-driven-design について
ビジネスドメインを軸にソフトウェアをモデル化する開発者向けのドメイン駆動設計スキルです。主要概念、戦術的な構成要素、ドメインモデルとコンテキスト間の関係を整理する戦略パターンを扱います。
主な機能
- 01ユビキタス言語と境界づけられたコンテキスト
- 02コンテキストマップ
- 03エンティティと値オブジェクト
- 04集約とリポジトリ
- 05ドメインイベントと戦略パターン
活用シーン
- 01ドメインモデルの境界定義
- 02エンティティと不変な値オブジェクトのモデル化
- 03集約の永続化の整理
- 04コンテキスト間の関係の把握
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ dralgorhythm/ claude-agentic-framework --skill domain-driven-designインストール後、Claude Code で/domain-driven-designを入力して読み込まれたか確認します。
詳細
ドメイン駆動設計
コア概念
ユビキタス言語
ドメインの専門家と同じ用語を使います。コードは業務文書のように読めるべきです。
境界づけられたコンテキスト
特定のドメインモデルが定義され、適用される境界です。
コンテキストマップ
境界づけられたコンテキスト同士の関係を示します。
構成要素
エンティティ
時間が経過しても変わらない識別子を持ちます。同一性は ID に基づきます。
class User {
constructor(
public readonly id: UserId,
public email: Email,
public name: string
) {}
}
値オブジェクト
不変で、等価性は属性に基づきます。
class Email {
private constructor(public readonly value: string) {}
static create(value: string): Email {
if (!value.includes('@')) {
throw new Error('Invalid email');
}
return new Email(value);
}
equals(other: Email): boolean {
return this.value === other.value;
}
}
集約
ルートエンティティを持つ、エンティティと値オブジェクトのまとまりです。
class Order { // Aggregate Root
private items: OrderItem[] = [];
addItem(product: ProductId, quantity: number): void {
// Business rules enforced here
this.items.push(new OrderItem(product, quantity));
}
get total(): Money {
return this.items.reduce((sum, item) => sum.add(item.subtotal), Money.zero());
}
}
リポジトリ
集約のデータアクセスを抽象化します。
interface OrderRepository {
findById(id: OrderId): Promise<Order | null>;
save(order: Order): Promise<void>;
}
ドメインイベント
ドメインで起きた出来事です。
class OrderPlaced {
constructor(
public readonly orderId: OrderId,
public readonly userId: UserId,
public readonly occurredAt: Date
) {}
}
戦略的パターン
腐敗防止層
自分のモデルと外部システムとの間で変換します。
共有カーネル
コンテキスト間で共有するドメインモデルのサブセットです。
顧客・供給者
上流が下流の必要とするものを提供します。
コメント
Markdown 対応