PHP_Depend - パッケージ単位のメトリクスを測定する
Javaの世界には、パッケージ単位の「メトリクス」を測定するツールがいくつかあります。ソフトウェアのメトリクスとは、ソフトウェアを計測する方法およびその尺度のことを意味します*1。その尺度を測るツールの1つであるJDependの場合、
- パッケージに依存する外部パッケージの数
- パッケージが依存する外部パッケージの数
- 抽象度(パッケージに属する全クラスのうち、抽象クラスもしくはインターフェイスの割合)
- 不安定性(外部に依存する/される割合)
などを数値で確認することができます*2。
前置きはここまで。
で、本題。
そのJDependを使ってPHPパッケージのメトリクスを測定するPHP_Dependというツールがあるようです。
JDependで測定できる値のほか、「the Overview Pyramid」なるものも測定できるようで、http://www.manuel-pichler.de/exit.php?url_id=1962&entry_id=28という書籍に解説があるそうです。私は分かりませんが。。。orz
で、さっくり使ってみました。まずはインストール。
$ sudo pear channel-discover pear.xplib.de $ sudo pear install xplib/PHP_Depend-beta $ pdepend --help $ pdepend --help PHP_Depend 0.8.0beta2 by Manuel Pichler Usage: pdepend [options] [logger] <dir[,dir[,...]]> --jdepend-chart=<file> Generates a diagram of the analyzed packages. --jdepend-xml=<file> Generates the package dependency log. --overview-pyramid=<file> Generates a chart with an Overview Pyramid for the analyzed project. --summary-xml=<file> Generates a xml log with all metrics. --coderank-mode=<*[,...]> Used CodeRank strategies. Comma separated list of 'inheritance'(default), 'property' and 'method'. --suffix=<ext[,...]> List of valid PHP file extensions. --ignore=<dir[,...]> List of exclude directories. --exclude=<pkg[,...]> List of exclude packages. --without-annotations Do not parse doc comment annotations. --help Print this help text. --version Print the current PHP_Depend version. $
たとえば、私がインストール済みのServices_*パッケージ
- Services_FeedMeter 0.1.1
- Services_Hatena_Favorites 0.0.2
- Services_Hatena_Star 0.0.3
- Services_MixiAPI 0.1.2
- Services_Muboh 0.1.1
- Services_Recruit_Abroad 0.0.2
- Services_Recruit_Akasugu 0.0.2
- Services_Amazon 0.7.0
- Services_Hatena 0.1.1
- Services_OpenSearch 0.1.0
- Services_W3C_HTMLValidator 0.2.0
- Services_YouTube 0.2.1
について、パッケージ毎の抽象度vs不安定性のグラフを出す場合、
$ pdepend --jdepend-chart=pear.svg --ignore="test" /usr/local/lib/php5/pear/Services/ PHP_Depend 0.8.0beta2 by Manuel Pichler Parsing source files: ............................................................ 60 ....... 68 Executing Dependency-Analyzer: ...................................... 761 Generating pdepend log files, this may take a moment. $
で実行すると、
な感じのSVG形式のグラフが出力されます。1つの丸が1つのパッケージを表します。貼り付けてあるのは別途キャプチャした画像ですが、SVGの場合、マウスオーバーするとパッケージめーが表示されます。また、ImageMagick拡張がインストールされていると、画像ファイルも出力されるようです。
ついでに、主なフレームワークのパッケージ毎の抽象度vs不安定性のグラフを出してみました。対象は、
です。
まずは、CakePHP 1.1.19.6305。何となく予想してましたが、抽象度は低めっぽいです。
CakePHP 1.2.0.7125-RC1。同じ傾向ですが、不安定性は1.1に比べて両極に分かれぎみになってます。
次は、symfony-1.0.16。パッケージが多いですね。パッケージによって、ばらつきがあるようで、抽象度の高いパッケージもいくつかあるようです。
symfony-1.1.0RC2。これも1.0系と同じ傾向のようです。
ZendFramework-1.5.2についてもやってみたんですが、途中でabortしてしまいました。。。ファイル数が多すぎたみたいです。再チャレンジしてますので、うまくいったらUPします。
PHPの場合、Javaの要素を積極的に取り入れた割に「設計」がなかなか注目されない感じがするんですが、こういった客観的な数値を取り入れたい or 気にされてる方は使ってみるといいかも知れません。