腐敗防止層
レガシーシステムと新システムの間に変換層を設け、新システムの設計を汚染から守るパターン
DDD設計パターン
腐敗防止層とは
腐敗防止層 (Anti-Corruption Layer, ACL) は、Eric Evans が DDD で提唱したパターンで、レガシーシステムと新システムの間に変換層を設け、新システムの設計をレガシーの影響から守る。
なぜ必要か
| 問題 | 説明 |
|---|---|
| レガシーのデータモデルが汚い | 新システムに不要なフィールドが混入 |
| API の互換性 | レガシーの API 変更が新システムに波及 |
| 用語の不一致 | レガシーの customer と新システムの user |
| 段階的移行 | 一度に全て置き換えられない |
ACL の構造
新システム → [ACL (変換層)] → レガシーシステム
↑
レガシーのデータモデルを
新システムのドメインモデルに変換
TypeScript での実装
// レガシー API のレスポンス (汚いモデル)
interface LegacyOrder {
ord_id: string;
cust_name: string;
ord_amt: number;
ord_stat: 'A' | 'C' | 'X';
}
// 新システムのドメインモデル (きれいなモデル)
interface Order {
id: string;
customerName: string;
amount: number;
status: 'active' | 'completed' | 'cancelled';
}
// ACL: レガシー → ドメインモデルに変換
function toOrder(legacy: LegacyOrder): Order {
const statusMap = { A: 'active', C: 'completed', X: 'cancelled' } as const;
return {
id: legacy.ord_id,
customerName: legacy.cust_name,
amount: legacy.ord_amt,
status: statusMap[legacy.ord_stat],
};
}
ACL vs アダプター
| 観点 | ACL | アダプター |
|---|---|---|
| 目的 | ドメインモデルの保護 | インターフェースの変換 |
| スコープ | 境界づけられたコンテキスト間 | モジュール間 |
| DDD | ✅ DDD の概念 | GoF のパターン |
いつ使うか
| ケース | 推奨 |
|---|---|
| レガシーシステムとの統合 | ✅ ACL |
| 段階的なマイグレーション | ✅ ACL |
| 外部 API との統合 | ✅ ACL |
| 内部モジュール間 | アダプターで十分 |
現場での応用を知るには関連書籍も役立つ。