用循环重构

时间:2016-08-11 10:52:14

标签: ruby

我有两个需要重构的片段

第一块

ActivityA

我知道我可以将其缩减为

if condition
  array.each do |a|
    ... # 1st block
    var1 = ClassA.new.methodA
    ... # 2nd block
  end
else
  array.each do |a|
    ... # 1st block
    var1 = ClassB.new.methodB
    ... # 2nd block
  end

但是这个数组非常大(大约10,000),所以必须对每个元素进行array.each do |a| ... # 1st block var1 = condition ? ClassA.new.methodA : ClassB.new.methodB ... # 2nd block end 多次检查。有人知道最优雅的重构方法吗?

第二座

condition

有了这个,我必须用第一个数组元素作为参数初始化变量。 (var1 = method1(array.first) array.[1..-1].each #Loop from 2nd to last element var1 = var1 + method1(a) end ClassA(var1) 表示长链ActiveRecord范围)

这些都是次要的,但我是Ruby的初学者,我认为更好的方法是检查更多使用Ruby的方式。

提前谢谢

2 个答案:

答案 0 :(得分:1)

1

λ = condition ? ClassA.new.method(:methodA) : ClassB.new.method(:methodB)
array.each do |a|
  ... # 1st block
  var1 = λ.(a)
  ... # 2nd block
end

旁注:三元运算符不值得这样的重构;它对生产力的影响是零。另一方面,类实例创建是值得的。

2

var1 = array.reduce { |memo, e| memo + method1(e) }

答案 1 :(得分:0)

只需在开始时将ClassName和MethodName整理出来,然后在循环中使用以下内容。

 "ClassName".constantize.new.send('MethodName', parameter)