2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PASTA Lunch: PHPのスパゲッティコード可視化

2
Last updated at Posted at 2026-01-21

PHP Alert for Spaghetti Twisted Architecture

PHPプロジェクトを支えるツールたち

PHPプロジェクトの品質を支えるツールには、それぞれ異なる役割があります。

ツール 確認すること
PHPUnit コードが正しく機能するか
PHPStan / Psalm 型の整合性が取れているか
PHP_CodeSniffer コーディング規約に従っているか
? プロジェクトが継続できるか

テストは「今動くこと」を、静的解析は「型が正しいこと」を、コーディング規約は「読みやすいこと」を保証します。

しかし、プロジェクトの継続性—つまり「変更しやすいか」「理解しやすいか」「テストしやすいか」—を測るツールは意外とありません。

継続性を脅かすもの

全てのテストが通り、PHPStanレベル9をパスし、PSR-12に準拠していても、こんなコードは存在します:

  • 分岐が多すぎて何をしているかわからないメソッド
  • 依存が絡み合って変更が怖いクラス
  • フィールドが増え続けて肥大化したDTO

これらは静かにプロジェクトを蝕んでいきます。テストしにくい、変更しにくい、理解しにくい—いわゆるスパゲッティコードです。

PASTA Lunchは、この「継続性」に焦点を当てたツールです。

閾値の問題

PHPMDはこれらの問題を検出できます。しかし、閾値を超えたら警告、超えなければOKという二値判定には限界があります。

例えばCyclomatic Complexityの閾値が10だとして:

  • 値が9のコードは本当に「問題なし」なのか?
  • 値が11と値が50は同じ「問題あり」なのか?

現実のコードはグラデーションです。閾値ギリギリのコードと、完全に破綻したコードを同列に扱うのは無理があります。

4段階のスパゲッティレベル

PASTA Lunchは、コードの複雑さを4段階で評価します。

Level 意味
🍝 Piccolo クリーンコード
🍝🍝 Medio 許容範囲
🍝🍝🍝 Grande リファクタリング推奨
🍝🍝🍝🍝 Mamma Mia! 即対応が必要

この4段階により、チームは優先順位をつけて対応できます。

Mamma Mia!には特別対応を

全てのコード品質問題を一度に解決するのは現実的ではありません。しかしMamma Mia!は放置してはいけません。

Mamma Mia!は:

  • NPathComplexityが500を超える(人間が追跡不能な実行パス数)
  • Cyclomatic Complexityが20を超える(テストケースの爆発)
  • クラスの結合度が20を超える(変更の影響範囲が予測不能)

これらは「ちょっと複雑」ではなく「構造的に破綻している」レベルです。バグ修正のたびに新しいバグを生み、機能追加のたびに予期せぬ副作用を起こす可能性が高いコードです。

チームのルールとして「Mamma Mia!は増やさない、見つけたら優先的に対処する」だけでも、プロジェクトの健全性は大きく変わるのではないでしょうか。

警告が厳しいと感じたら

「フィールドが多いならValueObjectにまとめればいい」「依存が多いならServiceを抽出すればいい」—これは正しい対処です。しかし、なぜそうなったのかを考えないと、本当の問題を見逃します。

  • 30フィールドのDTO → 分解すれば警告は消える → でも、なぜ30も必要だった?
  • 15パラメータのメソッド → オブジェクトにまとめれば警告は消える → でも、なぜそんなに渡す必要が?
  • 20の依存を持つクラス → Serviceに切り出せば警告は消える → でも、なぜ20も必要だった?

警告は症状です。ValueObjectやServiceは正しい設計を表現する手段であって、警告を消すために作るものではありません。

「厳しすぎる」と感じたら、それは設計を見直すサインかもしれません。概念が適切に分解されていない、責務の境界が曖昧—そういった根本的な問題が隠れている可能性があります。

問題を理解するためのドキュメント

PASTA Lunchは各メトリクスについて、なぜそれが問題なのか、どう改善すべきかを解説するドキュメントを用意しています。

レポートの各issue名はドキュメントへのリンクになっており、クリックすると:

  • そのメトリクスが何を測っているか
  • なぜその値が問題なのか
  • 具体的な改善パターン

がわかります。「CCが高いと言われたけど、どうすればいいの?」という疑問にすぐ答えられます。

例えば NpathComplexity のページはこのようなものです。
https://koriym.github.io/pasta-lunch/issues/ja/npath-complexity.html

Issueのインデックスページもあります。
https://koriym.github.io/pasta-lunch/

チームでの活用

PASTA Lunchは、チーム全体でコード品質に取り組むためのツールです。

composer require --dev koriym/pasta-lunch
composer pasta

定期的に実行して:

  1. Mamma Mia!の数を監視する
  2. 新規Mamma Mia!を出さないルールを設ける
  3. 既存のMamma Mia!を計画的に減らす

完璧を目指す必要はありません。最悪を避けるだけで、プロジェクトの継続性は大きく改善します。

まとめ

ツール 確認すること
PHPUnit コードが正しく機能するか
PHPStan / Psalm 型の整合性が取れているか
PHP_CodeSniffer コーディング規約に従っているか
PASTA Lunch プロジェクトが継続できるか
  • 二値判定ではなく4段階でグラデーションを表現
  • Mamma Mia!だけは特別対応(最悪を避ける)
  • 各メトリクスの解説ドキュメント付き
  • チーム全体で取り組みやすい

プロジェクトの持続可能性は、型の正しさだけでは測れません。コードの複雑さと向き合うことが、長期的な開発効率の鍵です。

GitHub: https://github.com/koriym/pasta-lunch

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?