トップ «前の日記(2010-03-31) 最新 次の日記(2010-04-02)» 編集

2010-04-01 [長年日記]

_ 測る - PHP編

必要に迫られて『ソフトウェア見積り―人月の暗黙知を解き明かす(スティーブ マコネル/久手堅 憲之)』を読み始めている。チケットの時間なんかもそういうネタなんだけど、この本を読んで、数えられるものをとにかく数えるということから始めている。

で、手元の PHP のコードをどうにか数えないとなと思ってハタと困った。

  1. PHP にはコメントを取り除いたプレーンな PHP コードだけを取り出す簡単な方法がない
  2. もともとが HTML への埋め込み言語であり、混在しているコードがそこかしこにある。これはどう数えるのが妥当なのか?

php -w はホワイトスペースがなくなって行数が分かんない

上の 1 については

php -w script

によってコメントを取り除いたコードが取り出せるんだけど、こいつは

ホワイトスペースも取り除いてしまうので wc に掛けても行数はカウントできない

という致命的な問題を抱えている。仕方ないので

Twitter / wtnabe: ざっくりPHPの行数を数える。; までを1行として。 ...

こんなことをしてみた。

; までを1行として。

 for i in PHPファイルのリスト;
 do
   php -w $i | perl -p -e "s/;/;\n/g" | wc -l
 done | awk '
 {
   sum += $1
 }
 END {
   print sum
 }'

sed が分かんなくて Perl で ; の後ろになくなった改行コードを加えている。本当は自分の書き方だと { の後ろにも改行があった方がいいような気がするんだけどとりあえずざっくりでいいので。

自分の書いたコードに限ると

ちなみに自分のコメントの書き方は phpdoc 用のコメントがほとんどで、書き方としては

/**
 *
 */
class Klass {
  ...
  /**
   *
   */
  function funktion {
    ...
  }
}

みたいな感じ。基本的にRubyコーディング規約をベースにしている。また以前ざっと数えたときに

コード : コメント = 1 : 1

の比率になっていたので、そのまま wc -l して 2 で割るとだいたい正確な数字が出る。これは狙って 1 : 1 にしているわけじゃないんだけど、クラスの説明やらやりとりされるデータ構造なんかを書いていると自然とそれくらいに落ち着くことが多い。ただし時間に余裕がないとこの部分のコメントが真っ先に削られてしまう。*1

混在スクリプトはそのまま wc -l でもいいかも?

数え始めて

HTML と PHP の混在スクリプトはどうするのがよいか?

という疑問が出てきた。こうした混在スクリプトには

  1. HTML の比重の大きいタイプ
  2. PHP の比重の大きいタイプ

に大別できるが、いずれも多くのケースで Controller, View 相当のコードは

一直線に上から下へ書くシーケンシャルなコード

となりやすい。?>HTML<?php による HTML 出力はそのコードが実行されたタイミングで問答無用で行われるので、V, C 相当の部分で凝ったテクニックは使えない。従って HTML, PHP 混在スクリプトは

メンテナンス性? なにそれおいしいの?

な状態であることが多い。つまり

とにかく大変な状態

なので、

丸ごと行数を規模としてカウントしちゃうことにした。

ほんとに大変なんだよ、こういうコードのメンテは。恐ろしく生産性低いんだ。やったら長くなるしものすごく繊細なんだ。

Tags: PHP

*1 基本的にTDDなのでテストはなくならない。ただし乱暴な確認だけでどんどん進んでしまっている場合もある。