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
定期的に実行して:
- Mamma Mia!の数を監視する
- 新規Mamma Mia!を出さないルールを設ける
- 既存のMamma Mia!を計画的に減らす
完璧を目指す必要はありません。最悪を避けるだけで、プロジェクトの継続性は大きく改善します。
まとめ
| ツール | 確認すること |
|---|---|
| PHPUnit | コードが正しく機能するか |
| PHPStan / Psalm | 型の整合性が取れているか |
| PHP_CodeSniffer | コーディング規約に従っているか |
| PASTA Lunch | プロジェクトが継続できるか |
- 二値判定ではなく4段階でグラデーションを表現
- Mamma Mia!だけは特別対応(最悪を避ける)
- 各メトリクスの解説ドキュメント付き
- チーム全体で取り組みやすい
プロジェクトの持続可能性は、型の正しさだけでは測れません。コードの複雑さと向き合うことが、長期的な開発効率の鍵です。