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

ZX1*_*12R 94 ruby conventions

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

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

public
def my_method
  # do something
  minion_method
end

private
def minion_method
  # do something
end

public
def next_method
end
Run Code Online (Sandbox Code Playgroud)

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

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

kid*_*ils 128

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

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

例:

class Example
 def xmethod
 end

 def ymethod
 end

 def zmethod 
 end

 private :xmethod, :zmethod

end
Run Code Online (Sandbox Code Playgroud)

这是否证明了你的问题?

  • 随着课程越来越长,从可读性的角度来看,我认为这不是一个好主意. (17认同)
  • 我真的认为您应该按重要性顺序对方法进行排序,而当所有其他条件都相同时,该方法又称什么。私有方法是实现细节,应该是读者看到的最后一件事,因此属于文件的较低部分。我同意以上评论,认为这不适用于较大的文件。这不应是公认的答案,此页面上有很多更好的建议。 (2认同)
  • 投反对票。这使得公共接口更难看到,并且远远超出了 Ruby 代码的主流(在使用 Ruby 的 14 年中,我确实从未见过*任何*这种风格的代码)。 (2认同)

Den*_*nis 54

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

class Example

 def xmethod
 end

 private def ymethod
 end

 private def zmethod 
 end

end
Run Code Online (Sandbox Code Playgroud)

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

  • 您应该添加注释,这在Ruby 2.1中可用,其中方法返回具有自己名称的键:https://bugs.ruby-lang.org/issues/3753 (5认同)

Noa*_*ark 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
Run Code Online (Sandbox Code Playgroud)

这种方法可以防止您不得不向上和向下滚动,并使其他程序员更容易使用您的代码.

  • 当我在12年回到这个评论时,这真是风靡一时.我不再经常看到它,它已经失宠了. (3认同)
  • 我从未见过这种情况,而且我自 2007 年以来一直在使用 Ruby。我通常不会推荐它。 (2认同)

Fle*_*oid 15

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

  • 是的,将公共方法放在最有可能找到它们的位置,通常靠近文件顶部,而您可能不应该看到的东西应该埋在底部附近.就像报纸上写的文章一样,把最重要的事情放在第一位. (5认同)

Kyl*_*cot 13

您不需要放置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
Run Code Online (Sandbox Code Playgroud)


dev*_*ppy 7

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

class Example
  def my_private_method
  end
  private :my_private_method

  def my_public_method
  end
end
Run Code Online (Sandbox Code Playgroud)

从 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
Run Code Online (Sandbox Code Playgroud)

(请注意,我们使用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
Run Code Online (Sandbox Code Playgroud)


ako*_*nov 6

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


Dav*_*vid 5

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