package Analizo::Metric::AverageCycloComplexity; use strict; use parent qw(Class::Accessor::Fast Analizo::ModuleMetric); use Statistics::Descriptive; =head1 NAME Analizo::Metric::AverageCycloComplexity - Average Cyclomatic Complexity per Method (ACCM) metric =head1 DESCRIPTION The metric calculation is based on the following article and calculates the cyclomatic complexity of the program. Article: I. The Average Cyclomatic Complexity per Method is calculated counting the predicates (i.e., decision points, or conditional paths) on each method plus one, then a mean of all methods is returned as the final value of ACCM. The cyclomatic complexity of a program represented as a graph can be calculated using a formula of graph theory: v(G) = e - n + 2 Where C is the number of edges and C is the number of nodes of the graph. Another good reference is: I. =cut __PACKAGE__->mk_accessors(qw( model )); sub new { my (\$package, %args) = @_; my @instance_variables = ( model => \$args{model} ); return bless { @instance_variables }, \$package; } sub description { return 'Average Cyclomatic Complexity per Method'; } sub calculate { my (\$self, \$module) = @_; my @functions = \$self->model->functions(\$module); if (scalar(@functions) == 0) { return 0; } my \$statisticalCalculator = Statistics::Descriptive::Full->new(); for my \$function (@functions) { \$statisticalCalculator->add_data(\$self->model->{conditional_paths}->{\$function} + 1); } return \$statisticalCalculator->mean(); } 1;