ちょっと話題の記事

【読書感想文】ドメイン駆動設計入門 ボトムアップでわかる! ドメイン駆動設計の基本

2020.02.19

ドメイン駆動設計には興味を持ちつつエリック・エヴァンスのドメイン駆動設計は数年前に積んだまま、という状態で何年か立ってしまったのですが、新しくDDD の本が出ていたので読んでみたところよかったので紹介させていただきます。

ドメイン駆動設計入門 ボトムアップでわかる! ドメイン駆動設計の基本

本書は、 『エリック・エヴァンスのドメイン駆動設計』(ISBN978-4-7981-2196-3、翔泳社)、 『実践ドメイン駆動設計』(ISBN978-4-7981-3161-0、翔泳社) に感銘を受けた著者が贈る、ドメイン駆動設計の入門書です。 (https://www.shoeisha.co.jp/book/detail/9784798150727 より。)

というわけで、ボトムアップで理解出来る章立てで書かれたドメイン駆動設計の入門書です。

個人的には、ドメインモデルの組み立てをどうやればいいのか?以上に、ドメインモデルをコード上でどのように表現すれば良いのか?についての本だと感じました。

本書の Preface でも、以下のように記載されています。

そこで本書はモデリングについてはいったん棚上げにして、具体的なコードをベースにパターンを集中的に解説し、全体を通して最終的なコードを提示します。

また、この本を読んだ人全員が書かれた内容を理解できることに重点を置いて書いているように感じます。具体的には、多くの章で出来る限り抽象的でわかりづらい説明を避けた、具体例を踏まえた説明がなされています。そういう意味では他の DDD 関連の本について諦めた経験のある人にもおすすめです。

特にコードのサンプルが非常に豊富なので、じゃあどうやってそれをコードに落とし込めばいいのか?や、コードとして何が問題で、じゃあどうすればいいのか?というところが非常にわかりやすく感じました。

個人的には本書で DDD に対するモチベーションが復活したので、読み終わってからエリック・エヴァンスのドメイン駆動設計を再度読み始めました。

そもそも DDD とはなんなのか?について説明している Chapter 1 以降は、

  1. まずなんらかコードがあって
  2. そのコードだと(特に変更を加える時に)何が困るのか?についての説明があって
  3. そこに DDD (もしくは他のクラス設計に関する)のプラクティスを適用するとこうなる

という流れでの説明が非常に豊富です。特に何がまずいのか?について実例を交えて説明してくれているので、プラクティスに対する「何でそんなめんどくさいことをするのか?」に対する理解もしやすいと思いました。

また、(私は DDD がどこからどこまでの世界だかよくわかっていないので正確なところはわかりませんが)DDD の世界だけではなく、一般的なクラスやアプリケーションの設計についての記載がそれなりにあるように思えました。

例えば、「 Chapter 10 データの整合性を保つ」では、整合性を保つために、どうすればいいのか?トランザクションを利用するとして、コード上ではトランザクションの境界をどう表現するのか?について紹介されています。

どのような人に勧めたいか

上記を踏まえて個人的には、以下のような方に本書をお勧めしたいと感じました。

  • クラス設計をする時に、何からはじめたらいいのかよくわからない方
  • DDD に興味がある方
  • 他の DDD 本を諦めた経験のある方

サンプルコードは C# で記載されていますが、それほど複雑なコードは出てこないので、何らかのオブジェクト指向言語のプログラムが読めればそれほどつまずくこともなく読めると思います。

各章で何が学べるのか? & 個人的に感じたこと

以下に書籍の各章を読むことで、何が学べるのか?と私が書籍を読みながら個人的に感じたことを記載します。

Chapter 1 ドメイン駆動設計とは

  • ドメイン駆動設計とは何か?
  • そもそも、ドメインとは何なのか?
  • ドメインモデルからドメインオブジェクトを組み立てると何が嬉しいのか?
  • 後の章では何について学べるのか?

についてと、以下の各単語の関係性について説明されています。

  • ドメイン駆動設計
  • ドメイン
  • ドメインモデル
  • ドメインオブジェクト

Chapter 2 システム固有の値を表現する「値オブジェクト」

  • 値オブジェクトとは何か?
  • プリミティブな値での表現と比べて利点は何か?
  • どのような性質があるのか?

などについて説明されています。 どのような値を値オブジェクトとした方がよいのか?についての説明が簡潔でわかりやすいと感じました。

Chapter 3 ライフサイクルのあるオブジェクト「エンティティ」

  • エンティティとは何か?
  • 値オブジェクトとは何が違うのか?
  • どのような性質があるのか?
  • 何を値オブジェクトにして、何をエンティティにするのか?
  • そもそもドメインモデルをドメインオブジェクトとして表現すると何がうれしいのか?

Chapter 4 不自然さを解決する「ドメインサービス」

  • ドメインサービスとは何か?
  • ドメインサービスで表現すべきふるまいとはなんなのか?
  • 値オブジェクトやエンティティが持つと不自然なふるまいはどうすればいいのか?
  • なんでもかんでもドメインサービスで表現するとどうなるか?
  • どういった基準で、どのふるまいをドメインサービスで表現するとよいのか?

などについて書かれています。

割とサービスになんでもかんでも書いてしまいがちなので、そうならないためにどういった考え方をすればよいのか?についての説明が、個人的には本書で一番参考になりました。

Chapter 5 データにまつわる処理を分離する「リポジトリ」

  • リポジトリとは何か?
  • リポジトリには何をさせればよいのか?
  • リポジトリがないとどうなってしまうのか?
  • あると何がうれしいのか?
  • テスト用にインメモリでのリポジトリ実装を用意する場合、どのようなコードになるか?

Chapter 6 ユースケースを実現する「アプリケーションサービス」

  • アプリケーションサービスは何を表現するのか?
  • ユースケースをアプリケーションサービスとして、どのようにコードに落とし込むのか?
  • アプリケーションサービスの外にドメインオブジェクトをを公開するリスクについ
  • ドメインオブジェクトを公開しない場合、どういったコードになるのか?
  • コマンドオブジェクトについて
  • 凝縮度、LCOMについて
  • そもそもサービスという言葉は何を指すのか?

Chapter 7 柔軟性をもたらす依存関係のコントロール

  • ソフトウェアにおける依存とは何を指すのか
  • 実装の詳細に依存しないためにどうすればよいか(依存関係逆転の原則について)
  • 実際に依存している具象型をどうコントロールするか
    • Service Locator パターンについて
    • IoC Container(DI コンテナ)パターンについて

Chapter 8 ソフトウェアシステムを組み立てる

  • ここまで学んだプラクティスを実践した時に、ユーザーインターフェース込みでコードがどうなるか?
  • MVC について
  • 単体テストについて

MVC や DI コンテナといった言葉が理解できていなかったころに読みたかったなと思えるような内容でした。

Chapter 9 複雑な生成処理を行う「ファクトリ」

  • なぜファクトリが必要なのか
  • どういったタイミングで使うとよいのか
  • コンストラクタではなく、ファクトリでやるべきタイミング

Chapter 10 データの整合性を保つ

  • そもそも整合性とは?
  • 整合性が失われるのはどういう時?
  • じゃあどうやって整合性を担保していくか
  • トランザクションで整合性を担保する場合、コード上で整合性をどう表現するか

ユニットオブワーク、という概念を知らなかったのですが、サンプルコードなど含めてわかりやすくてよかったです。

Chapter 11 アプリケーションを1から組み立てる

ここまで学んだ内容を踏まえて、ユースケースをどのようにクラス、コードに落としていくか?を実践していきます。

Chapter 12 ドメインのルールを守る「集約」

  • 11章で出てきたコードの問題を、どう解決するか?
  • 集約とは?
  • オブジェクトの操作に関して、どう制約をつけていくとよいのか?
  • デメテルの法則について
    • デメテルの法則が、何を解決するのか?
  • 通知オブジェクトについて
  • 集約を区切る基準について
    • 集約のルールを違反すると、何が困るのか?
  • ドメインオブジェクト自体のコンポジションではなく、ID だけ保持するパターンについて

巨大化してなんだかわからなくなっている集約を見かけることはよくある気がします。そもそもどこからどこまでが集約で、どのアクセスが集約をまたいだ操作なのか?を意識できるようになるとこの手の問題に手を入れられるようになりそうだな、と感じました。

Chapter 13 複雑な条件を表現する「仕様」

  • オブジェクトと、オブジェクトを評価する仕様を分離するパターンについて
  • どのようなケースで役に立つのか

割とサービスで全部やってしまいがちな領域なので、このパターンは意識しておきたいなと感じます。

Chapter 14 アーキテクチャ

  • アーキテクチャとはそもそもなんなのか?
  • UIにビジネスロジックを持つリスクについて
  • アークテクチャについて
    • レイヤードアーキテクチャ
    • ヘキサゴナルアーキテクチャ
    • クリーンアーキテクチャ

Chapter 15 ドメイン駆動設計のとびらを開こう

  • DDD のモデルに関する話
  • ユビキタス言語について
  • 境界づけられたコンテキストについて
  • コンテキストマップについて

まとめ

ドメイン駆動設計入門 ボトムアップでわかる! ドメイン駆動設計の基本 は、ボトムアップで理解出来るような章立てで書かれたドメイン駆動設計の入門書です。

個人的には、以下のような方に本書をお勧めしたいと感じました。

  • クラス設計をする時に、何からはじめたらいいのかよくわからない方
  • DDD に興味がある方
  • 他の DDD 本を諦めた経験のある方

クラスメソッド の事業開発部ではソフトウェアエンジニアを募集しています

現在私は事業開発部で prismatix というサービスの開発に携わっています。 そして、事業開発部ではソフトウェアエンジニアを募集しています。

複雑なドメインをコードに落とし込んでいくような仕事もたくさんあります。 この辺りの領域に興味がある方で、もし募集にも興味のある方がいましたら、こちらのページを見ていただけますと幸いです。

私からは以上です。