"Service層"が持つ危険性について考える

「Service層とは何か」を一言で説明できる人は少ないのではないだろうか

Service層を定義しているプロジェクトは多いが、Model層のようにガッチリと責務が定義されている訳ではなく企業やプロジェクトによって、その責務はバラバラである事が多い。

今まで自分が見てきた"Service層"を紹介する

ApplicationService的な使われ方をしているService層

  • オブジェクトのやりとりを結合させる部分として利用されていた
  • コンストラクタにオブジェクトのインスタンスを持つ
  • Controllerから呼び出されれる事が多い

DomainService的な使われ方をしているService層

  • ドメイン知識がService層に実装されているケース
  • MVC構成なのにも関わらず、DomainServiceが存在し、Model層がドメインモデル貧血症に陥るケースを過去に見た

lib的な使われ方をしているService層

  • ドメインもModelも関係していないファイル操作のような処理がService層に定義されているケース

置き場がないロジックをとりあえず置いておく為のService層

  • 何でも屋さん
  • Controllerに出てきてしまったファットな処理を、とりあえず退けておくのに使われる

課題はなんなのか

  • 上で挙げた例が全て"Service層"と名前がつけられていた事である
  • "Service層"の責務が複数存在することになる
  • しっかりと責務が定義されていない場合、新規メンバーのキャッチアップは難しくなる
  • コードの依存関係がめちゃくちゃになり保守は困難を極めるだろう

どうすればいいのか