Service層はPackage化して可読性を上げる

Laravel

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メソッドにしてシンプルにする。
ぎゅう
WEBエンジニア
渋谷でWEBエンジニアとして働く。
LaravelとVue.jsをよく取り扱い、誰でも仕様が伝わるコードを書くことを得意とする。
先輩だろうがプルリクにコメントをして、リファクタしまくる仕様伝わるコード書くマン
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次
閉じる