DDDで開発するにあたって
はじめに
自分はRailsでの小規模なアプリケーション(テーブル数が約40~50)の開発経験しかなかったため、新しい会社に入社してからDDDをキャッチアップするのに苦労している。しかし、最近になってようやくDDDの全体像が見えて来たので備忘録がてらどうやってここまで来たのかその道中を記しておこうと思う。
書籍一覧
自分がまず最初に読んだ本はこちら。
DDDに関する基礎的な知識が体系的にまとまっていてとても参考になりました。DDDは登場する概念が多いのでまずは上記の書籍で全体感を把握すると良いのではないでしょうか?
次に自分が手に取ったのはこちら
サンプルコードが大量に記載されているので、実際に自分の手を動かして理解する事が出来ました。この本のおかげでDDDに対する基礎知識の叩き台が出来上がりました。サンプルコードはC#ですが実装内容はシンプルなので何らかの静的型付き言語の経験があれば十分読み替えられると思います。自分はRuby以外にTypeScriptの経験しかなかったので写経する時はTypeScriptで行いました。
ちなみに写経してて最初につまづいたのがDIでした。Rubyはダックタイピングが採用されているのでinterfaceを使用して抽象に依存する、という概念を理解するのに時間がかかりました。こればっかりは何度も写経して自力で理解するしかないと思います。constructor DIを使用した場合は注入時に振る舞いが決まるというのは初心者には難しかったです。
この2冊を読んでから今現在、実践ドメイン駆動設計やエリック・エヴァンスのドメイン駆動設計を読み進めています。
ちなみに今自分はドメインイベントの部分で詰まっています。何らかのコマンドが発生した時に別のコンテキストにその変更を通知する、というのは何となく理解できたのですが、いまいちIDDD_samplesを読んでも理解できないんですよね・・・。
その他参考になった記事
個人的に名人さんのQiita記事全般にお世話になりました笑
エンティティのconstructor自体もprivateにする手法は面白かったです。
あとこちらの記事のDDDを把握するのセクションは大変参考になりました。
思う事
DDDで、つまりドメイン駆動で開発していて痛感するのは開発対象となるサービスを正しく理解する事の難しさです。DDDは文字通りDomain Driven、つまりドメイン駆動で開発します。Rails時代はテーブル駆動でモデルを設計していましたがそうはいきません。ドメインモデル図の作成やユースケースの洗い出しを行って行ったり来たりしながら正確なドメインを作成していきます。ドメインを見間違える、つまり集約の定義や境界を間違えるとそのあとどれだけ緻密にコードを書こうとしても設計が根本から破綻してしまいます。最近自分はその事に気がついたのでこの本を読み進めています。
まず正しいドメイン層を定義できるよう頑張ります。