9

投票方法を持つ User モデルがあります。投票用のプロキシ メソッドを作成したいと考えています。

これは読みやすい方法です:

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

この場合、私見は読みやすさが勝っています。すばやくスキャンし、簡単にグロックされます。そうは言っても、投票タイプを追加し始めると、2番目のアプローチの方が柔軟になる可能性があります。YMMV。

于 2012-06-14T13:56:27.360 に答える
0

両方。

私はアニルと一緒です。タイプを渡すだけです。これを最初の手段としてメタプログラミングするのは面倒です。

そうは言っても、私便利なメソッドのファンですが、型を使用してジェネリックメソッドを呼び出す必要があります。

これにより、生成されたメソッドが簡潔に保たれます。実際の作業は汎用メソッドで行われますが、APIユーザーは同じ便利なメソッドを使用できます。

于 2012-06-14T13:59:27.157 に答える