腐敗防止層とは
腐敗防止層(Anti-Corruption Layer)は、ある境界付けられたコンテキストのモデルが、
外部コンテキストのモデルによって「腐敗」するのを防ぐための重要な設計パターンです。
図の場合ですと、プロデューサー側のユビキタス言語の変更によって、
コンシューマー側が影響を受けないようにするため。
具体的には、外部コンテキストとの間に「翻訳者」として機能する層を設けます。
この層は、主に以下の設計パターンやコンポーネントを組み合わせて実装されます。
主な設計パターンと役割
腐敗防止層の設計では、外部システムの複雑さや自システムとの違いを吸収するために、
いくつかのデザインパターンがよく利用されます。
Facade(ファサード)
外部システムの複雑なAPI群を、自コンテキストにとって使いやすい、よりシンプルな単一の窓口(インターフェース)にまとめます。
外部システムの内部構造を隠蔽する役割を果たします。
Adapter(間接化)
外部システムのインターフェースを、自コンテキストが要求するインターフェースに変換します。
例えば、メソッド名や引数の型が異なる場合、このアダプタが間に入って吸収します。
Translator(トランスレータ)
2つのコンテキスト間で交換されるオブジェクトやデータを相互に変換する通訳者。
例えば、外部コンテキストのProductオブジェクトを、自コンテキストのItemというドメインオブジェクトに変換する責務を持ちます。
図の場合でいうと、流通コンテキストが外部コンテキストで、
そこのコンテキストでは、商品は【Product】と呼ばれており、
自コンテキストでは、商品は【Item】と呼ばれているとしましょう。
そして、図の斜線が、認知領域での境界、つまりコンテキスト境界です。
実装コンポーネントの例
腐敗防止層は、具体的に以下のようなクラスやインターフェースの集まりとして実装されます。
インターフェース
自コンテキスト側に公開されるインターフェースを定義します。(要求インターフェイス)
このインターフェースは、自コンテキストのユビキタス言語で記述されます。
例えば、外部の顧客管理システムと連携する場合、
「顧客情報をIDで取得する(fetchCustomerById)」ではなく、自コンテキストの言語に合わせて「クライアントをIDで探す(findClientById)」といったメソッド名を定義します。
サービス or ファサード(Service / Facade)
上記で定義したインターフェースを実装するクラスです。
このクラスが腐敗防止層の中心となり、外部システムとの通信やデータ変換のプロセス全体を調整します。
デザインパターンのFacadeと同じメカニズムです。
クライアント(Client)
実際に外部システムのAPI(例: REST API, gRPC)を呼び出す責務を持つクラスです。
通信の詳細(HTTPリクエストの構築、認証、エラーハンドリングなど)はこのクラスが担当します。
データ転送オブジェクト(DTO: Data Transfer Object)
外部システムとやり取りするデータを格納するための単純なオブジェクトです。
外部システムのデータ構造に合わせたDTOを用意します。(例: ExternalCustomerDto)
マッパー or トランスレータ(Mapper / Translator)
外部システムのDTOと、自コンテキストのドメインオブジェクト(または値オブジェクト)を相互に変換する責務を持つクラスです。
ExternalCustomerDto を自コンテキストの Client オブジェクトに変換したり、その逆の変換を行います。
処理の流れ(例:外部からデータを取得する場合)
[自コンテキストのアプリケーション層] → [1. 腐敗防止層のインターフェース呼び出し]
→ [2. サービス/ファサード] → [3. クライアントで外部API呼び出し] → [4. DTOでデータ受信]
→ [5. マッパーでドメインオブジェクトに変換] → [6. 自コンテキストへ返却]
まとめ
このように、腐敗防止層は自コンテキストと外部コンテキストの間に明確な境界を作り、
外部の変更が自コンテキストのコアなドメインモデルに直接的な影響を与えることを防ぎます。これにより、システムの保守性と独立性を高めることができます。