データ量がかなり膨大、かつ正規化され過ぎているため、様々なテーブルとJOINし、様々なwhere句を使っているリポジトリのメソッドがあります。
このリポジトリのメソッドは以下の課題を持っています。
1.集約に関係しないリポジトリからもインターフェイスを介さず、直接呼ばれている
2.クエリが複雑過ぎて保守出来ない(改修した時の影響が見切れない)
性能要件に抵触したため、リファクタリングすることになりました。
まずは単体テストを書いて、想定できるケースは網羅しました。
この後どのようにリファクタリングを進めるべきでしょうか?
また、どの程度までリファクタリングするのがコスパが良いでしょうか?
まず、リポジトリは「集約単位で入出力するもの」というのが定義なので、集約外のものにアクセスするのはお勧めしません。ドメイン層のIFを見た時に挙動が想像できず、事故のもとになったり可読性を下げる可能性があるからです。
その場合はまず、リポジトリとクエリサービスを分けます。クエリは1つ1つのクエリごとにクラスやメソッドを分離し、高凝集低結合にすることで保守性を高めることを目指します。1つのクラス内でメソッド依存クラスを共有した状態から、高凝集低結合にきりわけることで改善の方向にむかうとおもいます。
こちらの記事も読んでみてください。
https://little-hands.hatenablog.com/entry/2019/12/02/cqrs
リファクタリングは、基本的には「かけたコスト」と「将来得られるであろうリターン」の天秤で考えます。リターンとは、可読性が高まることでその後の開発スピードが上がる、バグを生みにくくなる、知見伝達しやするする、などです。
ファクタリングに関しては、こちらの記事も参照してみてください。
https://zenn.dev/loglass/articles/961e283e6fbe71