Complex method SequencingQcBatch::adjacent_state_helper (34.8) Open
def self.adjacent_state_helper(direction, offset, delimiter) # rubocop:todo Metrics/AbcSize
define_method(:"qc_#{direction}_state") do
unless qc_states.include?(qc_state.to_s)
raise StandardError, "Current QC state appears to be invalid: '#{qc_state}'"
end
- Read upRead up
- Exclude checks
Flog calculates the ABC score for methods. The ABC score is based on assignments, branches (method calls), and conditions.
You can read more about ABC metrics or the flog tool
SequencingQcBatch#self.adjacent_state_helper calls 'qc_state.to_s' 3 times Open
unless qc_states.include?(qc_state.to_s)
raise StandardError, "Current QC state appears to be invalid: '#{qc_state}'"
end
return nil if qc_state.to_s == qc_states.send(delimiter)
- Read upRead up
- Exclude checks
Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.
Reek implements a check for Duplicate Method Call.
Example
Here's a very much simplified and contrived example. The following method will report a warning:
def double_thing()
@other.thing + @other.thing
end
One quick approach to silence Reek would be to refactor the code thus:
def double_thing()
thing = @other.thing
thing + thing
end
A slightly different approach would be to replace all calls of double_thing
by calls to @other.double_thing
:
class Other
def double_thing()
thing + thing
end
end
The approach you take will depend on balancing other factors in your code.
SequencingQcBatch#self.state_transition_helper performs a nil-check Open
update_attribute(:qc_state, qc_next_state) unless qc_next_state.nil? # rubocop:disable Rails/SkipsModelValidations
- Read upRead up
- Exclude checks
A NilCheck
is a type check. Failures of NilCheck
violate the "tell, don't ask" principle.
Additionally, type checks often mask bigger problems in your source code like not using OOP and / or polymorphism when you should.
Example
Given
class Klass
def nil_checker(argument)
if argument.nil?
puts "argument isn't nil!"
end
end
end
Reek would emit the following warning:
test.rb -- 1 warning:
[3]:Klass#nil_checker performs a nil-check. (NilCheck)
TODO found Open
# TODO[xxx]: Isn't qc_state supposed to be initialised to 'qc_pending' rather than blank?
- Exclude checks
TODO found Open
# TODO[xxx]: Really we should restrict the state transitions
- Exclude checks