SE(たぶん)の雑感記

一応SEやっている筆者の思ったことを書き連ねます。会計学もやってたので、両方を生かした記事を書きたいと考えています。 でもテーマが定まってない感がすごい。

『.NETのエンタープライズアプリケーションアーキテクチャ 第2版』を読んだ(DDD、CQRS、イベントソーシング)

今回は、こちらの本を読み終わったので、感想等を書いてみます。

honto.jp

副題は、『NETを例にしたアプリケーション設計原則 (マイクロソフト公式解説書)』となっていることから、基本的には.NET(というかC#)のお話です。
なのですが、この本は、C#をやっていない人でも、読んだら得るものは確実にあります。

理由については、書いていきます。

お勧めする人

  • タイトル通り、.NETシステムでアーキテクチャを構築する人
  • DDDを勉強したものの、.NETでの適用に困っている人
  • アーキテクトを志す人
  • 他言語を使うが、DDDの実践について知りたい人

お勧めしない人

経験が浅いと自覚がある人や、アーキテクトはソースコードを書く必要はないんだ、と考えている人等は、読まなくて良いと思います。

読んだ後だから言いますが、本書、相当難しいです。
経験が浅いときに読むと、心が折れかねないです。読むとしても、理解できなくて当然、ぐらいの気持ちで読みましょう。

あと、アーキテクトはソース書かなくていい、と思っている人は、DDDの概念も理解できないと思います。回れ右しましょう。

目次抜粋

注目すべき点は、第2部からドメインの話が出てくる部分です。
第2部以降、本書では、ドメイン駆動設計をアーキテクチャレベル(ソースレベルも)でどのように適用していくのか、じっくり解説されます。

第1部 基礎

第1部は、基礎と銘打っている通り、アーキテクト(という役割)とは何か、いいソースコードとは何か等の内容について書かれています。
なお、「汚いソース*1とは何か」についても書かれています。

この章で、インターフェイスの合成SOLID原則ドメインモデル貧血症*2、テスト駆動について等、基礎概念が一気に説明されます。

…ここで理解できない場合は、まだ本書を読むには早いと考えたほうが良いです。

第2部 アーキテクチャの考案

ここでは、本格的にドメイン駆動設計(DDD)について解説が行われます。
ドメイン駆動設計といえば、以下の本*3です。

honto.jp

第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)と呼ばれる、サポートアーキテクチャの一つです。

コマンド:システムの状態を実際に変更する
クエリ:システムの状態をいかなる方法でも変更せず、データを返す

と、それぞれ区別されます。
そもそも、この二つ分けてしまえばいいんじゃね?というのが、ざっくりとした説明です。

本書では、ドメインモデルそのものを分割し、

  • コマンド
    従来のドメインモデルと同様

  • クエリ
    もっと簡便な方法。DTO等を直接参照してもよい(ただし、書き込みは不可能な設計にする)

で設計・実装することを推奨し、実際にサンプルを作成しています。
CQRSの実装例を見たのは、個人的には初めてでした。

こうすることのメリットは、応答性の高いサービスが作成できる、保守性が向上する等が考えられます。

DBをコマンドとクエリで分けたとして、コマンド発生した後、クエリ側にどうやって反映するんだよ!という部分も、サンプルではしっかり押さえています。

本書では、サンプルとしてショッピングサイトのシステムが作成されています。

イベントソーシングについて

DDDは、モデル駆動設計を下敷きとしますが、現実を見ると「これが発生したら、この状態になる」のような、イベントだって存在するよね?というものを、アーキテクチャとして作成しようとするものです。(説明が正しいか不安)

イベントというか、状態遷移のようなものだと思います。
例えば、固定資産でいうと、経年劣化したり、修理したり、最終的には売却したり、という流れですが、それを個々のイベントとして扱うような感じです。
まあ、よくある例は口座なんですが。

本書内でも、

直前までCQRSについて述べてきたが、それとはまったくアプローチが異なるため、サンプルは共有できない

とまで言い切っているぐらい、全く新しいアプローチであると言っています。

このイベントを、

  • どうやって記録するか
  • 状態の復元はどうやって行うか
  • スナップショット(イベントを途中まで適用した状態)の保存ポリシー

等の観点から論じ、これまた実際にアーキテクチャとソースのサンプルがあります。

サンプルとしては、水球のライブスコア(試合のスコア等)システムとなっています。

そもそも

上で書いた、CQRSやイベントソーシングですが、『実践ドメイン駆動設計』という、『エリック・エヴァンスドメイン駆動設計』の解説本の中で、「こういう方法もある」という感じで出てきます。

しかし、やはり具体的なソース例は無かったので、本書がアーキテクチャのイメージ作りにはとても良いという印象を受けました。

すべてはDDD

有名なアーキテクチャの中には、DDDを下敷きとして考案されているものが多い、という印象を受けます。

  • CQRS
    ドメインのすべての側面に対処する、単一のモデルの構築に苦慮した結果生まれた

  • Repository
    ドメインモデルとDBを切り離すために生まれた

  • マイクロサービス(本書対象外)
    サービスの領域分けは、DDDの「境界付けられたコンテキスト」に基づくべき、とされる(『レガシーソフトウェア改善ガイド』より)

マイクロサービスは、この記事にも書いています。

hiroronn.hatenablog.jp

なぜ今さら読んだのか

電子書籍ですが、購入が2016年だったため、積み本です。

定価5,400円のところを、3,240円で安売りされていたので、買いました。
同時に、『C#実践開発手法』も買いました。

読み終わって、なんでもっと早く読まなかったのだろう…と、本気で思いました。

DDDのサンプル不足に苦慮していたので、最初から全部読んでいれば…と思っています。

おわりに

別に、出版社の回し者ではないのですが。

本書は、DDDを実践したいと思っているなら、他言語経験者であっても読んだほうが良いと思います。
実践例として、こんなにわかりやすい*4書籍は、あまりないと思います。

あと、他言語の方向けとしては、『C#実践開発手法』もお勧めです。
こちらは、より実装に近いものの、SOLID原則の各要素について一章割くほどじっかり解説されています。

この記事を読んでいただいた人に、ちょっとでも興味持ってもらえたら、と思っています。


*1:いわゆる、レガシーコード。やっかいなコードベースという説明もある

*2:本書では、貧血ドメイン、と呼称されている

*3:欲を言うなら、本書を読む前に読んでおくのがおすすめ。本書でもドメイン駆動設計の解説はされるが、当然ながらこちらのほうが詳しい。

*4:C#得意だから理解しやすい、という部分はあると思うが、アーキテクチャ視点から見ても、非常にわかりやすいと思う