2011-02-09 11 views
1

私は、Ruby/Railのメソッド命名規則や良い習慣に関する短い質問があります。 次の方法を考えてみましょう。ruby​​/railsブールメソッドの命名規則

# some methods performing some sort of 'action' 
def action; end 
def action!; end 

# some methods checking if performing 'action' is permitted 
def action?; end 
def can_action?; end 
def action_allowed?; end 

だから私は権限を求めるために、「最善」の方法でしょう3アンパサンド-方法のどの、疑問に思います。私は何とか最初のものと一緒に行くだろうが、場合によってはこれが意味と混同されるかもしれないと思う。has_performed_action?。 したがって、2番目の方法では、それをより明確にすることもできますが、もう少し冗長にすることもできます。 3番目は完全性のためだけです。私は本当にそれが好きではない。

一般的に合意された良い方法はありますか?

+0

私は最良の選択肢は、コードが最も読みやすいときだと思います。私の意見では、3番目のフォームが良く見えます。特に私は "action_allowed?"と読むことができるからです。または少し良いオプション(私の意見では)action_is_allowedですか? – Augusto

答えて

3

私はあなたが実行したいアクションとあなたがチェックしているアクションに依存すると思います。私は1つ上のレベルに行くと、元のメソッド名を再考したい

self.run 
self.can_run? # can this object run? 
self.running_allowed? # is running allowed here or by this user? 

self.redeem! 
self.redeemable? # is this object currently redeemable? 

self.copy_to_clipboard 
self.copy_to_dashboard 
self.copyable? or self.can_be_copied? #can this object be copied 
self.copy_allowed?(:clipboard) # is copying to the clipboard allowed by me? 
2

通常、値の存在(または不在)を示すために単一単語の疑問符法が使用されるため、action?は使用しません。 Railsでは英語のようなコードを書くことができるので、コードを最も読みやすくするメソッド名を選んでください。

perform_action!("update") if action_allowed?("update") 

私には完全に読みやすいと思われます。

+0

ええと、その「行動?」発言は理にかなっているようです。しかし、私が少し心配しているのは、あなたが手当を求めるために使用するかもしれないさまざまな方法の多くです。 「action_allowed?」、「action_permitted?」、「action_authorized?」、「action_granted?」のいずれかです。私はもっ​​と大きなチームではこれが問題になるかもしれないと思いますよね? – Dennis

1

:私は読みやすさと混乱の最低額を目指します。

# some methods performing some sort of 'action' 
def act 
def act! 

これは、あなたの質問に、より自然な答えの便利な副作用があります:

# method checking if 'action' is permitted 
def can_act? 
メソッドがアクションを実行する場合は、それらが果たす役割は動詞のではなく、名詞ということです

...だけでなく、他のいくつかの明白な変種:

# methods checking if 'action' was performed 
def acted? 
def did_act? 

# method checking if 'action' is called for by other circumstances 
def should_act? 

# method putting 'action' into a work queue 
def act_later(delay_seconds=0) 

エトセトラ。