哪种方法命名方法更好,为什么?

时间:2013-02-12 16:11:23

标签: ruby oop methods state-machine method-names

在我的应用中,我们的用户可以互相执行操作 - 例如在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 个答案:

答案 0 :(得分:4)

我坚持使用选项1那里..如果你遵循条件的逻辑,那么你要问"如果current_user可能戳了other_user,那么让current_user戳一下other_user"。当想到这些术语时,选项2没有多大意义。

此外,作为Ruby的作者,matz表示"爆炸[感叹号]标志意味着"爆炸版本比非爆炸版本更危险;谨慎处理"。" (http://www.ruby-forum.com/topic/176830#773946)。我可能只使用poke作为该方法名称,而不是poke!

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

在我的情况下(针对这种特定情况),我会使用选项1。

答案 3 :(得分:0)

如果poke改变了@other_user的状态,那么请选择选项2.但方法名称poke表明接收者和参数是相反的,所以为避免混淆,请将名称更改为poke_by。我不认为让may_poke的接收器和参数反转是好的。或许最好以同样的方式使用它:

if @other_user.pokable_by?(@current_user)
  @other_user.poke_by(@current_user)
end