LaravelでService層を利用していますが、fat Serviceになっているプロジェクトをよく目にします。
なぜfat Serviceになるのか?
なぜfat Serviceになるのか?
結論は次のとおりです。
fat Controllerになるほどの記述量を1つのServiceファイルに移行しているだけだからです。
Serviceファイルの分割まで意識していないので、fat Serviceになる。
特徴としては、Controllerで処理は書かないものの、その内容を1つのServiceファイルにまとめて実装しているので、
結果、fat Serviceになっているケースが多いです。
fat controllerになるほどの記述量ですから、
それをServiceファイルに移行すれば、fat Serviceになるのは当然です。
Serviceファイルを分割して、Package化する
パッケージ化は下記のようにServiceを分割する。
/Artice
├── /ArticeUpdateService.php
├── /ArticeCreateService.php
├── /ArticePublicService.php
これはあくまで例であるが、ファイル名で更新処理・作成処理・公開処理の処理に分けられていることがわかる。
ファイルを分割することで、関連した関数しかないため、読むべきコード量がグッと減らすことができる。
必要な分だけ読めばいいので、仕様理解に繋がりやすい。
全てわける必要はない
全部分けるわけではなく、一つのメソッドではコード量が多く、private関数で分割する必要がある際などに、パッケージ化すると良いです。
つまり、複雑なものはファイルを分けた方がいいということです。
関数の凝集度を大切にしています。
インターフェースがシンプルになる。
<?php
interface IArticePublicService
{
/**
* 記事を公開
*
* @return bool
*/
public function handle(): bool;
}
ファイル名でどの処理をするのかわかるため、public 関数はhandle()
というシンプルな命名で完結します。
そのため、まずはhandle()
を読めばいいんだと読み手に伝わります。
どのファイルもhandle()
という命名で統一されれば、プロジェクト内ではまずhandle()
とつく関数を確認すればいいという、共通認識を持ちやすくなります。
そういった面でも非常に読みやすくなります。
まとめ
- 複雑な処理はファイルを分けて書く。
- 複雑な処理は複数のprivateメソッドに分ける。
- ファイル名を名詞+動詞で命名
- ファイル名で役割がわかるようにしたら、handle()をpublicメソッドにしてシンプルにする。
コメント