今回は、こちらの本を読み終わったので、感想等を書いてみます。
副題は、『NETを例にしたアプリケーション設計原則 (マイクロソフト公式解説書)』となっていることから、基本的には.NET(というかC#)のお話です。
なのですが、この本は、C#をやっていない人でも、読んだら得るものは確実にあります。
理由については、書いていきます。
お勧めする人
- タイトル通り、.NETシステムでアーキテクチャを構築する人
- DDDを勉強したものの、.NETでの適用に困っている人
- アーキテクトを志す人
- 他言語を使うが、DDDの実践について知りたい人
お勧めしない人
経験が浅いと自覚がある人や、アーキテクトはソースコードを書く必要はないんだ、と考えている人等は、読まなくて良いと思います。
読んだ後だから言いますが、本書、相当難しいです。
経験が浅いときに読むと、心が折れかねないです。読むとしても、理解できなくて当然、ぐらいの気持ちで読みましょう。
あと、アーキテクトはソース書かなくていい、と思っている人は、DDDの概念も理解できないと思います。回れ右しましょう。
目次抜粋
- 第1部 基礎
- 現代のアーキテクトとアーキテクチャ
- 成功のための設計
- ソフトウェアの設計原則
- 高品質なソフトウェアの作成
- 第2部 アーキテクチャの考案
- 第3部 サポートアーキテクチャ
- 第4部 インフラストラクチャ
- 永続化レイヤー
注目すべき点は、第2部からドメインの話が出てくる部分です。
第2部以降、本書では、ドメイン駆動設計をアーキテクチャレベル(ソースレベルも)でどのように適用していくのか、じっくり解説されます。
第1部 基礎
第1部は、基礎と銘打っている通り、アーキテクト(という役割)とは何か、いいソースコードとは何か等の内容について書かれています。
なお、「汚いソース*1とは何か」についても書かれています。
この章で、インターフェイスの合成、SOLID原則、ドメインモデル貧血症*2、テスト駆動について等、基礎概念が一気に説明されます。
…ここで理解できない場合は、まだ本書を読むには早いと考えたほうが良いです。
第2部 アーキテクチャの考案
ここでは、本格的にドメイン駆動設計(DDD)について解説が行われます。
ドメイン駆動設計といえば、以下の本*3です。
第3部でCQRS
について説明されますが、ここでの説明がドメイン駆動設計を理解していることを前提に、背景等が開設されるので、DDDを理解しているとより分かりやすいと思います。
.NETを利用したアーキテクチャという観点から、以下のようなものも解説されます。
- ASP.NET Web FormとASP.NET MVCの併用
- シングルページアプリケーション(SPA)
- デスクトップリッチクライアント(WPF、リッチWebクライアント等)
ここに関しては、完全にWindows Phoneが死亡した現在では、書き方が全く異なるのでは、と思います。
第3部 サポートアーキテクチャ
本書の肝である部分です。
最初の二章で、DDDに基づいて構築されたWebアプリケーション(ASP.NET MVC)のサンプルを追います。
その後、二章を割いてCQRSに基づいたアプリケーションに書き直します。
さらにその後、イベントソーシングの話が…
CQRSやイベントソーシングについては、後述します。
第4部 インフラストラクチャ
実質的に、永続化の話しか出てきません。
身も蓋もない言い方をすれば、DBの話です。
名前だけは知っている人が多いRepository
パターン、NoSQLの話などが出てきます。
CQRSについて
CQRSとは、コマンド/クエリ責務分離(Command Query Responsibility Segregation)と呼ばれる、サポートアーキテクチャの一つです。
コマンド:システムの状態を実際に変更する
クエリ:システムの状態をいかなる方法でも変更せず、データを返す
と、それぞれ区別されます。
そもそも、この二つ分けてしまえばいいんじゃね?というのが、ざっくりとした説明です。
本書では、ドメインモデルそのものを分割し、
で設計・実装することを推奨し、実際にサンプルを作成しています。
CQRSの実装例を見たのは、個人的には初めてでした。
こうすることのメリットは、応答性の高いサービスが作成できる、保守性が向上する等が考えられます。
DBをコマンドとクエリで分けたとして、コマンド発生した後、クエリ側にどうやって反映するんだよ!という部分も、サンプルではしっかり押さえています。
本書では、サンプルとしてショッピングサイトのシステムが作成されています。
イベントソーシングについて
DDDは、モデル駆動設計を下敷きとしますが、現実を見ると「これが発生したら、この状態になる」のような、イベントだって存在するよね?というものを、アーキテクチャとして作成しようとするものです。(説明が正しいか不安)
イベントというか、状態遷移のようなものだと思います。
例えば、固定資産でいうと、経年劣化したり、修理したり、最終的には売却したり、という流れですが、それを個々のイベントとして扱うような感じです。
まあ、よくある例は口座なんですが。
本書内でも、
直前までCQRSについて述べてきたが、それとはまったくアプローチが異なるため、サンプルは共有できない
とまで言い切っているぐらい、全く新しいアプローチであると言っています。
このイベントを、
- どうやって記録するか
- 状態の復元はどうやって行うか
- スナップショット(イベントを途中まで適用した状態)の保存ポリシー
等の観点から論じ、これまた実際にアーキテクチャとソースのサンプルがあります。
サンプルとしては、水球のライブスコア(試合のスコア等)システムとなっています。
そもそも
上で書いた、CQRSやイベントソーシングですが、『実践ドメイン駆動設計』という、『エリック・エヴァンスのドメイン駆動設計』の解説本の中で、「こういう方法もある」という感じで出てきます。
しかし、やはり具体的なソース例は無かったので、本書がアーキテクチャのイメージ作りにはとても良いという印象を受けました。
すべてはDDD
有名なアーキテクチャの中には、DDDを下敷きとして考案されているものが多い、という印象を受けます。
CQRS
ドメインのすべての側面に対処する、単一のモデルの構築に苦慮した結果生まれたRepository
ドメインモデルとDBを切り離すために生まれたマイクロサービス(本書対象外)
サービスの領域分けは、DDDの「境界付けられたコンテキスト」に基づくべき、とされる(『レガシーソフトウェア改善ガイド』より)
マイクロサービスは、この記事にも書いています。
なぜ今さら読んだのか
電子書籍ですが、購入が2016年だったため、積み本です。
定価5,400円のところを、3,240円で安売りされていたので、買いました。
同時に、『C#実践開発手法』も買いました。
読み終わって、なんでもっと早く読まなかったのだろう…と、本気で思いました。
DDDのサンプル不足に苦慮していたので、最初から全部読んでいれば…と思っています。
おわりに
別に、出版社の回し者ではないのですが。
本書は、DDDを実践したいと思っているなら、他言語経験者であっても読んだほうが良いと思います。
実践例として、こんなにわかりやすい*4書籍は、あまりないと思います。
あと、他言語の方向けとしては、『C#実践開発手法』もお勧めです。
こちらは、より実装に近いものの、SOLID原則の各要素について一章割くほどじっかり解説されています。
この記事を読んでいただいた人に、ちょっとでも興味持ってもらえたら、と思っています。