ドメイン駆動設計のコンテキストマップ

| 2 min read
Author: shigeki-shoji shigeki-shojiの画像

庄司です。

ドメイン駆動設計の戦略的設計では、システム全体をどのように境界づけられたコンテキストを統合するかを表すコンテキストマップ (Context Map) を描きます。さらに、このコンテキストマップには時間の経過とともに、コンテキストが追加、更新、削除のように修正されていくことも考慮しておく必要があります。

したがって、コンテキストマップは単なる画像としてではなく、git などのバージョン管理ツールで比較が容易なテキストで記述できると便利です。

Context Mapper というツールを使うと、CML というドメイン固有言語でコンテキストマップを記述できます。

ここからの説明では、Context Mapper VS Code ExtensionPlantUML 拡張 がインストールされた 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 が出力できるため非常に価値のあるツールと考えています。

参考

#
豆蔵デベロッパーサイト - 先週のアクセスランキング
  1. 基本から理解するJWTとJWT認証の仕組み (2022-12-08)
  2. AWS認定資格を12個すべて取得したので勉強したことなどをまとめます (2022-12-12)
  3. Nuxt3入門(第4回) - Nuxtのルーティングを理解する (2022-10-09)
  4. Nuxt3入門(第1回) - Nuxtがサポートするレンダリングモードを理解する (2022-09-25)
  5. Nuxt3入門(第8回) - Nuxt3のuseStateでコンポーネント間で状態を共有する (2022-10-28)
  6. Jest再入門 - 関数・モジュールモック編 (2022-07-03)
  7. 自然言語処理初心者が「GPT2-japanese」で遊んでみた (2022-07-08)
  8. IoT を使ってみる(その6:MQTTブローカー Mosquitto編) (2022-10-08)
  9. Nuxt3入門(第3回) - ユニバーサルフェッチでデータを取得する (2022-10-06)
  10. 統計学で避けて通れない自由度の話 (2022-06-20)