7/11

DBからのデータ取得をリポジトリ層で行なっているのですが、検索条件が複雑なパターンが多いため、現在はfindByXXみたいな感じで条件毎にメソッドを切っています。
この場合、どうしてもメソッドが多くなり肥大化の要因になってしまいそうなので整理できないかと考えているのですが、設計を見直すポイント等あれば教えていただけないでしょうか?

条件を表すオブジェクトを作成してリポジトリに渡すのが良いでしょう。 findBySpecificationというようなメソッドです。Specificationはドメイン層に定義するインターフェイスにして、同じくドメイン層にUserIdSpecification, MailAddressSpecificationといった実装クラスを作成します。 このUserIdSpecificationにはUserIdだけ保持します。ここに「toQueryCondition」のようなメソッドを持たせると、インフラ層に書くべきORMapperの知識がドメイン層に流出してしまいます。 そのため、Specificationからクエリの変換はインフラ層のリポジトリ実装クラスの中で行います。kotlinだと、interfaceの実装クラスでwhen式(他言語だとswitch文で)型を判定してcastし、そこから保持している値を取り出してクエリを組み立てます。これがレイヤーの責務を保持して実現する方法です。