リポジトリがドメインに依存しすぎた話
題材 リポジトリがドメインに依存するのはありか? ドメインを知りすぎた実装 ドメインを知りすぎない実装 今回は、リポジトリがドメインに依存しすぎた話を書きたいと思います。 題材 題材は、口座振替管理アプリで、ローカルの DB にデータを保存する場合の話です。 支払情報編集画面という画面があり、この画面では、データの新規登録と既存データの更新が可能になっています。 この「新規登録」処理と「更新」処理を行う際に、リポジトリはどこまでドメインを知っていていいのか?という話になります。 リポジトリがドメインに依存するのはありか? まず、クリーンアーキテクチャ的には、リポジトリがドメインに依存することは間違ってはいません。 ただし、どこまで知っていてよいのかは検討の余地があるというのが今回の学びです。 ドメインを知りすぎた実装 まずは、ドメインを知りすぎた良くない実装を紹介します。 以下は、支払情報を表す Payment オブジェクトです。 sealed interface Payment { val name: PaymentName val payerId: PayerId data class Persisted( val id: PaymentId, override val name: PaymentName, override val payerId: PayerId = PayerId.NONE, ) : Payment data class InMemory( override val name: PaymentName, override val payerId: PayerId = PayerId.NONE, ) : Payment } 編集の場合は、すでにデータが永続化されているため、 Persisted オブジェクトで表現します。永続化済みのデータは ID を持っています。 新規登録の場合は、 ID を持っていないため InMemory オブジェクトで表現します。 リポジトリ側には、この Payment オブジェクトが渡され、このオブジェクトの実態が Persisted なのか、 InMemory なのかによって、新規作成か、更新かを分けています。 ...