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 混在スクリプトは

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

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

とにかく大変な状態

なので、

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

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

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

About

例によって個人のなんちゃらです

Recent Posts

Categories

Tool 日々 Web Biz Net Apple MS ことば News Unix howto Food PHP Movie Edu Community Book Security Text TV Perl Ruby Music Pdoc 生き方 RDoc ViewCVS CVS Rsync Disk Mail FreeBSD Cygwin PDF Photo Zebedee Debian OSX Comic Cron Sysadmin Font Analog iCal Sunbird DNS Linux Wiki Emacs Thunderbird Sitecopy Terminal Drawing tDiary AppleScript Life Money Omni PukiWiki Xen XREA Zsh Screen CASL Firefox Fink zsh haXe Ecmascript PATH_INFO SQLite PEAR Lighttpd FastCGI Subversion au prototype.js jsUnit Apache Trac Template Java Rhino Mochikit Feed Bloglines CSS del.icio.us SBS qwikWeb gettext Ajax JSDoc Rails HTML CHM EPWING NDTP EB IE CLI ck ThinkPad Toy WSH RFC readline rlwrap ImageMagick epeg Frenzy sysprep Ubuntu MeCab DTP ERD DBMS eclipse Eclipse Awk RD Diigo XAMPP RubyGems PHPDoc iCab DOM YAML Camino Geekmonkey w3m Scheme Gauche Lisp JSAN Google VMware DSL SLAX Safari Markdown Textile IRC Jabber Fastladder MacPorts LLSpirit CPAN Mozilla Twitter OpenFL Rswatch ITS NTP GUI Pragger Yapra XML Mobile Git Study JSON VirtualBox Samba Pear Growl Mercurial Rack Capistrano Rake Win RSS Mechanize Sitemaps Android JavaScript Python RTM OOo iPod Yahoo Unicode Github iTunes God SBM friendfeed Friendfeed HokuUn Sinatra TDD Test Project Evernote iPad Geohash Location Map Search Simplenote Image WebKit RSpec Phone CSV WiMAX USB Chrome RubyKaigi RubyKaigi2011 Space CoffeeScript Nokogiri Hpricot Rubygems jQuery Node GTD CI UX Design VCS Kanazawa.rb Kindle Amazon Agile Vagrant Chef Windows Composer Dotenv PaaS Itamae SaaS Docker Swagger Grape WebAPI Microservices OmniAuth HTTP 分析基盤 CDN Terraform IaaS HCL Webpack Vue.js BigQuery Middleman CMS AWS PNG Laravel Selenium OAuth OpenAPI GitHub UML GCP TypeScript SQL Hanami Document SVG AsciiDoc Pandoc DocBook Develop Jekyll macOS Node.js Vite Heroku Transformer AI Data Cloud Wasm