101

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

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

public
def my_method
  # do something
  minion_method
end

private
def minion_method
  # do something
end

public
def next_method
end

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

这种方法有什么严重的错误吗?在底部拥有私有方法不仅仅是最佳实践和其他东西吗?

4

10 回答 10

134

在我看来,最佳实践是按顺序进行并声明您的方法,而不是保持私有的观点。

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

例子:

class Example
 def xmethod
 end

 def ymethod
 end

 def zmethod 
 end

 private :xmethod, :zmethod

end

这是否证明了你的问题?

于 2012-05-23T17:32:12.710 回答
62

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

class Example
 def xmethod
 end

 private def ymethod
 end

 private_class_method def self.zmethod 
 end
end

您可以立即查看一个方法是否是私有的,无论它在(大)文件中的什么位置。它与许多其他语言一致。但它需要更多的打字并且不能很好地对齐。

于 2014-06-20T19:11:41.260 回答
54

正如其他人已经指出的那样,约定是将私有方法放在底部,在一个私有类下。但是,您可能还应该知道,许多程序员为此使用双缩进(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

这种方法应该可以避免您不得不上下滚动,并使其他程序员在您的代码中更加舒适。

于 2012-05-23T16:46:36.863 回答
15

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

于 2012-05-23T16:36:26.937 回答
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
于 2012-05-23T16:38:09.870 回答
8

private一种风格是将方法组合在一起,这样protected每个类最多只能使用一次。另一种风格是在方法定义之后立即指定可见性:

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
于 2016-04-08T22:28:20.197 回答
6

我来自 java 背景,我讨厌滚动查看方法类型。我认为无法在没有丑陋的情况下指定每个方法的方法可见性是很疯狂的。所以我最终#private在每个suck方法之前添加了一个评论,然后声明private :....

更新:在最近的红宝石中,可以写private def method_name所以上面的相关性要小得多。

更新 2:实际看到 @devpuppy 的答案,它有更多的解释。

于 2014-05-13T19:06:36.213 回答
5

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

于 2012-05-23T16:48:03.093 回答
3

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

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

private begin
   def foo
   end
   def bar
   end
end

def zip
end
于 2015-11-01T00:15:19.663 回答
1

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

  1. 构造函数
  2. 其他公共方法,按字母顺序
  3. private, 只写一次
  4. 私有方法,按字母顺序

我在我的编辑器中使用“转到定义”功能,因此这不会涉及太多滚动,并且无论如何,如果类足够大以至于滚动变得有问题,它可能应该分成几个类。

于 2019-03-12T18:10:29.967 回答