Reputation: 137
I want to refactor this ruby code
class UtilService
def summer_start
...
end
def summer_end
...
end
def calc(date, charge, quantity, winter_rate, winter_service_charge, summer_rate)
if date < summer_start || date > summer_end
chargeamt = quantity * winter_rate + winter_service_charge
else
chargeamt = quantity * summer_rate
end
chargeamt
end
end
Since charge isn't being used I know I can get rid of that but other than getting rid of that one parameter I can't think of what else I can actually do.
I was also thinking of breaking up 'calc' into different methods
class UtilService
def summer_start
end
def summer_end
end
def calc_summer_rate(date, quantity, summer_rate)
if date > summer_start || date < summer_end
chargeamt = quantity * summer_rate
end
chargeamt
end
def calc_winter_rate(date, quantity, winter_rate, winter_service_charge)
if date < summer_start || date > summer_end
chargeamt = quantity * winter_rate + winter_service_charge
end
chargeamt
end
end
But it doesn't seem like my refactoring makes much sense.
Upvotes: 0
Views: 53
Reputation: 110675
I would be inclined to write something like the following.
rates = { winter: { per_unit: 123, service_charge: 456 },
summer: { per_unit: 135, service_charge: 0 } }
def calc(date, quantity, rates)
rate = summer?(date) ? rates[:summer] : rates[:winter]
quantity * rate[:per_unit] + rate[:service_charge]
end
def summer?(date)
date.between?(summer_start, summer_end)
end
Upvotes: 3
Reputation: 10497
I don't see big refactoring needed, maybe just moving the is summer? logic to another method and removing unnecesary chargeamt
variable; something like this:
class UtilService
def summer_start
end
def summer_end
end
def calc(date, quantity, winter_rate, winter_service_charge, summer_rate)
if summer?(date)
quantity * winter_rate + winter_service_charge
else
quantity * summer_rate
end
end
private
def summer?(date)
date > summer_start || date < summer_end
end
end
Upvotes: 2