Parent

Class/Module Index [+]

Quicksearch

Reek::Smells::ClassVariable

Class variables form part of the global runtime state, and as such make it easy for one part of the system to accidentally or inadvertently depend on another part of the system. So the system becomes more prone to problems where changing something over here breaks something over there. In particular, class variables can make it hard to set up tests (because the context of the test includes all global state).

Public Instance Methods

class_variables_in(ast) click to toggle source

Collects the names of the class variables declared and/or used in the given module.

# File lib/reek/smells/class_variable.rb, line 45
def class_variables_in(ast)
  result = Hash.new {|hash,key| hash[key] = []}
  collector = proc do |cvar_node|
    result[cvar_node.name].push(cvar_node.line)
  end
  [:cvar, :cvasgn, :cvdecl].each do |stmt_type|
    ast.each_node(stmt_type, [:class, :module], &collector)
  end
  result
end
examine_context(ctx) click to toggle source

Checks whether the given class or module declares any class variables.

@return [Array<SmellWarning>]

# File lib/reek/smells/class_variable.rb, line 31
def examine_context(ctx)
  class_variables_in(ctx.exp).map do |attr_name, lines|
    smell = SmellWarning.new(SMELL_CLASS, ctx.full_name, lines,
      "declares the class variable #{attr_name.to_s}",
      @source, SMELL_SUBCLASS,
      {VARIABLE_KEY => attr_name.to_s})
    smell
  end
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.