little hands' lab

ドメイン駆動設計を布教したい

境界づけられたコンテキスト 概念編 - ドメイン駆動設計用語解説 [DDD]

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

公式DDD Referenceの定義は以下の通りです。(和訳はだいぶ意訳しています)

bounded context
A description of a boundary (typically a subsystem, or the work of a particular team) within which a particular model is defined and applicable.
境界づけられたコンテキスト
特定のモデルを定義・適用する境界を明示的に示したもの。
代表的な境界の例は、サブシステムやチームなど。

まぁなかなかよくわからないですよね。DDD用語の中でもかなり難解なワードです。 境界づけられたコンテキストは、2つの観点から解説が必要でしょう。

・概念としての境界づけられたコンテキスト
・境界づけられたコンテキストをどう実装に落としこむか

今回の記事では、概念の方の説明をしたいと思います。

概念としての境界づけられたコンテキスト

モデルの共有

little-hands.hatenablog.com

こちらの記事で書いた通り、ドメイン駆動設計ではすべての人(ソフトウェア開発者、ドメインエキスパート)が同じ意味で言葉を使うことを目指します。

例えば、ECサイトで商品を販売するシステムを考えてみましょう。ここでは、エンジニアと販売管理する人たちの中で、「商品」に関しては同じモデルを共有します。

f:id:little_hands:20171128072027p:plain:w500

エンジニアと販売部のコミュニケーションがうまくいき、「商品」について同じモデル、言葉を共有することができました。

では、販売から配送までをシステム管理したくなったとします。

f:id:little_hands:20171128073511p:plain:w500

おっと、配送部の人は「商品」と言った時に全く別のものをイメージすることがわかりました!

ドメイン駆動設計ではすべての人が同じ意味で言葉を使うことを目指すのではなかったのでしょうか?

それでは強引に、「商品」の概念を統一しましょう。

f:id:little_hands:20171128073415p:plain:w500

『「商品」は売値、在庫数、配送先、配送状況を持ちます』・・・?

なにやらややこしくなってきました。さらに、ドメイン駆動設計ではこれをコードに落とし込むことを目指すので、「商品」の振る舞いを「商品」クラスに詰め込んでいくことに・・・上手くいくイメージが湧きますか?

さらに、請求の管理までをシステム化することになり、カウンターパートとして経理部の人も増えました。当然、経理の人は「商品」に関して違うイメージを持っています。

f:id:little_hands:20171128074424p:plain:w500

さて、すべての人が同じ意味で言葉を使うことを目指す・・・ことは可能でしょうか?

そう、システムが大規模になると、関係者すべてで統一したモデルを作ることは難しくなるのです。

エリック・エヴァンスのドメイン駆動設計で以下のようなことが語られています。

In those younger days we were advised to build a unified model of the entire business, but ドメイン駆動設計 recognizes that we've learned that "total unification of the domain model for a large system will not be feasible or cost-effective"

昔はビジネス全体の統一モデルを構築するようにアドバイスされていたが、ドメイン駆動設計は、「大規模システムのドメインモデルの完全な統合は実現不可能で、費用対効果が低い」と認識しています

そこで、ドメイン駆動設計では大きなシステムを「境界づけられたコンテキスト」に分割し、それぞれの中でモデル、言語の統一を目指すのです。

境界づけられたコンテキストによる分割

f:id:little_hands:20171128084349p:plain:w500

コンテキストを分割することができました!「販売コンテキスト」「配送コンテキスト」それぞれが一つの「境界づけられたコンテキスト」になります。

それぞれのコンテキスト内では、関係者の中で「商品」は必ず同じモデル、用語で統一します。この範囲でなら、モデル、用語を統一することは現実的になりそうですね。

コンテキストマッピング

さて、販売と配送を別のコンテキストとして定義し、「商品」を別のモデルにしましたが、現実的には「商品」は繋がっています。

ということは、このコンテキストをまたいで「商品」をどう扱うかを決めないといけません。

このようなコンテキスト同士の関係性を簡単な図で表すことを、コンテキストマッピングと言います。

f:id:little_hands:20171128090052p:plain:w400

このように
1.モデリング対象を境界づけられたコンテキストで分割する
2.コンテキスト同士の関係をマッピングする という手順を踏むことが、ドメイン駆動設計の第一歩です。

なぜなら、ドメイン駆動設計では、「ドメイン専門家とソフトウェア専門家のコラボレーションでモデルを探求する」ことを目指しますが、「モデル」はまず適用するコンテキストを区切らないと定義できないからです。

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

さて、ここまでで概念はおわかりいただけたと思います。

ただ、「言いたいことはわかった、でも結局どうやって実装するのか全然わからないよ」という状況ですよね?

次の記事ではその実装について書きたいと思います。お楽しみに!

(2017/12/7追記 続編を書きました)

little-hands.hatenablog.com

ドメイン駆動設計連載記事

なぜドメイン駆動設計初心者はググリ出してすぐに心がくじけてしまうのか
ドメイン駆動設計の定義についてEric Evansはなんと言っているのか
モデルでドメイン知識を表現するとは何か
ドメイン駆動設計で実装を始めるのに一番とっつきやすいアーキテクチャは何か
ドメイン駆動 + オニオンアーキテクチャ概略
モデルとは"現実世界を正しく表現したもの"ではないという話