案例陈述重构,基本红宝石

时间:2012-03-14 23:46:44

标签: ruby refactoring case

我有一个方法,它从一系列条件和一系列项目中获取条件和项目,其中根据任意数量的项目检查任意数量的条件。条件和项目是哈希值基本上,对于提供给方法的条件和项目,找出条件需要检查的项目的属性。这个列表实际上更长了,并且正在考虑让它更好(看起来这可能更简洁,也许更多rubyesque)没有其他工作(还),所以我想要一些关于如何重构这个的输入:

  def check_condition(condition, item)
    case condition.attribute
    when :author
      i = item.author.name;
    when :title
      i = item.title
    when :body
      i = item.body
    when :domain
      i = URI(item.url).host
    when :account_age
      i = item.author.author_age
    end
    @logger.info "#{i} to be checked if #{condition.query} #{condition.attribute}"
    test_condition(condition, item, i)
  end

编辑:

为了更清楚,条目和条件是哈希(Hashie :: Mash),条件通常是从配置文件构造的,可能是这样的:

[submitted_link, account_age, is_less_than, 30, remove]

最终结果如下:

{subject: submitted_link, attribute: account_age, query: is_less_than, what: 30 action:remove}

如果您愿意,可以在这里看到整体情况:https://github.com/blueblank/reddit_modbot/blob/master/lib/modbot/modbot_check.rb

EDIT2:

解决方案的实际情况是在某种程度上规范了我的条件和项目的变量术语,因此这可以减少到1行

 i = item.send(condition.attribute)
没有混乱,影响微乎其微

1 个答案:

答案 0 :(得分:2)

一种替代方案可能涉及将check_condition定义为item.class的方法。所以不是......

x = check_condition(c, item)

......你可能会有类似......

x = item.condition(c)

然后,如果你不喜欢大案例,你可以创建一个散列值为proc对象的散列,由:author:title,等键入。< / p>

class A
  def initialize
    @h = { :a => proc { @author } }
  end
  def set x
    @author = x
  end
  def f x
    @h[x].call
  end
end

o = A.new
o.set 'Me'
p(o.f(:a))

但是,一旦你那个,你可能想要采取第三步,即首先将所有这些对象属性更改为Hash中的值。 ..也许......