end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

PHPMD による php source の 循環複雑度計測( Cyclomatic complexity code metrics)

PhpMetrics による php source の 循環複雑度計測( Cyclomatic complexity code metrics) - end0tknr's kipple - web写経開発

php の code metrics は、上記のentry で PhpMetricsによるものを記載していますが、 PhpMetrics や、PHP Depend では、計測できないことがありました。

計測できない原因は不明でしたが、PHPMD では計測できましたので、 以下では PHPMD の使用法をメモしておきます。

install by Composer

https://pdepend.org/download/index.html

上記urlによれば、PHPMDのインストール方法には Composer や git clone 等、複数ありますが、 以前の PhpMetrics が Composer でしたので、今回も利用します。

まぁ、以下のインストール方法は、上記urlの通りです。

また、PHPMDは、別のmetrics ツールである PHP Depend に依存しているらしく これも併せて、vender以下にインストールされます。

$ vi composer.json 
{"require": { "pdepend/pdepend" : "@stable" }}

$ curl -s http://getcomposer.org/installer | php
$ php composer.phar install


$ ./vendor/bin/phpmd --help
Mandatory arguments:
1) A php source code filename or directory. Can be a comma-separated string
2) A report format
3) A ruleset filename or a comma-separated string of rulesetfilenames

Example: phpmd /path/to/source format ruleset

Available formats: ansi, html, json, text, xml.
Available rulesets: cleancode, codesize, controversial, design, naming, unusedcode.

Optional arguments that may be put after the mandatory arguments:
--minimumpriority: rule priority threshold;
                   rules with lower priority than this will not be used
--reportfile: send report output to a file; default to STDOUT
--suffixes: comma-separated string of valid source code filename extensions,
            e.g. php,phtml
--exclude: comma-separated string of patterns that are used to ignore directories.
           Use asterisks to exclude by pattern. For example *src/foo/*.php or *src/foo/*
--strict: also report those nodes with a @SuppressWarnings annotation
--ignore-violations-on-exit: will exit with a zero code, even if any violations are found

code metrics を計測してみる

「phpmd --help」で分かるように PHPMDは 「$ phpmd /path/to/source format ruleset」のように実行します。

ちなみに、ruleset には、以下があるようです。

RULE NOTE
cleancode 整形ルール
codesize コードサイズと複雑度
controversial 賛否両論のあるものの為、検証対象から除外も可
design ソフトウェアデザインというより、コーディングルール
naming 命名規則
unusedcode 未使用コードチェック

で、以下の通りです。

$ ./vendor/bin/phpmd ~/tmp/form/cgi-bin2 text cleancode,codesize

cgi-bin2/form_api.php:122       The function main_confirm_to_complete() has a Cyclomatic Complexity of 15.
                                The configured cyclomatic complexity threshold is 10.
cgi-bin2/form_api.php:122       The function main_confirm_to_complete() has an NPath complexity of 440.
                                The configured NPath complexity threshold is 200.
cgi-bin2/form_api.php:122       The function main_confirm_to_complete() has 238 lines of code.
                                Current threshold is set to 100. Avoid really long methods.
cgi-bin2/form_api.php:223       Avoid using undefined variables such as '$db_name' which will lead to PHP notices.
cgi-bin2/form_api.php:223       Avoid using undefined variables such as '$form_id' which will lead to PHP notices.
cgi-bin2/form_api.php:228       Avoid using undefined variables such as '$save_path' which will lead to PHP notices.
cgi-bin2/form_api.php:233       Avoid using undefined variables such as '$mailfromaddress' which will lead to PHP notices.
cgi-bin2/form_api.php:235       Avoid using undefined variables such as '$mailfromaddress' which will lead to PHP notices.
cgi-bin2/form_api.php:236       Avoid using undefined variables such as '$systemmail' which will lead to PHP notices.
    :                               :