ドメイン駆動設計の核心 | これで理解できるドメイン駆動設計!
Prev: レイヤとドメイン駆動設計の関係
ドメイン駆動設計の核心とは何か
ドメイン駆動設計とはでも少し言及しましたが、改めてここでドメイン駆動設計の核心について話そうと思います。
よくドメイン駆動設計で重要なのは戦略的設計だと言われますが、これは正しくありません。戦略的設計は核心とは程遠い、ドメイン駆動設計を実践する上でのオプション項目です。チーム規模やサービス規模によっては、全く気にする必要のないものです。そういう意味でいえば、戦術的設計はドメイン駆動設計を実践する上で避けられないため初学者にとっては戦略的設計より重要度が高い項目になります。
改めてドメイン駆動設計で最も重要度が高い、つまり核心は何かというと「ユビキタス言語」、「モデル駆動設計」、「実践的モデラ」の3つです。戦略的設計が重要だと言っている人は、これら3つが戦略的設計に含まれると勘違いしています。エリック・エヴァンスのドメイン駆動設計があるなら、目次をみてください。お持ちでないなら翔泳社の書籍紹介の目次をみてください。戦略的設計は「第4部 戦略的設計」とあります。ではユビキタス言語などはどこにあるかというと、すべて「第1部 ドメインモデルを機能させる」に書かれています。つまりこの三つは戦略的設計ではないのです。
ユビキタス言語とは何か
ユビキタス言語はビジネスサイドからプロダクトオーナー、エンジニアが話す言葉、作成される資料、コードなどあらゆる場面で同じ言葉を使うようにするというのが簡単な説明になります。
しかし、「あらゆる場面で同じ表現を利用する」と言った方がより正確です。「同じ言葉」ではなく「同じ表現」というのがポイントです。つまり、言葉の単語だけではなくビジネスルールのワンフレーズやドメインモデルの表現、ドメインモデルの構造など、分析の結果作成されたあらゆるものを業務上のコミュニケーション、作成される資料、コード上の表現などあらゆる場所で同じ表現を利用するというのがユビキタス言語です。
ユビキタス”言語”なのに図も含むことに疑問を持つ人は、UMLがUnified Modeling Language=統一モデリング言語であることを例にあげれば十分でしょうか。英語には詳しくありませんが、どうも日本語の「言語」と英語の「Language」にはニュアンスの違いがあるようです。
モデル駆動設計とは何か
ドメイン駆動設計の戦術的設計とはでも言及しましたが、モデル駆動設計とは作成したモデルが実装に反映されるように設計を行う設計手法です。ドメイン駆動設計はモデルをドメインモデルに限定したモデル駆動設計になります。
つまり、ドメイン駆動設計というのは、ドメインを分析してドメインモデルを明らかにし、ドメインモデルに基づいてクラスを設計する、そういう設計手法です。
真にユビキタス言語を実践するなら、モデル駆動設計は必須になります。なぜなら、コード上の表現においても分析の結果得られた言葉やドメインモデルを利用するのがユビキタス言語だからです。
実践的モデラとは何か
ドメインを分析する人、つまりビジネスアナリスト(あるいは単にアナリスト)が分析のみしかできないとモデル駆動設計を実践することはほぼ不可能になります。実装上の表現として実現不可能だったり、うまく機能しないモデルを作成してしまいかねないからです。よく言われる実装のできないシステムエンジニア問題です。
アナリストが実装もできるのだとしても、アナリストは分析、プログラマは実装というような分業をしてしまうと、これもまた問題が生じます。アナリストが実装を考慮したモデルを作ったとしても想像力には限界があり、プログラマが実装中により良いモデルが発見することもあり得るからです。しかし、分業をしているがゆえに、そのモデルはアナリストにフィードバックされることはありません。結果として、モデルと実装が食い違ってしまい、モデル駆動設計では無くなってしまいます。
そのため、実践的モデラとしてアナリストもコードに触れ、実装中のモデルの改善を分析結果にフィードバックできるようにすることが重要になります。また、プログラマの視点としても、コードだけ考えるのではなくモデルの改善として分析結果にフィードバックする責任があるのだと自覚する必要があります。プログラマもまた実践的モデラとして振る舞う必要があるということです。
ドメイン駆動設計の核心と戦術的設計
ドメイン駆動設計における戦術的設計というのは、ユビキタス言語およびモデル駆動設計を実践するためにコード上の表現として使える設計パターンを集めたものです。
つまり、ドメイン駆動設計の核心の3つを実践するために戦術的設計があるということです。戦術的設計だけ適用する軽量DDDと呼ばれるものがありますが、それはDDDの名を借りただけの一欠片もドメイン駆動設計の要素のないものです。
ドメイン駆動設計がドメインを分析してドメインモデルを明らかにしドメインモデルが実装に反映されるように設計を行う設計手法であること、その核心である「ユビキタス言語」、「モデル駆動設計」、「実践的モデラ」を理解せずに、戦術的設計を一生懸命勉強してもドメイン駆動設計を理解することはできません。
ドメイン駆動設計の核心と戦略的設計
戦略的設計はアプリケーション内に意味的な境界が必要だとか、どこに労力を注力する必要があるか明確にしたいとか、複数のシステムとの協調について考えるとかそういうことが必要になったときに役立つ話です。
お分かりかと思いますが、相当にアプリケーションの規模かチームの規模が大きくなったときに考える必要がでてくる話です。逆に言えば小規模なアプリケーションやチームなら考える必要性が皆無の話題です。そういう意味で戦略的設計はドメイン駆動設計のオプション項目なのです。
個人的な感覚ですが、10万行そこそこのアプリケーションまたは10人未満の開発チームの規模までなら戦略的設計は忘れていいだろうと思います。将来のスケールを考えるなら先取りしておくことは必要かもしれませんが。
別の観点でいうなら「2つ3つのサービスに別れたマイクロサービス(モジュラモノリス)にできたらスマートなのに」と思うなら戦略的設計について調べた方がいいかもしれません。「マイクロサービス(モジュラモノリス)なんてオーバーエンジニアリングだ!」と思うなら多分忘れていいです。
少なくとも、ドメイン駆動設計の初学者にとっては戦略的設計は学ぶ価値のないものです。ドメイン駆動設計がドメインを分析してドメインモデルを明らかにしドメインモデルが実装に反映されるように設計を行う設計手法であること、その核心である「ユビキタス言語」、「モデル駆動設計」、「実践的モデラ」を理解することに注力し、その上でクラス設計としてどうするのか戦術的設計について学ぶべきです。
Next: モデリング手法