ドメイン駆動設計のコンテキストマップ
庄司です。
ドメイン駆動設計の戦略的設計では、システム全体をどのように境界づけられたコンテキストを統合するかを表すコンテキストマップ (Context Map) を描きます。さらに、このコンテキストマップには時間の経過とともに、コンテキストが追加、更新、削除のように修正されていくことも考慮しておく必要があります。
したがって、コンテキストマップは単なる画像としてではなく、git などのバージョン管理ツールで比較が容易なテキストで記述できると便利です。
Context Mapper というツールを使うと、CML というドメイン固有言語でコンテキストマップを記述できます。
ここからの説明では、Context Mapper VS Code Extension や PlantUML 拡張 がインストールされた Visual Studio Code を使用しています。
これらの拡張機能には、Java と Graphviz も必要です。
Graphviz は mac ユーザーであれば、Homebrew を使ってインストールできます。
brew install graphviz
では、実践ドメイン駆動設計 の第3章の図から始めることにしましょう。
この図を描くための CML は次のようになります。
ContextMap {
type SYSTEM_LANDSCAPE
contains A_Context, B_Context, C_Context
A_Context -> B_Context
A_Context -> C_Context
B_Context -> C_Context
}
BoundedContext A_Context
BoundedContext B_Context
BoundedContext C_Context
コンテキスト間の矢印によって、U (Upstream) と D (Downstream) の関係が表現されます。
Upstream、Downstream 以外の統合パターンもサポートされています。
- パートナーシップ (Partnership)
- 共有カーネル (Shared Kernel)
- 顧客/供給者 (Customer/Supplier)
- 順応者 (Conformist)
- 腐敗防止層 (Anticorruption Layer)
- 公開ホストサービス (Open Host Service)
- 公表された言語 (Published Language)
上のいくつかが含まれる図の例です。
この図を描くための CML は次のようになります。
ContextMap {
type SYSTEM_LANDSCAPE
contains AuthContext
contains CollaborationContext
contains AgileProjectManagementContext
AuthContext [OHS,PL] -> [ACL] CollaborationContext
AuthContext [OHS,PL] -> [ACL] AgileProjectManagementContext
CollaborationContext [OHS,PL] -> [ACL] AgileProjectManagementContext
}
BoundedContext AuthContext
BoundedContext CollaborationContext
BoundedContext AgileProjectManagementContext
さらに上の定義をPlantUMLで出力したイメージは次のようになります。
CML を使って、ドメイン (Domain) やサブドメイン (Subdomain) の定義もできます。
まとめ
#描画ツールではなく、Context Mapper を利用することで、保守性が高く、コンテキストマップとしてだけでなく、その先のドメインの構造を表す UML が出力できるため非常に価値のあるツールと考えています。