Javaにおける腐敗防止層パターン:レガシーシステムにおけるシステムの整合性を確保する
別名
- ACL
- インターフェース層
- 変換層
腐敗防止層デザインパターンの目的
腐敗防止層(ACL)は、特にシステム統合とデータ整合性の維持のために、Java開発において重要なデザインパターンです。セマンティクスを共有しない異なるサブシステム間にファサードまたはアダプター層を実装します。これは、異なるデータ形式とシステム間を変換し、システム間の統合がビジネスロジックまたはデータ整合性の破損につながらないようにします。
現実世界の例を用いた腐敗防止層パターンの詳細な説明
現実世界の例
この例は、腐敗防止層がレガシーシステムと最新プラットフォーム間のシームレスな統合をどのように保証するかを示しており、システム移行中のビジネスロジックの整合性を維持するために重要です。
在庫管理システムを古いレガシーソフトウェアから新しい最新プラットフォームに移行している大規模な小売企業を想像してみてください。レガシーシステムは数十年にわたって使用されており、新しいシステムと互換性のない複雑なビジネスルールとデータ形式が含まれています。新しいシステムをレガシーシステムに直接接続する代わりに、企業は腐敗防止層(ACL)を実装します。
ACLはメディエーターとして機能し、2つのシステム間でデータを変換および調整します。新しいシステムが在庫データを要求すると、ACLは要求をレガシーシステムが理解できる形式に変換し、データを取得してから、新しいシステムに適した形式に 다시 変換します。このアプローチにより、新しいシステムはレガシーシステムの複雑さの影響を受けないようにし、データとビジネスロジックの破損を防ぎながら、スムーズな移行を促進します。
簡単な言葉で
腐敗防止層デザインパターンは、仲介変換層を提供することにより、システムを外部システムの複雑さと変化から保護します。
Microsoftのドキュメントによると
同じセマンティクスを共有しない異なるサブシステム間にファサードまたはアダプター層を実装します。この層は、一方のサブシステムが他方のサブシステムに対して行うリクエストを変換します。このパターンを使用して、アプリケーションの設計が外部サブシステムへの依存関係によって制限されないようにします。このパターンは、Eric Evansによってドメイン駆動設計で最初に説明されました。
Javaにおける腐敗防止層パターンのプログラム例
JavaのACLデザインパターンは、データ形式を変換する中間層を提供し、異なるシステム間の統合がデータの破損につながらないようにします。
Legacy
とModern
の2つのショップ注文システムがあります。
前述のシステムは異なるドメインモデルを持っており、同時に動作する必要があります。それらは独立して動作するため、注文はLegacy
システムまたはModern
システムのいずれかから来ることができます。そのため、legacyOrderを受け取るシステムは、legacyOrderが有効であり、他のシステムに存在しないことを確認する必要があります。その後、legacyOrderを独自のシステムに配置できます。
しかし、そのためには、システムは他のシステムのドメインモデルを知る必要があり、それを避けるために、腐敗防止層(ACL)が導入されます。ACLは、Legacy
システムのドメインモデルをModern
システムのドメインモデルに変換する層であり、その逆も同様です。また、他のシステムとの他のすべての操作を隠蔽し、システムの結合を解除します。
Legacy
システムのドメインモデル
public class LegacyOrder {
private String id;
private String customer;
private String item;
private String qty;
private String price;
}
Modern
システムのドメインモデル
public class ModernOrder {
private String id;
private Customer customer;
private Shipment shipment;
private String extra;
}
public class Customer {
private String address;
}
public class Shipment {
private String item;
private String qty;
private String price;
}
腐敗防止層
public class AntiCorruptionLayer {
@Autowired
private ModernShop modernShop;
@Autowired
private LegacyShop legacyShop;
public Optional<LegacyOrder> findOrderInModernSystem(String id) {
return modernShop.findOrder(id).map(o -> /* map to legacyOrder*/);
}
public Optional<ModernOrder> findOrderInLegacySystem(String id) {
return legacyShop.findOrder(id).map(o -> /* map to modernOrder*/);
}
}
システム間の接続。Legacy
システムまたはModern
システムが対応するものと通信する必要がある場合は、現在のドメインモデルの破損を避けるためにACLを使用する必要があります。以下の例は、Legacy
システムがModern
システムからの検証で注文を配置する方法を示しています。
public class LegacyShop {
@Autowired
private AntiCorruptionLayer acl;
public void placeOrder(LegacyOrder legacyOrder) throws ShopException {
String id = legacyOrder.getId();
Optional<LegacyOrder> orderInModernSystem = acl.findOrderInModernSystem(id);
if (orderInModernSystem.isPresent()) {
// order is already in the modern system
} else {
// place order in the current system
}
}
}
Javaで腐敗防止層パターンを使用する場合
このパターンを使用する場合
- 複数段階にわたる移行が計画されていますが、新規システムとレガシーシステム間の統合を維持する必要がある場合
- 2つ以上のサブシステムが異なるセマンティクスを持っているが、それでも通信する必要がある場合
- レガシーシステムまたは外部システムと統合する場合、直接統合すると新しいシステムのドメインモデルが汚染される可能性がある場合
- 大規模システム内の異なるサブシステムが異なるデータ形式または構造を使用している場合
- メンテナンスとスケーラビリティを容易にするために、異なるサブシステムまたは外部サービス間の疎結合を確保する必要がある場合
腐敗防止層パターン Javaチュートリアル
Javaにおける腐敗防止層パターンの実際のアプリケーション
- 個々のサービスが互いのデータスキーマに緊密に結合されることなく通信する必要があるマイクロサービスアーキテクチャ
- エンタープライズシステム統合、特に最新のシステムとレガシーシステムを統合する場合
- ドメイン駆動設計(DDD)内の境界付けられたコンテキストで、外部システムまたはサブシステムと対話するときにドメインモデルの整合性を維持するため
腐敗防止層パターンの利点とトレードオフ
利点
- 明確な境界を提供することにより、ドメインモデルの整合性を保護します
- システム間の疎結合を促進し、外部システムの変更に対するシステムの耐障害性を高めます
- 統合コードをビジネスロジックから分離することにより、よりクリーンで保守しやすいコードを促進します
トレードオフ
- 変換プロセスにより、複雑さと潜在的なパフォーマンスオーバーヘッドが増加します
- 層がボトルネックになることなく効果的であることを保証するために、設計と実装に特別な労力が必要です
- 注意深く管理しないと、モデルの重複が発生する可能性があります
関連するJavaデザインパターン
- アダプター:腐敗防止層は、アダプターパターンを使用して異なるデータ形式または構造間を変換するために実装できます
- ファサード:腐敗防止層は、異なるサブシステムを分離するために使用されるファサードパターンの特殊な形式と見なすことができます
- ゲートウェイ:腐敗防止層は、統一されたインターフェースを提供するための外部システムへのゲートウェイとして使用できます