ドメイン駆動設計入門

ドメイン駆動設計とは

ドメイン駆動設計は、ソフトウェア設計をドメイン(事業活動)で駆動することにより、設計の基本方針からソースコードに至るまで、ソフトウェアと事業活動を整合させようとする考え方。システム全体をいくつかの要素に分割し、構成要素同士を繋ぐ方法を事業理解に基づいて実施し、ソースコードも業務の言語を用いて事業活動を反映するようにする。

ソフトウェアと事業活動を整合させることで、事業の成長を支えるためのソフトウェアの変更が簡単かつ安全に実施できるようになり、事業の成長に貢献できる。

事業活動の分析

現実の開発では、大規模なシステムのすべてをうまく設計することはできない。そこで、まずは事業活動を業務領域に分解し、それぞれの業務領域を「中核の業務領域」、「一般的な業務領域」、「補完的な業務領域」に分類する。そして、ドメイン駆動設計を適用する恩恵が大きい「中核の業務領域」に集中することが重要になる。

中核的な業務領域

競合他社との違いを実現し、利益を生み出す業務領域。競争優位を生み出すために、本質的に複雑で変化が多い。当然自社で実装する必要があり、ドメイン駆動設計を適用する恩恵が大きい。例えば、Googleにとっての検索アルゴリズムなど。

一般的な業務領域

どの会社でも必要になる業務領域。多くの場合、複雑で変化が少なく、既存の製品や外部サービスを利用して解決できる。例えば、認証や認可といった機能など。

補完的な業務領域

直接利益を生み出すことはないが、事業活動を支えている業務領域。単純で課題の解決手段がはっきりしていて、変化も少ない。自社で実装する必要があるが、ドメイン駆動設計を適用する恩恵は小さい。例えば、CRUD機能など。

ドメイン駆動設計のための道具

ソフトウェアと事業活動を整合させるために重要になる概念に、ユビキタス言語(共通言語)、ドメインモデル、境界づけられたコンテキスト、コンテキストマップがある。

ユビキタス言語(共通言語)

業務エキスパートから翻訳者を介してソフトウェア開発者に知識を一方的に伝達する伝言ゲームのような伝統的なやり方では、必ず情報が欠落してソフトウェアと事業活動を整合させることができない。利害関係者全員(業務エキスパート、ソフトウェア開発者を含む)がいつでもどこでも誰でも、ユビキタス言語(共通言語)を使うことによって初めてソフトウェアと事業活動を整合させる事が可能になる。

ドメインモデル

ドメインモデルは事業理解の概念やルールを整理して、事業活動をモデルとして表現したもの。ユビキタス言語を用いて構成され、ソフトウェアと事業活動の橋渡しをする役割を担う。

境界づけられたコンテキスト

一般的に、言語は文脈によって異なる意味を持つ。ユビキタス言語も特定の文脈のみで意味を持ち、その範囲を境界づけられたコンテキスと呼ぶ。境界づけられたコンテキストをどう選ぶかは設計判断であり、その境界はユビキタス言語の境界であり、ドメインモデルの境界であり、システムの物理的な境界であり、所有権の境界である。

事業理解が不十分であったり、要求が頻繁に変わったりして、境界をまたいだ変更が必要になる場合がある。境界をまたいだ変更には大きなコストが発生し、特にそれぞれの境界づけられたコンテキストを別々のチームが担当している場合は顕著である。そのため、経験則として、なるべく広い範囲を境界とするところから始め、事業理解が深まってドメインモデルが出来上がってからより小さく境界を引くようにするすると良い。

コンッテキストマップ

コンテキストマップは、境界づけられたコンテキストどうしがどのように連携しているのか示した図。システム全体をどう切り分けているのかを視覚化することで価値のある洞察が得られることもある。

境界づけられたコンテキストどうしの連携方法には以下のようなものがある。

  • 良きパートナー 一方のコンテキストで変更が生じたとき、もう一方は協力的に臨機応変にその変更に対応する。双方向の協力関係。
  • モデルの共有 コンテキストどうしが一部モデルを共有する。共有するモデルは必要最小限にし、どちらのコンテキストにも必須な部分に限定する。
  • 従属 上流のコンテキストで変更が生じたとき、下流のコンテキストが従属的にそのモデルに従って変更に対応する。一方向の従属関係。
  • モデル変換装置 上流のコンテキストで変更が生じたとき、下流のコンテキスト側でモデル変換装置を用意して、自分のモデルに合うように変換することによって変更に対応する。一方向の従属関係。
  • 共有サービス 上流のコンテキストで変更が生じても、その影響が下流に伝搬しないように上流のコンテキスト側で対応する。
  • 互いに独立 そもそも連携しない。連携するより重複して実装したほうがコストが小さい場合は連携しないことも一つの選択肢になる。
  • 以下はシステム全体の関係を示したコンテキストマップの例である。

    Notion Image

    ドメイン駆動設計の概略

    ドメイン駆動設計では、まず共通言語(ユビキタス言語)を定義し、それを用いて円滑なコミュニケーションを実現し、ドメインモデルの作成、アプリケーションの設計・実装を行っていく。ドメインモデルをソースコードにそのまま表現(マッピング)することにより、事業活動とソフトウェアを整合させることで、事業の変化とともにソフトウェアを成長させることを可能にする。

    Notion Image

    事業理解を深めつつ、ドメインモデルを継続的に改善し、その変更内容を即時ソフトウェアに反映させることで、事業の成長に貢献するソフトウェアを構築できる。

    参考資料



    著者画像

    ゆうき

    2018/04からITエンジニアとして活動、2021/11から独立。主な使用言語はPython, TypeScript, SAS, etc.