「ドメイン駆動設計 モデリング/実装ガイド」を読んでDDDを学ぶ。
どうも、たかふみです。
開発に携わっているプロジェクトではドメイン駆動設計(Domain-Driven Design)が取り入れられています。
「基礎からきちんと学んでおきたい」
「だけど、難しい書籍で心折れたくない…」
ということで、本書「ドメイン駆動設計 モデリング/実装ガイド」を読み始めました。
本記事には読んでいて重要だと感じたところ、覚えておきたいところをメモとして残しておきたいと想います。
第1章 DDD概要
Q.良いモデルとは?
A.ドメインの課題を解決できるモデル
→そのためには何が必要?
1.ドメインエキスパート(ドメインに詳しい人)と一緒に作る。
→ユビキタス言語を作る
ドメインエキスパート、開発者問わない共通言語。
ドキュメント、会話、プログラムで使うことで認識を合わせる。
2.運用の中で改善していく
初めから完璧なものは作れない。運用の中で作り上げていく。
改善によって他の箇所にも変更が入るため、変更しやすい設計を行う。
DDD向きなのは「ドメインが複雑なもの」
逆に「シンプル」だったり、技術寄り(パフォーマンス重視)のものには向かない。
第1章はDDDに関する基本的な内容でした。「実際に運用に導入するにはどうすれば良いの?」「実際の運用と本の内容と差異は無いか?」など気にしながら読み進めたいと思います。
第2章 モデリング〜実装
モデリングとは?
本書では「ユースケース図」「ドメインモデル図」を作る方法を指す。
開発対象の整理を行う、というイメージで読みました。ユースケースの列挙はオフラインならホワイトボードで、オンラインならMiroのようなツールでメンバーと一緒に作成していくのが良いと思います。
第3章 DDD固有のモデリング手法 集約/境界づけられたコンテキスト
集約
強い整合性を持つオブジェクトのまとまり
境界づけられたコンテキスト
モデルが適用される範囲を定義して、それぞれの範囲(=境界で分けられた領域)で言語の統一を目指す。境界を引かないと言語を統一させることが大変になるため。
本章の内容はDDD固有ということで、あまり馴染みのない考え方でした。それぞれ理解して使っていきたいと思います。
第5章 アーキテクチャ
どのアーキテクチャを使うか
境界づけられたコンテキストの実装
■1コンテキスト = 1アプリケーションとして開発する方法
■パッケージで分ける方法
ディレクトリごとに分ける
アーキテクチャについての内容でした。以前、クリーンアーキテクチャについての書籍を読んだことがあったので、レイヤーの分け方や役割については理解しながら読むことができました。アーキテクチャは特にチーム内で共通認識を合わせて開発する必要がある部分だと思うのでしっかり把握した上で進めていきたい部分です。
▼参考になる記事
第6章 ドメイン層
表現:エンティティと値オブジェクト
使用:ドメインサービスとリポジトリ
▼参考になる記事
開発をしていてドメイン層って何を実装するレイヤーなんだっけ…となることがあるので、この部分はしっかり理解しておきたい部分です。著者のブログ記事↑も合わせて読むと良いと思います。
第7章 ユースケース層
実装例
「タスクの期限日を延期する」ユースケースの場合。
what(何を)が実装されており、how(どうやって)は分からない状態
public class TaskPostPoneUseCase {
public void タスク延期(タスクID) {
Task タスク = タスクリポジトリ.取得メ(タスクID);
タスク.タスク延期メソッド();
タスクリポジトリ.保存(タスク)
}
}
戻り値
専用の戻り値クラスを返す。(xxxDto)
ドメインオブジェクトを返す、という方法もあるが、表示に関する関数の実装が必要になる可能性がある。
分割の粒度
1クラス1パブリックメソッド
命名
・メソッド名+UseCase(CreateTaskUseCase)
・クラス名+UseCase(TaskUseCase)
第8章 CQRS:コマンドクエリ責任分離
DDDにおける参照系の問題と解決策
第9章 プレゼンテーション層
・多くの場合、フレームワークに依存する層
・画面に表示する形式(日付表示、カンマ区切り…)はこの層に実装
DDDへの入門ということで本書を読みました。
どんなものなのかという概要は掴めたと思うので、見返しながら実際に実装していきたいと思います。
それでは!