大多数博客或教程或书籍都在任何类/模块的底部都有私有方法。这是最好的做法吗?
我发现私有方法在必要时更方便。例如:
public
def my_method
# do something
minion_method
end
private
def minion_method
# do something
end
public
def next_method
end
这样我发现代码更具可读性,而不是连续上下滚动,这非常令人恼火。
这种方法有什么可怕的错误吗?在底层使用私人方法不仅仅是最佳实践还是其他方法?
答案 0 :(得分:126)
在我看来,最好的做法是按顺序进行并声明你的方法而不保持私密性。
最后,您只需添加:private :xmethod
示例:
class Example
def xmethod
end
def ymethod
end
def zmethod
end
private :xmethod, :zmethod
end
这是否证明了你的问题?
答案 1 :(得分: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
此方法可以防止您不得不向上和向下滚动,并使其他程序员更容易使用您的代码。
答案 2 :(得分:51)
从Ruby 2.1开始,还可以选择将private
添加到方法定义中。
class Example
def xmethod
end
private def ymethod
end
private def zmethod
end
end
查看定义,您可以立即知道方法是否为私有方式,无论文件位于何处定义。它打字更多(如果你不自动完成)并且你的所有def
都不会很好地对齐。
答案 3 :(得分:15)
我认为公共方法是对象的某种界面,将它们放在最显眼的位置即文件顶部是合乎逻辑的。
答案 4 :(得分:12)
您无需在每种方法上方添加public
或private
。我通常把我所有的私人方法都放在班上。此外,不必明确说明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
答案 5 :(得分:6)
我来自java背景,我讨厌必须滚动才能看到方法类型。我认为,如果没有丑陋,就不能指定每种方法的方法可见性,这是疯了。所以我最终在每个suck方法之前发表评论#private
,然后声明private :...
。
答案 6 :(得分:4)
我不喜欢为每种方法指定公共或私有。将所有私有方法放在底部让我每个文件都有一个“私有”实例。我想这是一个品味问题。
答案 7 :(得分:4)
一种方式是将方法组合在一起,这样每个类最多只能使用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
答案 8 :(得分: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
答案 9 :(得分:1)
Dennis有完美的答案,也就是说,当使用ruby&gt; = 2.1时,只需在def前加上私有(或受保护的,公共的)
但我相信它现在也可以使用私有作为块 如:
private begin
def foo
end
def bar
end
end
def zip
end