0

我正在使用一种遗留方法,该方法过滤掉一些数据并返回一个元素数组。

简化版如下所示:

def filtering_rules
  items = []
  items = apply_rule_one
  return items if items == 3

  items = apply_rule_two
  return items if items == 3

  items = apply_rule_three  
  return items if items == 3
end

我需要在运行 apply_rule 三之前添加一个记录器,所以我这样做了:

 def filtering_rules
  items = []
  items = apply_rule_one
  return items if items == 3

  items = apply_rule_two
  return items if items == 3

  Rails.logger("Rule 1 and 2 failed to return data moving to rule 3") if items.empty?  
  items = apply_rule_three  
  return items if items == 3
end

我的测试通过了,一切正常。但是代码不是 DRY 并且规则过滤器中的记录器很丑陋。关于模式或最佳实践的任何建议?

4

2 回答 2

1

这个怎么样?

RULES = [:rule_one, :rule_two, :rule_three]

def filtering_rules
 RULES.each do |rule|
   items = self.send("apply_#{rule}".to_sym)
   return items if items == 3
 end
end

并将您的记录器放入最后一条规则。现在,这值得吗?我的猜测是,只有当您期望规则可以加班时。

于 2013-04-19T13:12:05.717 回答
0

好吧,我们对 apply_rule_x 函数和更广泛的上下文知之甚少 - 但你可以这样写:

items = [] # assuming it's an array originaly
[:apply_rule_one,:apply_rule_two, :apply_rule_three].each do |rule|
     Rails.logger("Rule 1 and 2 failed to return data moving to rule 3") if items.empty? and rule == :apply_rule_three
    items = send(rule)
    return items if items == 3
end

但是,如果您只有 3 条规则并且数量不会增加 - 完全可以保留代码原样。

于 2013-04-19T13:12:52.517 回答