ドメイン駆動設計とは | これで理解できるドメイン駆動設計!
Prev: モデル、ドメインモデル、モデリングとは
ドメイン駆動設計とは
いよいよドメイン駆動設計とは何か説明するときがきました。「ドメイン駆動設計」とはドメインを分析してドメインモデルを明らかにしドメインモデルが実装に反映されるように設計を行う設計手法です。各々の用語を展開して書くと「ソリューションを提供するために分析しなければならない範囲を分析して、その結果を伝えるために作成する受け手に必要な情報を伝達しつつ、不要な側面は含んでいないモノや図、文章、数式などで表現されたものを実装に反映させるように設計を行う設計手法」となります。
設計というのは、パッケージ構成やクラス構造、それらの要素間の関係などを考える活動のことで、ドメイン駆動設計ではドメインモデルと設計、実装が同じになるように分析と設計、実装を行います。AggregateやEntity、ValueObjectはドメインモデルをコードで表現するときに使えるパターンでしかありません。
半分当たっていますが、半分は間違いです。順序的にドメインモデルを作成して、それを元に設計と実装を行うので、ある意味ではドメインモデルのままコードを書くといえます。しかし、実装のことを考えずにドメインモデルを作成して、そのドメインモデルのままコードを書こうとすると何かひずみが生じるはずです。実装の際に顕在化しそうな問題について考えずにドメインモデルを作成すれば、実装の段階でその問題が牙をむくという単純な話です。
それゆえに、ドメインモデルを作成する段階でコードで表現できるモデルになっているのか考える必要があります。また、設計と実装の段階で問題が判明したらドメインモデルにフィードバックすることも行ます。そして、最終的にコードの実装とドメインモデルが一致した状態にします。
分析と設計側のより突っ込んだ話はドメイン駆動設計の核心で、設計と実装側のより突っ込んだ話はドメイン駆動設計の戦術的設計とはで言及します。
ドメイン駆動設計は何を達成しようとしているのか
ドメイン駆動設計が達成しようとしているのは、あらゆる場面においてドメインの中にある物事の名称や単語、ドメインモデルを使ってコミュニケーションや表現を行う状態です。プロダクトオーナーとのコミュニケーションで使う名称やドメインモデルをエンジニア同士のコミュニケーションでも用いるし、コード上の実装においても用いることを目指します。
これによって何を得ることができるのかというと、第一に非エンジニアとエンジニアの使う言葉やモデルが統一されることでコミュニケーションが円滑になります。コード上の実装にも同じ名称とドメインモデルが使われているのだから、コード上の実装のまま図にしたとしても、それはそのままドメインモデルとなりプロダクトオーナーたちが認識しているモデルと一致します。ドメイン駆動設計をしていなかったら、コード上の実装を図にしてもプロダクトオーナーたちは理解できません。エンジニアはいちいち、コード上の構造とドメインモデルを変換する手間を強いられることになります。
第二にコードの可読性が上がります。ドメインモデルを設計と実装に反映させているのだから、ドメインモデルを把握していればコードの構造も把握した状態だといえます。ドメイン駆動設計をしていなかったら、ドメインモデルとコードの構造が一致していないので、コードを読みながら構造も頭の中で構築していかなければならなくなります。
第三にコードからドメインモデルや仕様が読み取れるようになります。これは、単に第二のメリットの逆方向のことが起きると言っているだけです。
Next: ドメイン駆動設計の戦術的設計とは
ここまでの話を読んで、「これだけの話なのだとするなら、なぜ世間でこれほどまでにドメイン駆動設計を取り巻く情報が混乱しているんだろう?」と疑問に思うかもしれません。
原因はいくつか考えられます。第一に分析やモデリングという活動に不慣れな人がプログラミングスキルを上げるつもりでドメイン駆動設計に手を出して、理解できるところ、つまりはEntityやValueObjectのようなアーキテクチャパターンの話ばかりしていることがあげられます。これは、いくつかの書籍が分析やモデリングの話をろくにせずにEntityなどの話に紙面の大半を費やしていることにも原因があろうかと思います。
第二にドメイン駆動設計の話のふりをしながらドメイン駆動設計そのものに含まれないか本質ではないクリーンアーキテクチャの話だとかSOLID原則だとかの話ばかりが世でされていることがあげられます。ドメイン駆動設計にもレイヤードアーキテクチャの話とドメインレイヤを分ける話は出てきますが、どういうレイヤのアーキテクチャにするのかはドメイン駆動設計とは直交した話です。そして、クリーンアーキテクチャは初学者が手を出すには過ぎた代物であり、これも理解できるところだけの話ばかりされることになります。
第三にドメイン駆動設計の本質ではない戦術的設計と戦略的設計には名前があるにも関わらず、真にドメイン駆動設計の本質である「ユビキタス言語」、「モデル駆動設計」、「実践的モデラ」をまとめる呼称がないことがあげられます。
「それらは戦略的設計では?」とお思いでしょうか。お手元にエリック・エヴァンスのドメイン駆動設計があるなら、目次をみてください。お持ちでないなら翔泳社の書籍紹介の目次をみてください。戦略的設計は「第4部 戦略的設計」とあります。ではユビキタス言語などはどこにあるかというと、すべて「第1部 ドメインモデルを機能させる」に書かれています。つまりこの三つは戦略的設計ではないのです。
最も重要なこれら三つは戦略的設計ではないのに、世の人は戦略的設計が大事だとよくいいます。実際のところ戦略的設計は一番どうでもよいものです。少なくとも、これからドメイン駆動設計を学ぼうとしている初学者にとっては忘れて良い言葉です。また、1つの開発チームで開発できている場合も忘れて良い概念です。
このことについてはドメイン駆動設計の核心で詳しく話します。
(ネタバラシをしておくと、この章で書かれていることは実は「ユビキタス言語」、「モデル駆動設計」、「実践的モデラ」の話だったのでした)
Next: ドメイン駆動設計の戦術的設計とは