Mistake #53 : The Fat Controller

厨房で皿を洗う店長

「全部私がやります!」
責任感が強いのは結構ですが、店長(Controller)が自ら包丁を握り、
接客をし、トイレ掃除までしていたら、その店はいつか破綻します。

🍝 スパゲッティ厨房診断
  • Controllerクラスの行数が1000行を超えている
  • 「ビジネスロジック」を書く場所が決まっておらず、Controllerに書いている
  • 同じような処理(メール送信など)が複数のControllerにコピペされている
  • 修正すると、全く関係ないはずの画面が壊れる
⚠️ 警告:あなたのコードは「巨大なゴミ屋敷」です。
どこに何があるか、書いた本人にしか(数日後には本人ですら)分かりません。

01. 店長の仕事、シェフの仕事

class OrderController extends Controller {
  public function store(Request $req) {
    // バリデーションして...
    // 在庫引当のSQLを書いて...
    // クレジットカード決済APIを叩いて...
    // 注文完了メールの本文を作成して...
    // ログを書いて...

MVCモデルにおける「Controller」の役目は、レストランの「店長(マネージャー)」と同じです。
店長の仕事は、「お客様の注文(Request)」を受け取り、「シェフ(Model/Service)」に料理を指示し、
出来上がった料理を「ホール係(View)」に渡すことだけです。
しかし、未熟なプロジェクトでは、店長自らが厨房に入り込み、肉を焼き、皿を洗い、レジ打ちまでしてしまいます。
これを「Fat Controller(太ったコントローラー)」と呼びます。
何でも屋になった店長は過労で倒れ、店(システム)は停止します。

「動けばいい」だけのコードは
「動かし続ける」ことができない。

02. 餅は餅屋に

複雑な処理は、専門家(Serviceクラス)に任せるべきです。
在庫管理は `InventoryService` に、決済は `PaymentService` に。
Controllerは、彼らを呼び出す「1行」を書くだけでいいのです。
「Skinny Controller, Fat Model(痩せたコントローラー、太ったモデル)」を目指しましょう。
役割分担が明確な組織(コード)は、誰かが休んでも(修正しても)、全体に影響を与えません。

03. テスト不能な巨大迷路

Controllerにロジックを詰め込むと、自動テスト(単体テスト)が書けなくなります。
HTTPリクエスト全体をモックしなければならないからです。
ロジックを切り出していれば、「在庫計算ロジック」だけをピンポイントでテストできます。
テストがないコードは、時限爆弾と同じです。
爆発する前に、解体(リファクタリング)工事を始めましょう。

執筆:ソフトウェア・アーキテクトチーム

「10年戦えるシステム」を設計する構造化のプロフェッショナル。
ドメイン駆動設計(DDD)やクリーアーキテクチャの導入支援実績多数。