我们啥时候应该考虑使用私有或受保护?
Posted
技术标签:
【中文标题】我们啥时候应该考虑使用私有或受保护?【英文标题】:When should we consider using private or protected?我们什么时候应该考虑使用私有或受保护? 【发布时间】:2012-02-02 13:29:57 【问题描述】:只是想知道,对于模型中的某些方法,我们什么时候必须真正使用private
或protected
?
有时我会不厌其烦地将我的方法分组到private
或protected
。我只是保持原样。但我知道这一定是一种不好的做法,否则这两个分组将不会在编程中创建。
谢谢。
【问题讨论】:
【参考方案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 是一个特例,但我认为答案也与其他语言相同,所以这里是:
私有方法只能由同一类的成员访问,而受保护的方法也可用于扩展声明该方法的基类的类的成员。
【讨论】:
是的,这是一个通用的编程问题。我已经阅读了private
和 protected
的作用,但我们什么时候不能忽略它?
您的意思是,方法根本没有声明为公共、私有或受保护的情况吗?
@Victor 你不会“忽略”封装,但一般来说保留private
,除非有充分的理由让它们成为protected
或public
@fkerber private
成员仅对该类可见,protected
成员对该类的子项可见,public
成员对该类可见。如果这些是实例成员,那么它们可能更贴切地封装在该类的实例中(即对象)
@Tom private
成员在 Ruby 中也可用于子类。以上是关于我们啥时候应该考虑使用私有或受保护?的主要内容,如果未能解决你的问题,请参考以下文章