プログラマーな日々

プログラマー兼クラウドアーキテクトです。AWS認定ソリューションアーキテクト–アソシエイト。好きなものは、C#, TaskChute Cloud, WorkFlowy, Backlog, AWSです。

第二回ボトムアップドメイン駆動設計に参加しました

第二回ボトムアップドメイン駆動設計に参加してきました。第一回は補欠で参加できず残念でした。第二回を開催していただいて感謝です。

ddd-community-jp.connpass.com

Q&A

ディレクトリ構成について質問させていただいたので、そのやりとりを共有しておきます。

jhashimoto

UsersとCirclesフォルダに、それぞれの関連するクラス(エンティティ、値オブジェクト、リポジトリインターフェース)を配置していますが、この構成の場合、複数のエンティティで共通する値オブジェクトはどこに配置するのでしょうか?

成瀬さん

複数のエンティティで値オブジェクトを共通で使いたいケースってありますか?

jhashimoto

例えば、会社エンティティと社員エンティティが住所を持つ場合、それは概念として同一なので、1つの住所クラスとして実装したいです。

成瀬さん

その場合は、Commonフォルダに配置すればいいのではないでしょうか?

感想

自分は、値オブジェクトを共通化したいがために、以下のようにディレクトリを構成していました。

Entities
├ Company
└ Employee
ValueObjects
├ Address ←共通で使用する
Repositories

開発当初は問題なかったものの、クラスの数が増えるにつれ、見通しが悪くなっていきました。主な要因は以下の2つです。

  • 業務の関心事でグルーピングできていない
  • 値オブジェクトがどのエンティティで使われるのかわからない

とはいえ、業務の概念でフォルダを切れば、共通の値オブジェクトを置く場所がなくなります。書籍を読んでもディレクトリ構成に言及しているものはなく、1人で3年ほど悩んでいました。

Commonフォルダを導入することで、共通化と業務の概念の表現を両立することができます。これだけでも参加してよかったです。

また、全体的な感想としては、終始初心者の気持ちに寄り添ってくれる安心感がありました。DDD入門の一歩目としてお勧めします。ぜひ第三回をご検討いただければと思います。ありがとうございました。