Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

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 気にされてる方は使ってみるといいかも知れません。

なお、これらのグラフのSVGファイルをまとめてDo You PHP?に上げてありますので、興味のある方はどうぞ。

追記(2008/06/21 15:26)

ZendFramework-1.5.2は次のようになりました。かなり綺麗に散らばってます。

SVGのzipファイルも更新しました。