信息隐藏和属性

时间:2008-09-19 02:04:47

标签: oop

信息隐藏是否意味着我应该尽量减少班级的属性数量?是对的吗?您是否倾向于使用方法使您的类成为私有字段?

8 个答案:

答案 0 :(得分:6)

信息隐藏与外部类可以访问您的类(字段,属性)中的数据有关。隐藏得越多,以后更容易改变实现而不影响依赖类(即“公共接口”)。这最终会带来更稳定的设计。

答案 1 :(得分:2)

信息隐藏隐藏两者逻辑和数据。您应该能够彻底改变这两种情况,而不会影响您班级的用户。

似乎许多人理解隐藏在原则上的信息,但是也认为所有东西/属性的吸气剂和制定者都是它的一个例子。

Allen Holub所谓的“Why Getters and Setters Are Evil”的煽动性文章可以让人大开眼界。

简而言之,拥有直接吸气者和制定者的私人会员只不过是打扮的公众会员。确实,层边界(UI,持久性等)需要getter和setter,但是它们的可见性应该限制在那些有合法需要调用它们的类中。

答案 2 :(得分:1)

信息隐藏意味着不向您的班级消费者公开他们不需要知道的内容。隐藏属性并用方法替换它们是没有意义的因为属性实际上是特殊类型的方法

答案 3 :(得分:1)

通过询问“如何 你?”来谈谈对话,只会遇到一连串他们的麻烦和胜利,烦恼和无趣的兴趣,不安全的感觉以及可能是 - 深度评论早餐松饼...

... 信息隐藏。我们大多数人都不这样做。孩子们会这样做,至少在他们第一次遇到一个人,他们使用他们所分享的所有无关信息以某种方式伤害或羞辱他们......然后,他们学会了秘密和偏执,再走上成年之路。

我们大多数人也学会用我们编写的代码做同样的事情,暴露出足以与其他代码相处的东西,但不能让它依赖于我们的实现。这比仅仅不暴露内部数据更加微妙 - 仅仅在内部数据和寒冷的外部世界之间放置访问者方法或属性获取者/设置者并不比发起关于“我的这个朋友”和“他的”的对话更多的信息隐藏疱疹问题...

当您开始区分界面和实现时,您会找到问题的核心。当您公开属性时,因为它们与客户端代码所期望的世界视图相匹配,而不是因为它们为他们提供了操作实现的便捷方式。它很少是一个干净的鸿沟,即使在开发自上而下的时候,人为的例子很容易造成弊大于利:不顾一切地混淆一个恰好是一个非常好的界面的实现细节是非常有害的。

答案 4 :(得分:0)

在范围内声明私有内容并不会真正“隐藏”信息。

我认为隐藏信息是指通过接口将您的逻辑与消费者隔离,因此您可以在不影响消费者的情况下更改逻辑。

答案 5 :(得分:0)

通过Public方法访问的私有字段。虽然做一些像以下事情似乎很愚蠢:

private int _myInt;
public int MyInt
{
  get { return _myInt; }
  set { _myInt = value; }
}

虽然现在你可以做(​​IIRC,我的3.5知识不完整):

public int MyInt { get; set; }

您可能会问为什么要创建只提供完全相同的访问权限的访问者才能公开原始属性。但是通过将原始属性设为私有,如果您决定只允许偶数,则可以执行此操作:

public int MyInt
{
  get { return _myInt; }
  set
  {
    _myInt = (value % 2 == 0) ? value : _myInt;
  }
}

(注意:不是最好的例子,因为它不会让用户知道他们的操作失败了。)

基本上,您永远不希望将内部操作暴露给您班级的任何消费者。而你这样做的方法是尽可能地隐藏,只暴露你所拥有的东西。

答案 6 :(得分:0)

如果外界不需要看到它,那么就不要显示它。您应该尝试封装您的对象,以便它们失去耦合,外部世界可以根据需要了解它们。

答案 7 :(得分:0)

信息隐藏的目的是将对象的使用者暴露于对象内部操作中发生的变化。一件作品改变的可能性越大,越远离界面越重要。这就是getter和setter很常见的原因......接口发出的值可以以任何方式改变,除了类型而不影响与接口使用者的合同。这也是一个常见的一般规则,只有对象本身可能会影响其状态,因此setter提供了一种强制关于对象状态如何变化的合同的方法,理想情况下也不会影响接口。我认为你通常最好在私有变量中保持状态,并将getter和setter作为它们的公共接口(当外部对象需要访问它们时),主要是因为你总是可以选择提供某种验证或转换如果有必要在不破坏你的界面的情况下下线。