プログラムを作っているときにこれは共通で使えそうだけどこれはutilsに置くべきか、それともserviceに置くべきか、判断に迷うことがある。共通化した方がコードは少なくなるが、汎用的な分、業務固有のロジックが加わった時に大惨事になる。なのでUtilsに置くべきは業務に影響のないメソッド。イメージしやすいように言えば、今のプロジェクト以外でも使えるメソッドだと思う。例えば2つの数字を渡して足し算するsumメソッドや日付を渡して曜日を返すdayOfWeekメソッドみたいなやつ。このようなメソッドは今のプロジェクト以外でも使える世界共通のメソッド。
一方で今のプロジェクトでしか使えないメソッドはserviceに置くべきだと思う。具体的には自社の業務勤怠システムだと、4時間労働したら15分は休憩が付与されるメソッド。(こんな仕組みがあるかはわからないけど)これは企業によって異なるので、業務固有だと言えるからserviceになる。
UtilsとServiceを分けるポイント
- 状態管理の必要性:
- 状態を持たない、純粋な関数(入力に対して出力が決まる)はUtilsへ。
- 状態やリソース(DB、外部APIなど)を操作するならServiceへ。
- 再利用性:
- 汎用的で他のプロジェクトやモジュールでも使えるならUtilsへ。
- アプリケーション固有で、他の部分で再利用しないならServiceへ。
- 依存関係:
- 他のクラスやリソースに依存しないならUtilsへ。
- 他のクラスやリソースと連携するならServiceへ。
保守しやすい、変更に強いコードにするために置くべき場所は強く意識していきたい。