Shu*_*Liu 0 ruby refactoring ruby-on-rails automated-refactoring
这是我的报告控制器中的代码,它看起来很糟糕,有人能给我一些关于如何整理它的建议吗?
# app\controller\reports_controller.rb
@report_lines = []
@sum_wp, @sum_projcted_wp, @sum_il, @sum_projcted_il, @sum_li,@sum_gross_profit ,@sum_opportunities = [0,0,0,0,0,0,0]
date = @start_date
num_of_months.times do
wp,projected_wp, invoice_line,projected_il,line_item, opp = Report.data_of_invoicing_and_delivery_report(@part_or_service,date)
@sum_wp += wp
@sum_projcted_wp +=projected_wp
@sum_il=invoice_line
@sum_projcted_il +=projected_il
@sum_li += line_item
gross_profit = invoice_line - line_item
@sum_gross_profit += gross_profit
@sum_opportunities += opp
@report_lines << [date.strftime("%m/%Y"),wp,projected_wp ,invoice_line,projected_il,line_item,gross_profit,opp]
date = date.next_month
end
Run Code Online (Sandbox Code Playgroud)
我想用一些像这样的方法
@sum_a,@sum_b,@sum_c += [1,2,3]
Run Code Online (Sandbox Code Playgroud)
我的想法是:将代码移动到模型中.
目标应该是"精简控制器",因此它们不应包含业务逻辑.
其次,我喜欢将我的报表行作为OpenStruct()对象呈现给我的视图,这对我来说似乎更清晰.
所以我考虑将这个累积逻辑转移到(最有可能)一个关于Report的类方法,并返回一个"report line"OpenStructs数组和一个总计OpenStruct传递给我的View.
我的控制器代码会变成这样:
@report_lines, @report_totals = Report.summarised_data_of_inv_and_dlvry_rpt(@part_or_service, @start_date, num_of_months)
Run Code Online (Sandbox Code Playgroud)
编辑:(一天后)
看着添加累积到阵列的东西,我想出了这个:
require 'test/unit'
class Array
def add_corresponding(other)
each_index { |i| self[i] += other[i] }
end
end
class TestProblem < Test::Unit::TestCase
def test_add_corresponding
a = [1,2,3,4,5]
assert_equal [3,5,8,11,16], a.add_corresponding([2,3,5,7,11])
assert_equal [2,3,6,8,10], a.add_corresponding([-1,-2,-2,-3,-6])
end
end
Run Code Online (Sandbox Code Playgroud)
看:一个测试!它似乎工作正常.没有检查两个阵列之间的大小差异,所以有很多方法可能会出错,但这个概念似乎听起来不够.我正在考虑尝试类似的东西,让我可以使用ActiveRecord结果集并将其累积到OpenStruct中,这是我在报告中使用的...
我们新的Array方法可能会将原始代码减少为:
totals = [0,0,0,0,0,0,0]
date = @start_date
num_of_months.times do
wp, projected_wp, invoice_line, projected_il, line_item, opp = Report.data_of_invoicing_and_delivery_report(@part_or_service,date)
totals.add_corresponding [wp, projected_wp, invoice_line, projected_il, line_item, opp, invoice_line - line_item]
@report_lines << [date.strftime("%m/%Y"),wp,projected_wp ,invoice_line,projected_il,line_item,gross_profit,opp]
date = date.next_month
end
@sum_wp, @sum_projcted_wp, @sum_il, @sum_projcted_il, @sum_li, @sum_opportunities, @sum_gross_profit = totals
Run Code Online (Sandbox Code Playgroud)
...如果Report#data_of_invoicing_and_delivery_report也可以计算,那gross_profit将进一步减少到:
num_of_months.times do
totals.add_corresponding(Report.data_of_invoicing_and_delivery_report(@part_or_service,date))
end
Run Code Online (Sandbox Code Playgroud)
完全没有经过测试,但是对于在阵列中添加单线方法并在模型中执行单个额外减法而言,这是一个减少的地狱.
| 归档时间: |
|
| 查看次数: |
336 次 |
| 最近记录: |