「サービスクラス」とは何か?

──語源・ニュアンス・UseCaseとの違いを整理する

設計の議論をしていると、「それ、サービスクラスじゃない?」という言葉が出てくることがある。 一方で、Web エンジニアの中には「Service クラス」は普通に使う用語だ、という人も多い。

この「サービスクラス」という言葉は、厳密な定義がなく、文脈によって意味が変わるため、混乱を生みやすい。 この記事では、語源と歴史をたどりながら、

  • なぜ「サービス」と呼ばれるのか
  • Web ではどのように使われてきたのか
  • なぜ設計議論では否定的に使われることがあるのか
  • UseCase と何が違うのか

を整理する。


「サービス」という言葉の語源と基本ニュアンス

英語の service は、

  • 奉仕
  • 提供
  • 役務

といった意味を持つ。

ソフトウェア設計においては、そこから転じて、

「他のオブジェクトのために処理を提供するもの」

という、かなり広い意味で使われるようになった。

この時点では、「サービス」はあくまで 役割を説明するための便利な言葉であり、設計上の厳密な概念ではない。


Web / サーバーサイドでの Service クラスの起源

「サービスクラス」という言葉が広く使われるようになったのは、 Java EE や Spring に代表される レイヤードアーキテクチャの文脈である。

典型的な構成は以下のようなものだ。

Controller
  ↓
Service
  ↓
Repository (DAO)

ここでの Service クラスは、

  • Controller から呼ばれる
  • 複数の Repository を組み合わせる
  • トランザクション境界になる
  • 業務ロジックを書く場所

という役割を担っていた。

この文脈では、Service クラスは 中立的、あるいは肯定的な存在である。


なぜ「サービスクラス」が問題視されるようになったのか

問題は、「Service」という言葉の 意味が広すぎることにある。

Service という名前は、

  • 何でも入れられる
  • 責務が曖昧でも違和感が出にくい
  • 「とりあえずここに置く」が起きやすい

という性質を持つ。

その結果、次のようなクラスが生まれやすい。

UserService {
    login()
    logout()
    changePassword()
    resetPassword()
    sendMail()
    updateProfile()
}

これは、

  • 複数の理由で変更される
  • テストが肥大化する
  • クラス名が振る舞いを説明していない

という問題を抱える。

こうして、

「目的が曖昧で、何でも入っているクラス」

を皮肉る意味で、 **「サービスクラス(アンチパターン)」**という言い方が使われるようになった。


DDD における「Service」との分岐

さらに混乱を招く要因として、DDD(ドメイン駆動設計)がある。

DDD には Domain Service という正当な概念が存在する。

  • Entity や ValueObject に属さない
  • しかしドメインとして意味のある操作

例えば:

MoneyTransferService

これはアンチパターンではない。

一方で、設計議論で問題にされる「サービスクラス」は、

  • Domain Service でもない
  • UseCase でもない
  • ただの「便利な中間層」

という点で、まったく別物である。


UseCase は何に対するアンチテーゼなのか

UseCase は、

  • Service という 広すぎる箱を否定し
  • 「ユーザーの目的・操作」単位で責務を切り出す

という考え方である。

OrderService 

PlaceOrderUseCase 
CancelOrderUseCase 

ここで重要なのは、

  • クラス名が「やること」を明確に表している
  • public API が原則 1 つ
  • 変更理由が 1 つに収まりやすい

という点だ。

UseCase は、「Service を使うかどうか」の問題ではなく、 責務をどう切るかに対する答えである。


Web エンジニアが「サービスクラス」と言うときの意味

Web エンジニアが「サービスクラス」という言葉を使う場合、文脈は大きく二つに分かれる。

1. 中立的な意味

  • Controller にロジックを書くな
  • Repository でもない処理を書く場所

という意味での「Service」。

この場合、単なるレイヤ名であり、否定的な意味はない。


2. 否定的な意味(設計議論)

  • 責務が曖昧
  • 何でも屋になっている
  • UseCase として分解できていない

という状態を指して、

「それ、サービスクラス化していないか?」

という警告として使われる。


まとめ

  • 「サービスクラス」には厳密な定義はない
  • 語源的には「処理を提供するもの」という広い意味
  • Web の文脈では、Controller と Repository の間の中間層として使われてきた
  • その曖昧さゆえに、設計が崩れた結果の「なんでも屋」を指す言葉にもなった
  • UseCase は、その曖昧さへのアンチテーゼとして生まれた考え方

重要なのは名前ではなく、 そのクラスが「何のために存在するのか」が一言で説明できるかどうかである。