Class: Reek::Smells::TooManyInstanceVariables

Inherits:
SmellDetector show all
Defined in:
lib/reek/smells/too_many_instance_variables.rb

Overview

A Large Class is a class or module that has a large number of instance variables, methods or lines of code.

+TooManyInstanceVariables' reports classes having more than a configurable number of instance variables.

Constant Summary collapse

MAX_ALLOWED_IVARS_KEY =

The name of the config field that sets the maximum number of instance variables permitted in a class.

'max_instance_variables'
DEFAULT_MAX_IVARS =
9

Constants inherited from SmellDetector

SmellDetector::DEFAULT_EXCLUDE_SET, SmellDetector::EXCLUDE_KEY

Instance Attribute Summary

Attributes inherited from SmellDetector

#smell_category, #smell_type, #smells_found, #source

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from SmellDetector

#config_for, #configure_with, default_smell_category, #enabled?, #enabled_for?, #examine, #exception?, #initialize, #register, #report_on, smell_type, #value

Constructor Details

This class inherits a constructor from Reek::Smells::SmellDetector

Class Method Details

.contextsObject

:nodoc:


23
24
25
# File 'lib/reek/smells/too_many_instance_variables.rb', line 23

def self.contexts      # :nodoc:
  [:class]
end

.default_configObject


27
28
29
30
31
32
# File 'lib/reek/smells/too_many_instance_variables.rb', line 27

def self.default_config
  super.merge(
    MAX_ALLOWED_IVARS_KEY => DEFAULT_MAX_IVARS,
    EXCLUDE_KEY => []
  )
end

.smell_categoryObject


19
20
21
# File 'lib/reek/smells/too_many_instance_variables.rb', line 19

def self.smell_category
  'LargeClass'
end

Instance Method Details

#examine_context(ctx) ⇒ Array<SmellWarning>

Checks klass for too many instance variables.

Returns:


39
40
41
42
43
44
45
46
47
48
# File 'lib/reek/smells/too_many_instance_variables.rb', line 39

def examine_context(ctx)
  @max_allowed_ivars = value(MAX_ALLOWED_IVARS_KEY, ctx, DEFAULT_MAX_IVARS)
  count = ctx.local_nodes(:ivasgn).map { |ivasgn| ivasgn[1] }.uniq.length
  return [] if count <= @max_allowed_ivars
  [SmellWarning.new(self,
                    context: ctx.full_name,
                    lines: [ctx.exp.line],
                    message: "has at least #{count} instance variables",
                    parameters: { count: count })]
end