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
}