在Ruby中将私有方法放在哪里?


95

大多数博客,教程或书籍在任何类/模块的底部都有私有方法。这是最佳做法吗?

我发现在需要时使用私有方法更为方便。例如:

public
def my_method
  # do something
  minion_method
end

private
def minion_method
  # do something
end

public
def next_method
end

这样,我发现代码更具可读性,而不是不断地上下滚动,这很烦人。

这种方法是否存在严重错误?在底部使用私有方法不仅是一种最佳实践,还是其他?


实际上,您的方法也不错。在少数情况下,我也private def my_method...end
照做

Answers:


131

在我看来,最好的做法是依次进行声明而不是私有的方法。

最后,您只需添加以下内容即可将任何方法设为私有: private :xmethod

例:

class Example
 def xmethod
 end

 def ymethod
 end

 def zmethod 
 end

 private :xmethod, :zmethod

end

这是否可以证明您的问题?


19
从可读性的角度来看,随着类的成长越来越长,我认为这不是一个好主意。
亚历山大·苏拉普

2
我真的认为您应该按重要性顺序对方法进行排序,而当所有其他条件都相同时,该方法又称什么。私有方法是实现细节,应该是读者看到的最后一件事,因此属于文件的较低部分。我同意以上评论,认为这不适用于较大的文件。这不应是公认的答案,此页面上有很多更好的建议。
卢克·考威尔

58

private从Ruby 2.1开始,还可以选择在方法定义之前。

class Example

 def xmethod
 end

 private def ymethod
 end

 private def zmethod 
 end

end

查看定义,您可以立即知道方法是否是私有的,无论它在文件中的何处定义。输入的内容要多一些(如果您不自动填充的话),并且并不是所有的defs都可以很好地对齐。


5
您应该添加一点说明,它在Ruby 2.1中可用,其中方法以自己的名称返回密钥:bugs.ruby-lang.org/issues/3753
konole 2014年

我相信private也可以用作一个块,也就是在private begin中包含一些私有方法... end
edx

看到@devpuppy的答案在这里,以获取有关类方法这样做注释。
曼罗

private之前仅添加一次ymethod也可以。无需多次添加。
Iulian Onofrei

@IulianOnofrei如果下面还有另一个zmethod没有的private方法,则该方法不是私有的。因此,您需要重复一次(至少在Ruby 2.3中如此)。
tsauerwein

52

正如其他人已经指出的那样,约定是将私有方法放在一个私有类的底部。但是,您可能还应该知道,许多程序员为此使用了双缩进(4个空格而不是2个空格)方法。原因是通常您不会在文本编辑器中看到“私有”,并认为它们可能是公共的。参见以下插图:

class FooBar

  def some_public_method
  end

  def another_public_method
  end

private

    def some_private_method
    end

    def another_private method
    end

end

此方法应避免您上下滚动,并使其他程序员对您的代码更满意。


4
当我在12年前留下此评论时,这真是风靡一时。我不再经常看到这种情况,它已不再受欢迎。
诺亚·克拉克

也可以在begin..end后面直接格式化private private。然后,缩进可以由编辑器自动设置,因为begin(在上面的示例中)内部的代码在语义上缩进了4个空格。
Petrus Repo

我遵循相同的方法...首先public,然后private
Rahul Goyal

1
我从没见过这种情况,自2007年以来我就一直在使用Ruby。通常我不建议这样做。
Marnen Laibow-Koser,

15

我认为公共方法是对象的某种接口,将它们放在最突出的位置(即文件的顶部)是合乎逻辑的。


5
是的,将公共方法放在您最有可能找到它们的位置,通常在文件顶部附近,而您本不应该查看的内容应该埋在底部附近。就像写报纸上的文章一样,把最重要的事情放在首位。
塔德曼,2012年

14

您无需将每种方法放在上面publicprivate上面。我通常将所有私有方法放在类的底部。另外,不必显式说明public默认情况下方法是公共的。例如:

class FooBar

  def some_public_method
  end

  def another_public_method
  end

private

  def some_private_method
  end

  def another_private method
  end

end

请再次阅读我的问题。已经编辑它更加具体
ZX12R

1
它比任何事情都更像是惯例。您正在做的事情是有效的,如果对您来说更有意义,那么您应该坚持下去。我发现该约定更具可读性,但这可能是因为这是我被教导编写该约定的方式,因此我习惯了。
凯尔·德科特

将方法声明为“公共”实际上意味着什么?
ZX12R 2012年

6

我来自Java背景,我讨厌不得不滚动查看方法类型。我认为不能在没有丑陋的情况下为每种方法指定方法可见性是很疯狂的。因此,我最终#private在每个suck方法之前添加了一条注释,然后进行了声明private :...


1
最近的红宝石可以private def method...使它变得更好
akostadinov

5

我不喜欢为每种方法都指定public或private。将所有私有方法放在底部可使我每个文件具有一个“私有”实例。我想这是一个品味问题。


5

一种风格是一群方法一起使用,让你只使用privateprotected一次每班最多。另一种样式是在方法定义之后立即指定可见性:

class Example
  def my_private_method
  end
  private :my_private_method

  def my_public_method
  end
end

从Ruby 2.1.0开始def,方法名称作为符号返回,因此可以使用更简化的样式:

class Example
  private def my_private_method
  end

  def my_public_method
  end

  protected def my_protected_method
  end

  private_class_method def self.my_private_class_method
  end
end

(请注意,我们使用private_class_method类方法-否则我们会得到NameError: undefined method,因为private预期的实例方法使用它,即使作为一个宏像原来的例子,只会影响的实例方法的可见性。)

我最喜欢这种内联可见性样式,因为它允许您根据需要组织方法。这样可以减少在错误的位置添加新方法并无意中将其私有化的风险。

至于类方法的语法,您可以这样处理:

class Example
  private def my_private_method
  end

  class << self
    private def my_private_class_method
    end
  end
end

这是我之前唯一提到过该private_class_method调用的地方,关于class << self避免使用该块的最后一部分是一个很好的技巧。直到现在,我还不知道“规范”类方法(用声明的def self.foo; end而不是class << self; def foo; end不会受到说明private符的影响。)
manroe

3

丹尼斯有一个完美的答案,那就是,当使用ruby> = 2.1时,只需在def前面加上private(或protected,public)前缀即可

但我相信现在也可以将private用作块,如下所示:

private begin
   def foo
   end
   def bar
   end
end

def zip
end

0

我通常按​​以下方式订购我的方法:

  1. 建设者
  2. 其他公共方法,按字母顺序
  3. private,只写一次
  4. 私有方法,按字母顺序

我在编辑器中使用了“转到定义”功能,这样就不会涉及太多的滚动,在任何情况下,如果该类足够大而无法滚动,则可能应该将其分为几个类。


我还应该提到,我通常to_s在公共部分的末尾放置转换方法(例如)。
Marnen Laibow-Koser
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.