Perlのメトリクス計測
ソースコードの品質向上のための効果的で効率的なコードレビュー
にメトリクス計測ツールがでてきますが、Perlにももちろんあります。
Perl-Metrics-Simple-0.18 - Count packages, subs, lines, etc. of many files. - metacpan.org
またPerl::Metrics::Simpleを使用したテストモジュール
Test-Perl-Metrics-Simple-0.1 - Use Perl::Metrics::Simple in test programs - metacpan.org
もあります。 循環的複雑度(Cyclomatic complexity)がしきい値を上回ったらテストが失敗するようになっています。
use Test::Perl::Metrics::Simple -complexity => 25;#指定しない場合は30 use Test::More; all_metrics_ok(); done_testing;
上記の様なテストコードを xt/ にでも入れておいてCIツールと組み合わせて、しきい値を上回ったらRedになるようにしておけばいいんじゃないですかね?
追記
Perl::Criticのポリシーモジュール
Perl::Critic::Policy::Subroutines::ProhibitExcessComplexity - Minimize complexity by factoring code into smaller subroutines. - metacpan.org
Perl::Critic::Policy::Modules::ProhibitExcessMainComplexity - Minimize complexity in code that is outside of subroutines. - metacpan.org
もありました。Test::Perl::Criticを既に使用しているのであればこちらを使うのもありですね。
全体のseverityのしきい値を3以下に設定するかポリシーのseverityを引き上げることにより上記のポリシーでチェックが行われます。
[Subroutines::ProhibitExcessComplexity] severity = 5 max_mccabe = 30 [Modules::ProhibitExcessMainComplexity] severity = 5 max_mccabe = 30
なお、Subroutines::ProhibitExcessComplexityだと以下のようにサブルーチン単位で複雑度が指摘されるので(時間は掛かりますが)わかりやすいですね。
# Perl::Critic found these violations in "lib/Foo/Bar.pm": # Subroutine "create" with high complexity score (34) at line 236, column 2. Consider refactoring. (Severity: 5)
さらに追記
Perl::Critic::Policy::Subroutines::ProhibitExcessComplexityで特定のサブルーチンを対象外にしたい場合は no critic を指定するしかなさそうです。
sub foo { ## no critic (Subroutines::ProhibitExcessComplexity) ... ## some too complex codes }