重构,如果elsif else或Ruby阻止

时间:2013-10-07 05:26:51

标签: ruby refactoring

def main_method
    new_array = []

    some_array.each do |foo|
      if (method_01? foo) || (method_02? foo) || (method_03? foo) || (method_04? foo) || (method_05? foo)
      else
        new_array << foo
      end
    end
  end

有没有更好的方法来编写上面的代码而没有或(||)和没有elsif条件?

是通过适合这种重构的哈希循环吗?

3 个答案:

答案 0 :(得分:2)

也许这样的事情会有所帮助吗?

我已经更新了我在两组上拆分数组的答案。

def main_method
  methods = [:method1, :method2, :method3]
 non_passed_elems, passed_elems = some_array.partition do |elem|
    methods.none? do |method|
      send(method, elem)
    end
  end
  passed_elems.each{ |t| method_for_passed_elems(t) }
  non_passed_elems.each{ |t| method_for_non_passed_elems(t) }
end

答案 1 :(得分:0)

在不知道具体用例的情况下,很难找到||的替代品,但使用#reject可以清理迭代次数:

def main_method
  some_array.reject do |foo|
    method_01?(foo) || method_02?(foo) # ... etc.
  end
end

#reject会将每个成员放到块中,并返回一个只包含返回false的成员的数组。换句话说,只有将false返回所有方法1-5的成员。

答案 2 :(得分:0)

更简洁的方式:

checkers = (1..5).map {|i| "method_%02d" % i}  # too lazy ;)
new_array = some_array.select {|e| !checkers.any? {|m| e.send m}}

仍然相当可读&amp;明显。