質問: User(IdGenerator.nextId(),userCreateForm.name, userCreateForm.Age) userRepository.save(user) user } } ``` という形であるべきなのでは?というように思っていますがDDDではどうあるべきなのでしょうか?
回答: EvansのDDDにおけるリポジトリとファクトリの役割については、DDD本のRepositoriesパターンおよびFactoriesパターンに実はしっかり明記されています。 > > **リポジトリ**と**ファクトリ**は、それ自体はドメインに由来しないが、ドメイン設計においては意味のある役割を持っている。これらの構成概念は、モデルオブジェクトを操作できるようにすることで、**モデル駆動設計**を完成させるものなのだ。 > > > つまり、ドメインオブジェクトの生成と永続化というのは、「ドメインモデル」の一部ではないけれど、「ドメイン設計」の重要な一部だ、ということです。昨今のDDD論者の中であんまりここをしっかり強調して説明している人は少ないように見えますが、Evansは、DDDにおいて「ドメインモデル」と「ドメイン設計」というのをはっきりと区別して考えているようです。 上でモデル駆動設計との関連で説明されているように、「ドメイン設計」というのはつまりドメインモデルと実装とをつなぐために必要な「橋渡し」のようなものだと考えられます。 そこから翻ってご質問について考えると、ドメインモデルは実装に落とし込む中で必然的にドメイン設計を必要としますから、ドメインモデルの中にファクトリやリポジトリを含むオブジェクト生成/永続化のコードが入ってくること自体はDDDとしては問題ないです。ただし、それはドメインモデルの要素ではありません(つまりビジネスの関心事ではなくソフトウェアの関心事である)から、何らかの形で純粋にドメイン設計の部分をドメインモデルから区別できるようにコーディングすることは重要です。 どのようにこのドメインモデルの要素とドメイン設計の要素を区別するかについては、それこそDDD実践者の間で様々な流派があると思いますから、完全に永続化をアプリケーション層に隔離するのを好む人もいれば、妥協的にドメインモデルの中に入れ込むのを良しとする人もいます(Evans自体はDDD本を読む限り、原理主義者ではなく妥協を好むようです)。技術の進歩によっても、この部分は何がベストプラクティスかは常に変わっていくものだと思います。