我有一个用户模型,它有投票方法。我想写代理方法进行投票。
这是可读的方式:
def vote_up item
return false unless can? :vote, item
vote item, :up
end
def vote_down item
return false unless can? :vote, item
vote item, :down
end
这是干嘛:
%w(up down).each do |vtype|
define_method "vote_#{vtype}" do |item|
return false unless can? :vote, item
vote item, vtype.to_sym
end
end
哪一个更好,为什么?
答案 0 :(得分:3)
纯粹因为OP似乎喜欢我的评论,我会把它作为答案:
就个人而言,考虑到你这里只有2种方法,并且你不可能增加更多(vote_sideways?vote_diagonally?)我会以可读的方式去。如果你可能有很多甚至更多,我会采用DRY方式(因为它变得容易扩展),并带有可读的注释,以便向其他开发人员解释(或者稍后给自己解释!)。
答案 1 :(得分:2)
既不(遗憾)。
def vote_count(item,vtype)
return false unless can? :vote, item
vote item, vtype
end
祝你好运
答案 2 :(得分:1)
恕我直言,在这种情况下,可读性胜过干。它扫描速度很快,很容易弄清楚。话虽如此,如果你开始添加投票类型,第二种方法可能会更灵活。 YMMV。
答案 3 :(得分:0)
两个
我和Anil在一起;只是传递一种类型 - 元编程,这是一个第一手段令人讨厌。
那就是说,我是方便方法的粉丝 - 但他们应该用类型调用泛型方法。
这使得生成的方法简洁 - 真正的工作在泛型方法中完成,但API用户仍然获得相同的便捷方法。