Design
flow
DDD
engineer
frontend

ドメイン駆動設計の基本原則

自己紹介

フルスタックエンジニアのk-okinaです。
最近DDDを学習しているのですが、ビジネスエキスパートである人へEric Evans氏のDDDのビデオを見せたらとてもわかりやすく解説してくれて感激したのでシェアします。

ドメイン駆動設計の定義

Eric Evans氏はDDDとは以下4つの原則からなると説明しています。
その説明をソフトウェアエキスパートが理解し易いよう訳します。

1. Focus on the core complexity and opportunity in the domain

訳: 複雑で解決すると利益のある問題の焦点に集中する。(問題の核心)

2. Explore models in a collaboration of domain experts and software experts

訳: 関連する専門家で協力して問題にアプローチするモデル(仕組み)を作る。

3. Write software that expresses those models explicitly

訳: モデルたちをうまく表現したソフトを作る

4. Speak ubiquitous language within a bounded context

訳: 境界付けられたコンテキストの中の共通言語で話す

補足

例1. これがどういう意味かというと、例えば、ピカチュウと言うとピカチュウと認識します。それは互いに共通するポケモンのコンテキストがあるからです。
しかしポケモンを知らない==ピカチュウは何も意味しない==共通のコンテキストではない
もし相手がポケモンを知っているという前提でピカチュウと言ってしまってポケモンを知らなかった場合はミスコミュニケーション=誤解が発生し、うん????となります。
それを認識することはとても大切です。

例2.

前提:X<Y, 結果:Y-X = +/- はどっちですか?
と、この前提がなかった場合、Y-Xは+/-どっちですか?
Eric Evans氏はこの前提を制限と言っています。
要は前提が言葉の意味を制限しているということです。
それこそドメインにおける境界を決めるかのように。

例3.

ポケモンという前提が、ピカチュウの一つの意味を作っている。
他の国ではピカチュウはあのピカチュウじゃないかもしれない。
あのピカチュウがピカチュウであるというドメインの領域がコンテキストによって定められてる。
この場合、境界=前提=コンテキスト
領域=ドメイン
前提を認識していない=ドメインのズレ、そしてプロジェクトのズレ
つまり、ピカチュウがピカチュウと意味を成す領域がドメインで、そのドメインが有効なのはそのコンテキスト内であると
ポケモンを知ってる人の集団があって、それは抽象的にドメインを構成している

例4.

スクリーンショット 2018-03-05 1.05.54.png
これは日本のドメインです
この中で話されている言葉はこの外では通じません
前提==日本語==コンテキスト
日本語を知っているか知らないかでコンテキストは境界づけられています
しかし、沖縄弁は日本領域内ですが、沖縄でしか通じません
そこにもドメインはあります
しかし、共通のコンテキストがあるので、沖縄の人と大阪の人が一緒に問題解決をしようとした場合、東京弁で会話します
これがEric Evans氏の言う
境界付けられたコンテキストの中の共通言語で話すことです

つまりコンテキストとは

例4で出したように大阪の人沖縄の人2つのドメインが1つのコンテキスト内にあったように、コンテキストとは、ドメインの範囲を決めているものです
ものすごーく簡単に言うと、コンテキストは環境(日本)で、ドメインはその環境内の特定領域(大阪・沖縄など)の事です

最後に

いかがだったでしょうか?
もっとシンプルに説明・補足・追記出来る方いましたら、編集リクエストどしどしお願いします!