3

在我的应用程序中,我们的用户可以相互执行操作——比如在 Facebook 上戳戳。

我现在正在编写方法,并不确定要采用哪种方法。我的意思是,我知道它们都可以接受,但有没有更惯用的方法?

选项1

if @current_user.may_poke?(@other_user)
  @current_user.poke!(@other_user)
end

选项 2

if @current_user.may_poke?(@other_user)
  @other_user.poke!(@current_user)
end

第一个选项用英语读起来更好,几乎完美地作为一个句子。第二个选项在方法命名方面更有意义,“poke”是在@other_user. 这@current_user只是提供额外信息的一个论点 - 谁做了戳。

4

4 回答 4

4

我会在那里坚持使用选项 1.. 如果您遵循条件的逻辑,那么您会问“如果 current_user 可以戳 other_user,那么让 current_user 戳 other_user”。从这些方面考虑时,选项 2 没有多大意义。

此外.. Ruby 的作者 matz 指出“bang [感叹号] 符号意味着”bang 版本比非 bang 版本更危险;小心轻放”。” (http://www.ruby-forum.com/topic/176830#773946)。我可能只是使用poke该方法名称而不是poke!.

于 2013-02-12T16:16:20.420 回答
2

第一个选项似乎更正确,因为may_poke?表示执行操作。对于第二个选项,使用名称pokable?(或者pokeable?,此任何人的正确拼写?)来指示其自身的属性。

于 2013-02-12T16:16:39.277 回答
1

我说选择你通过阅读最快理解的选项。它使代码更具可读性,从而改进它(IMO)。

就我而言(对于这种特定情况),我会选择选项 1。

于 2013-02-12T16:16:15.877 回答
0

如果poke是改变状态的东西@other_user,那么选择选项 2。但是方法名称poke表明接收者和参数是相反的,所以为了避免混淆,将名称更改为类似poke_by. 我认为将接收者和论点颠倒过来并不好may_poke。也许以同样的方式拥有它会更好:

if @other_user.pokable_by?(@current_user)
  @other_user.poke_by(@current_user)
end
于 2013-02-12T16:44:51.893 回答