9

我有一个用户模型,它有投票方法。我想为投票编写代理方法。

这是可读的方式:

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

哪个更好,为什么?

4

4 回答 4

3

纯粹是因为 OP 似乎喜欢我的评论,所以我将其作为答案:

就个人而言,考虑到您这里只有 2 种方法,而且您不太可能添加更多方法(vote_sideways?vote_diagonally?)我只会采用可读的方式。如果你可能有更多,我会采用 DRY 方式(因为它变得容易扩展),并带有可读的注释来向其他开发人员(或稍后向你自己解释!)。

于 2012-06-14T14:19:15.783 回答
2

两者都没有(对不起)。

def vote_count(item,vtype)
  return false unless can? :vote, item
  vote item, vtype
end

祝你好运

于 2012-06-14T13:54:14.427 回答
1

恕我直言,在这种情况下,可读性胜过枯燥。它扫描速度很快,很容易摸到。话虽如此,如果您开始添加投票类型,则第二种方法可能会更灵活。YMMV。

于 2012-06-14T13:56:27.360 回答
0

两个都。

我和阿尼尔在一起;只需传入一个类型——元编程,将其作为第一选择是很糟糕的。

也就是说,我便捷方法的粉丝——但他们应该使用类型调用泛型方法。

这使生成的方法保持简洁——真正的工作是在泛型方法中完成的,但 API 用户仍然可以获得相同的便利方法。

于 2012-06-14T13:59:27.157 回答