我们啥时候应该考虑使用私有或受保护?

Posted

技术标签:

【中文标题】我们啥时候应该考虑使用私有或受保护?【英文标题】:When should we consider using private or protected?我们什么时候应该考虑使用私有或受保护? 【发布时间】:2012-02-02 13:29:57 【问题描述】:

只是想知道,对于模型中的某些方法,我们什么时候必须真正使用privateprotected

有时我会不厌其烦地将我的方法分组到privateprotected。我只是保持原样。但我知道这一定是一种不好的做法,否则这两个分组将不会在编程中创建。

谢谢。

【问题讨论】:

【参考方案1】: 如果你打算在外部调用一个方法,record.method(),那么“public” 如果仅在内部使用,self.method(),则为“私有” 如果您打算在内部使用它,但也用于后代,self.method() # in subclass,然后“受保护”

【讨论】:

这听起来有点不对劲……你的第三点。子类可以在内部访问其超类的private 方法。 protected 方法使您能够传入同一类的对象并在该对象上执行受保护的方法。 weblog.jamisbuck.org/2007/2/23/method-visibility-in-ruby "受保护的方法实际上可以在接收者与‘self’属于同一类的任何时候被调用”【参考方案2】:

我会发表我的意见,也许我会因此而受到鼓舞,但我不关心 Ruby 中的 protected 或 private。现实情况是,Ruby 把你当成人一样对待,如果你想从类外运行私有方法,你可以(那里有areways)。您可以在类外运行受保护的方法。你甚至可以重新分配常量……基本上你可以做任何你喜欢的事情。

这就是我喜欢它的原因,这是你的责任。我的感觉是,将某事标记为受保护或私有,您需要做两件事:

    表明您认为消费者不会需要它。 第二次猜测别人需要什么。

此外,您使测试变得更加困难,因为测试私有方法可能会非常痛苦(请参阅What's the best way to unit test protected & private methods in Ruby? 了解解决方法)

由于最后两个原因,我不理会它们。如果你真的想在你的类/方法和消费者(无论是代码还是开发人员)之间设置某种屏障,那么还有其他更有效的方法(代理、混淆、加密、密码保护方法等)。否则,为什么不让他们访问您使用的相同工具?

【讨论】:

+1 我也有类似的想法。 使用它的唯一原因:rdoc 有--visibility 选项。通过 public、protected 和 private,我可以生成不同版本的文档,其中包含更多或更少的细节。 @knut 这是一个有趣的想法,我必须牢记这一点。我倾向于使用 yardoc,它有 @private 标签,但我从未见过它有什么用处。谢谢。【参考方案3】:

我不知道 Ruby 是一个特例,但我认为答案也与其他语言相同,所以这里是:

私有方法只能由同一类的成员访问,而受保护的方法也可用于扩展声明该方法的基类的类的成员。

【讨论】:

是的,这是一个通用的编程问题。我已经阅读了 privateprotected 的作用,但我们什么时候不能忽略它? 您的意思是,方法根本没有声明为公共、私有或受保护的情况吗? @Victor 你不会“忽略”封装,但一般来说保留private,除非有充分的理由让它们成为protectedpublic @fkerber private 成员仅对该类可见,protected 成员对该类的子项可见,public 成员对该类可见。如果这些是实例成员,那么它们可能更贴切地封装在该类的实例中(即对象) @Tom private 成员在 Ruby 中也可用于子类。

以上是关于我们啥时候应该考虑使用私有或受保护?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 为啥要使用公有、私有或受保护的继承?

抽象类中的抽象方法应该有啥访问修饰符?

Java通过受保护的getter访问私有超类成员

Typescript - 作为私有或受保护的对象

Android:将外部存储器上的文件夹设为私有或受保护

是否可以为具有 1)返回类型 void、2)访问说明符私有或受保护的方法编写单元测试?