Search code examples
ruby-on-railscyclomatic-complexity

How to reduce 'complexity too high' with || - or operator


I've got a simple method that counts total lesson hours in the university schedule for additional modules in the department (students can attend many departments)

 def hours_total
    @hours_total = user.open_departments.each_with_object({}) do |department, h|
      h[department] = (sports_hours[department] || 0) +
                    (science_hours[department] || 0) +
                    (intership_sum[department] || 0) +
                    (art[department] || 0) -
                    ((obligatory_topics[department] || 0) +
                    (base[department] || 0))
    end
  end

How can I fix here Cyclomatic complexity for hours_total is too high.? I have no idea how to not repeat || 0 cause in some departments sports_hours[department] can be nil value


Solution

  • The first step I'd take

    def hours_total
      @hours_total = user.open_departments.each_with_object({}) do |department, h|
        positive = [sport_hours, science_hours, internship_sum, art].sum do |pos_h|
                     pos_h[department].to_i
                   end
    
        negative = [obligatory_topics, base].sum do |neg_h|
                     neg_h[department].to_i
                   end
    
        h[department] = positive - negative
      end
    end
    

    Note: if your hours can be float values, substitute to_i with to_f.

    Now if you and your Rubocop are ok with that, I'd probably leave it. If any of you is unhappy, the positive and negative should be extracted to a method.