背景
とあるPHPのフレームワークの挙動でわからないところがあり、コードを見てみたところとてもつらい気持ちになりました。
そこで、実際のところコードの質というのは振り返られているのだろうかと思いたち、調べてみた次第。
まだ手法としてかなり雑だと思いつつ、現在までに見えてきたことをシェアしてみます。
評価手法
PHPMD (http://phpmd.org/) を使って各フレームワークのコードを評価しました。
PHPMDにはいくつかの評価ルールがあるのですが、今回はコードの複雑度に興味があったのでCode Size Rules (http://phpmd.org/rules/index.html#code-size-rules )を利用しました。
PHPMDを使えば循環的複雑度等の定量的な指標を算出することもできるのですが、なんせどのように集計したらいいのか考えたり調べたりするのが面倒だったため、今回は単純に「指摘箇所の数」をカウントすることにしてみました。
指摘箇所とは
ルールにはそれぞれ閾値が設定してあり、たとえば、「メソッドの循環的複雑度等が10を超えたら指摘箇所として報告する」といったルールになっています。10を超えたらどんなに複雑でも1ポイント。つまりとても雑な評価です。
補足
各フレームワークのコードを持ってきて評価したつもりなのですが、使ったことがないフレームワークが多いので的はずれなことをしているかもしれません。
測定手順は
- 各フレームワークをsubmodule add
- 例外として fuel のみ composer.phar install を実行 (実行しないと実態に則した評価ができないと思ったため)
- とはいえ fuel/vendor/ はノイズになると思ったため削除
- 計測
というものです。
結果
名前 | コード行数(L) | ファイル数(F) | 指摘箇所(P) | (P/L)*100 | (P/F) | (L/F) |
---|---|---|---|---|---|---|
CodeIgniter | 76894 | 288 | 399 | 0.52 | 1.39 | 267.0 |
CakePHP | 255441 | 673 | 1098 | 0.43 | 1.63 | 379.6 |
Laravel | 87320 | 530 | 148 | 0.17 | 0.27 | 164.8 |
FuelPHP | 116204 | 474 | 846 | 0.77 | 1.88 | 245.1 |
Symfony | 348190 | 3096 | 1085 | 0.31 | 0.35 | 112.5 |
なんとなく自分が興味をもっていたのがLaravelとSymfonyであり、かつ数値的には自分の好みに近そうなので安心しました。
いろいろ雑すぎて突っ込みどころはありすぎるかと思いますが、フィードバックも歓迎です。
見てもあまり意味は無いと思いますが、調査に使ったスクリプトは
https://github.com/k12u/php_frameworks
にあります。