在Ruby中放置私有方法的地方?
大多数博客或教程或书籍在任何类/模块的底部都有私有方法。 这是最佳做法吗?
我发现在必要时使用私有方法更方便。 例如:
public def my_method # do something minion_method end private def minion_method # do something end public def next_method end
这样,我发现代码更可读,而不是连续滚动上下,这是非常刺激的。
这种方法有什么错误吗? 在底部有私人的方法不只是一个最好的做法和其他东西?
在我看来,最好的做法是按顺序去宣布你的方法,而不要保持私人的观点。
最后,只需添加: private :xmethod
就可以使任何私有方法成为私有
例:
class Example def xmethod end def ymethod end def zmethod end private :xmethod, :zmethod end
这是否certificate你的问题?
正如其他人已经指出的那样,公约就是在一个私人阶层的底部把私人的方法放在底层。 不过,你也许应该知道,许多程序员使用双重缩进(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
这种方法应该防止你不得不上下滚动,并使其他程序员在代码中更加舒适。
自从Ruby 2.1以来,也可以select将方法定义隐藏起来。
class Example def xmethod end private def ymethod end private def zmethod end end
看看这个定义,你立即知道一个方法是否是私有的,不pipe它定义在哪个文件中。 这是更多的打字(如果你不自动完成),并不是所有的def
将很好地alignment。
我认为公共方法是对象的某种接口,把它们放在最显眼的地方,也就是文件的顶端是合乎逻辑的。
每种方法上面都不需要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
我来自java背景,我讨厌不得不滚动查看方法types。 我认为这是疯狂的,不能指定方法可见性每个方法没有丑。 所以我最终在每个吸引方法之前发表了一条评论#private
,然后声明private :...
我不喜欢为每种方法指定公有或私有的。 把所有的私有方法放在底部,让我有一个“私人”的单个实例每个文件。 我想这是一个品味的问题。
一种风格是把方法组合在一起,这样你最多只能使用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
需要一个实例方法,即使像在原始例子中那样将它用作macros,它只影响实例方法的可见性。
我最喜欢这种内联可见性风格,因为它允许您按照自己的意愿组织方法。 它降低了在错误的地方添加新方法的风险,并且不经意间将其私有化。
至于类方法的语法,你可以这样处理:
class Example private def my_private_method end class << self private def my_private_class_method end end end
这是一个口味的问题,我想,但我宁愿明确地命名每个方法私人在所述的方法之后像这样:
class Example def cthulhu end def rlyeh end def foo end private :foo def bar end private :bar def baz end private :baz end
丹尼斯有一个完美的答案,那就是,当使用ruby> = 2.1时,只需在private(或protected,public)
但我相信,现在也可以使用私人作为块,如:
private begin def foo end def bar end end def zip end