Qiitaでトレンド入りしていた下記の記事を読んで
循環的複雑度を可視化し、強制的に改善させるにLaravelにphpmdを導入しました
プログラムの可読性を上げるための条件分岐を減らす方法7個
循環的複雑度について
phpmdのinstall
composer.jsonにphpmd/phpmdを追加する
"require-dev": {
"phpmd/phpmd": "*"
},
$ composer update
インストールが完了しました。
次にphpmdのルールファイル作成します
<?xml version="1.0"?>
<ruleset name="Custom_PHPMD">
<description>Custom ruleset PHPMD</description>
<rule ref="rulesets/codesize.xml" />
<rule ref="rulesets/controversial.xml">
<!-- 判定から除外: 変数名がキャメルケースかどうか -->
<exclude name="CamelCasePropertyName" />
<exclude name="CamelCaseParameterName" />
<exclude name="CamelCaseVariableName" />
</rule>
<rule ref="rulesets/design.xml" />
<rule ref="rulesets/unusedcode.xml" />
<rule ref="rulesets/naming.xml">
<!-- 判定から除外: 変数名の長さ -->
<exclude name="LongVariable" />
</rule>
</ruleset>
$ php vendor/phpmd/phpmd/src/bin/phpmd ファイル名 text phpmd.xml
とやれば実行できます
毎回このコマンドを書くのは面倒なので
まとめてartisanコマンドに追加しました。
artisanコマンド作成
$ php artisan make:command PhpmdCommand
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class PhpmdCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'phpmd {file_path}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'phpmd';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$phpmd = base_path('vendor/phpmd/phpmd/src/bin/phpmd');
echo shell_exec('php '.$phpmd.' '.$this->argument('file_path').' text
phpmd.xml');
}
}
$ php artisan phpmd ファイル名
で毎回チェックできるようになりました。
でも修正ファイルを毎回手動で確認するのも面倒なので、
commitする際にチェックさせて、エラーがあったらcommitさせないようにしようと思います。
けっこうチェック厳しいですが、これなら絶対複雑度は下がりますよね。
git hookの設定
.git/hooks/pre-commit
IS_ERROR=0
for file in `git diff --cached --name-only && git diff --name-only`
do
echo $file
ERROR_MSG=`php artisan phpmd $file`
if [ "$ERROR_MSG" != "" ]; then
echo $ERROR_MSG
IS_ERROR=1
fi
done
if [ $IS_ERROR -eq 1 ]; then
echo ""
echo "Please resolve the error"
fi
exit $IS_ERROR
git commit するたびにエラーを指摘されて大変ですが、
命名規則の徹底や複雑度改善がされていい感じですね。
今後ほかのサイトにも導入してみようと思います
以下を参照して修正予定
phpmdのルール一覧
githooksのpre-pushを共有してレポジトリを健全に保つ