在Ruby中放置私有方法的位置?

问题描述 投票:91回答:11

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

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

public
def my_method
  # do something
  minion_method
end

private
def minion_method
  # do something
end

public
def next_method
end

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

这种方法有什么可怕的错误吗?在底层有私人方法不仅仅是最佳实践和其他东西吗?

ruby conventions
11个回答
127
投票

在我看来,最好的做法是按顺序进行并声明你的方法而不保持私有的观点。

最后,您可以通过添加:private :xmethod使任何方法变为私有

例:

class Example
 def xmethod
 end

 def ymethod
 end

 def zmethod 
 end

 private :xmethod, :zmethod

end

这是否证明了你的问题?


1
投票

Dennis有完美的答案,也就是说,当使用ruby> = 2.1时,只需在def前加上私有(或受保护的,公共的)

但我相信现在也可以使用私有作为块,如:

private begin
   def foo
   end
   def bar
   end
end

def zip
end

0
投票

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

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

我在编辑器中使用“go to definition”功能,这样就不会涉及太多的滚动,并且无论如何,如果类足够大以至于滚动变得有问题,那么它可能应该分成几个类。


52
投票

从Ruby 2.1开始,还可以选择将private添加到方法定义中。

class Example

 def xmethod
 end

 private def ymethod
 end

 private def zmethod 
 end

end

查看定义,您可以立即知道方法是否是私有的,无论文件在何处定义。这是更多的打字(如果你不自动完成),并不是所有的defs将很好地对齐。


51
投票

正如其他人已经指出的那样,惯例是将私人方法放在一个私人阶层的底层。但是,您可能也应该知道许多程序员使用双缩进(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

这种方法可以防止您不得不向上和向下滚动,并使其他程序员在您的代码中更加舒适。


15
投票

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


12
投票

您不需要在每种方法上面放置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

6
投票

我来自java背景,我不想滚动查看方法类型。我认为,如果没有丑陋,就不能指定每种方法的方法可见性,这是​​疯了。所以我最终在每个suck方法之前发表评论#private,然后宣布private :...


4
投票

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


4
投票

一种方式是将方法组合在一起,这样每个类最多只使用一次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

4
投票

我认为这是一个品味问题,但我宁愿在所述方法之后明确地将每个方法命名为私有,如下所示:

 class Example
   def cthulhu
   end

   def rlyeh
   end

   def foo
   end
   private :foo

   def bar
   end
   private :bar

   def baz
   end
   private :baz     
 end
© www.soinside.com 2019 - 2024. All rights reserved.