コンテンツにスキップ

[読書] ドメイン駆動設計 モデリング/実装ガイド

#ドメイン駆動設計

📕 読んだ本

ドメイン駆動設計 モデリング/実装ガイド
  • 出版社から出ているものではなく、技術書典で出されている、技術同人誌ですね。

💪 モチベーション

  • きっかけはDDD-Community-Jp のイベントか、著者の @little_hands_s さんのツイートで知ったかといったところ(覚えていない...)
  • DDDをスタディし始めるのに、これだけ軽量にまとまっているものはなかなかないので、これもエヴァンス本を読み始める前に一度読むべき本として積ん読されていました。

🕐 かかった時間など

  • 2022/12/6〜2022/12/14
  • トータル6時間ちょっとくらいで、8日間で読み終わりました。
  • ボリュームは、B5サイズで100ページ程度。
  • 分厚く内容も難しいエヴァンス本にくらべて、1週間くらいで読める本です。

😄 理解メモ(他の本に書いていないことなど)

  • 第1章
    • エヴァンス本はかなりのボリュームで読みづらいが、エヴァンスも参加しているDomain-Language.comから、DDD Reference というコンパクトな本がダウンロードできる。
    • DDDに限らず、取り組む上で重要な考え方
      • 課題ドリブン:DDDを適用することが目的ではなく、課題を解決することが目的
      • 適用するドメインが複雑な場合にDDDが向いている。非常に単純なCRUDしかない場合かつ超高速処理が重要な場合などは見合わないことがある。
  • 第2章
    • DDDでのモデリングの方法やアウトプットの形式は、エヴァンス本やIDDDではその具体的な方法は記載されていない。以下がある。
      • RDRA(リレーションシップ駆動要件分析)
      • ICONIX
    • ドメインモデル図をドキュメント化してそこにユビキタス言語の定義を書いておくと良い
    • 実装の前にドメインモデル図を更新するようにするとメンテンナンスがキープできそう
  • 第3章
    • 集約とトランザクションの話など
  • 第4章
    • 高凝集で低結合につくることなど
  • 第5章
    • オニオンアーキテクチャ、ヘキサゴナルアーキテクチャ、クリーンアーキテクチャとあるが、DDDとしてはドメイン層があることが重要
    • クリーンアーキテクチャは、大規模開発においてはコンテキストで分けるというDDDの考えとマッチしないところがある
    • 筆者はオニオンアーキテクチャがよいと考えている
  • 第6章
    • ドメイン層に適用する設計パターンの話など
    • ドメイン層を独立させることは安定依存の原則(SDP:Stable Dependencies Principle)に則っていないように思える。ドメイン層=業務知識なので変化が激しく安定しないはず。
      • 最も重要なドメイン層を変化させやすくすることに重点がある。インフラの都合から乖離することで変更させやすくしている
      • ドメイン層の変更への影響度の調整はテストコードでやる
    • 外部APIで取得したものは、その値がドメインモデルなのであれば、リポジトリで設計する。そうではないのであれば、通知(NotificationAdapter)をつかう方法を考える。
    • 集約内は、インスタンス参照にして、集約外はID参照としたい
  • 第7章
    • アプリケーション層というよりユースケース層と称するほうが位置づけがわかりやすい
    • プレゼンテーション層に返すオブジェクトをドメインオブジェクトにすると、いつの間にかドメイン知識が出ていってしまうので、DTOとして変換したものにしたほうがよさそう。
  • 第8章
    • 参照系でよく起こる問題
      • 複数の集約から値を取得して戻り値の型に詰め替える処理でループが増えた処理になり、わかりにくくなる
      • 画面に返す必要のない値を取得することがありパフォーマンスが悪化する
      • フィルターやページングがスマートにできない
    • CQRS(Command Query Responsibility Segregation)
      • 参照用のモデルを作るのをインフラ層に入れる。返却する型もユースケース層に定義
      • CQRSはイベントソーイングとの相性がよいので混同されがち。CQRSは、データソースの分離ではなく、パフォーマンス解決の手段
      • 基本はリポジトリから取得。パフォーマンスの問題が出るときにCQRSを考える。
  • 第9章
    • プレゼンテーション層、Web API設計の話
    • 例外的にIDを表す値オブジェクトだけは、コントローラで生成することを許可することがある
  • 第10章
    • 例外処理、パッケージ、Webフレームワーク、ORマッパーの話
  • 第11章
    • DDD Community JPや筆者の質問箱、twitterの紹介など

🎉 感想

  • Q&Aが記載されている部分が、実践でみんながどう困っているか、どうやって実現しているのかなどがイメージしやすく面白く感じました。
  • ボリュームは小さいのですが、より実践的なように思いました。増田本、エヴァンス本を読んだ上で、より実践で迷ったときにお付き合いしやすい本かなと。

🔭 今後の展望

  • 続編もQ&Aがあるようなので、他のみなさんが困ったときにどうやっているかためになりそうです。
ドメイン駆動設計 サンプルコード&FAQ

最終更新日: February 5, 2023