Class: Roodi::Checks::CyclomaticComplexityMethodCheck

Inherits:
CyclomaticComplexityCheck show all
Defined in:
lib/roodi/checks/cyclomatic_complexity_method_check.rb

Overview

Checks cyclomatic complexity of a method against a specified limit.

The cyclomatic complexity is measured by the number of “if”, “unless”, “elsif”, “?:”, “while”, “until”, “for”, “rescue”, “case”, “when”, “&&”, “and”, “||” and “or” statements (plus one) in the body of the member. It is a measure of the minimum number of possible paths through the source and therefore the number of required tests.

Generally, for a method, 1-4 is considered good, 5-8 ok, 9-10 consider re-factoring, and 11+ re-factor now!

Constant Summary collapse

DEFAULT_COMPLEXITY =
8

Constants inherited from CyclomaticComplexityCheck

Roodi::Checks::CyclomaticComplexityCheck::COMPLEXITY_NODE_TYPES

Constants inherited from Check

Roodi::Checks::Check::NODE_TYPES

Instance Attribute Summary

Attributes inherited from CyclomaticComplexityCheck

#complexity

Instance Method Summary collapse

Methods inherited from Check

#add_error, #end_file, #errors, #evaluate_end, #evaluate_node, #evaluate_node_end, #evaluate_node_start, #evaluate_start, make, #position, #start_file

Constructor Details

#initializeCyclomaticComplexityMethodCheck

Returns a new instance of CyclomaticComplexityMethodCheck.



18
19
20
21
# File 'lib/roodi/checks/cyclomatic_complexity_method_check.rb', line 18

def initialize
  super()
  self.complexity = DEFAULT_COMPLEXITY
end

Instance Method Details

#evaluate_end_defn(node) ⇒ Object



32
33
34
# File 'lib/roodi/checks/cyclomatic_complexity_method_check.rb', line 32

def evaluate_end_defn(node)
  decrease_depth
end

#evaluate_matching_endObject



36
37
38
# File 'lib/roodi/checks/cyclomatic_complexity_method_check.rb', line 36

def evaluate_matching_end
  add_error "Method name \"#{@method_name}\" cyclomatic complexity is #{@count}.  It should be #{@complexity} or less." unless @count <= @complexity
end

#evaluate_start_defn(node) ⇒ Object



27
28
29
30
# File 'lib/roodi/checks/cyclomatic_complexity_method_check.rb', line 27

def evaluate_start_defn(node)
  @method_name = @node[1]
  increase_depth
end

#interesting_nodesObject



23
24
25
# File 'lib/roodi/checks/cyclomatic_complexity_method_check.rb', line 23

def interesting_nodes
  [:defn] + COMPLEXITY_NODE_TYPES
end