信息隐藏和封装有什么区别?

新手上路,请多包涵

信息隐藏封装 有什么区别?

我读过封装意味着将数据和应该对它们进行操作的过程捆绑在一起。如果是这样,下面的类是否实现了封装?

 class IsThisEncapsulation {
    public int age;

    public int getAge() {
        return this.age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

现在声明数据属性 age private 实现信息隐藏?

原文由 user1720616 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 637
2 个回答

好吧,我知道将字段设为私有,然后将字段设为 setter 和 getter 就是封装。然而,封装是否仅此而已?

—> 封装是一个 OOP 概念,其中对象状态(类字段)及其行为(方法)被包装在一起。 Java 使用 class 提供封装。

信息隐藏:

–> 限制访问某些对象组件的机制。如果您将 age 私有,您上面的示例就是信息隐藏的情况。


最初,信息/数据隐藏被认为是封装的一部分,封装的定义如下:

  • 一种用于限制对某些对象组件的访问的语言机制。
  • 一种语言结构,有助于将数据与操作该数据的方法(或其他函数)捆绑在一起。

第二个定义的动机是,在许多 OOP 语言中,组件的隐藏不是自动的,或者可以被覆盖;因此,信息隐藏被那些喜欢第二个定义的人定义为一个单独的概念。

参考资料: 维基百科

原文由 Nandkumar Tekale 发布,翻译遵循 CC BY-SA 3.0 许可协议

封装和信息隐藏是联系非常紧密的概念,尽管它们的准确定义因谈话对象而异。

“信息隐藏”的概念最早由 Parnas (1972) 提出,他建议限制对信息的访问以减少系统的相互关联性。他提议,这将有助于将系统拆分为模块,同时保持用户友好的外部界面,并允许在不影响客户的情况下更改实施细节。

“封装”一词是由 Zilles (1973) 创造的,用于描述使用过程来控制对底层数据的访问,以降低系统复杂性并保护数据免遭危险修改。

随后, Parnas (1978) 将信息隐藏和封装(和抽象)描述为同义词,它们描述了对可能发生变化的系统细节的隐藏。然而,信息隐藏和封装之间已经有所区别,例如 Micallef (1987) ,他将封装描述为“信息隐藏的严格执行”。一些作者,例如 Cohen (1984) 以及 Abreu 和 Melo (1996) 将“封装机制”描述为允许信息隐藏,尤其是在面向对象的编程语言中。

Meyers (2000) 建议,一段代码被封装的程度取决于代码的数量,如果代码发生变化,这些代码将被破坏。从这个意义上讲,私有数据和方法被封装得越多,访问它们的方法越少。相比之下,公共数据和方法是完全未封装的,因为可以访问它们的代码量是未知的。

相反, Rogers (2001) 认为封装只是一种语言机制,它允许数据与操作该数据的方法捆绑在一起。他声称封装从根本上与信息隐藏无关。然而,这个定义与他的文章发表前 28 年学术文献中几乎所有的术语用法背道而驰。 还有 其他一些这种用法的例子,例如 Archer 和 Stinson (1995) ,但它们很少见,也不是特别引人注目。

总之,信息隐藏是信息应该被隐藏的想法,以便可以在不影响客户的情况下更改设计。这样可以提高灵活性和安全性。封装可能被认为与信息隐藏相同,但该术语通常用于描述信息隐藏的实际实现,尤其是在面向对象编程中。

作为信息隐藏/封装的示例,请考虑此类:

 public class BankAccount {
    public int dollars;
}

这个类的实现是完全未封装的,这意味着它是不灵活的(例如我们以后不能轻易添加对个人美分的支持)并且不安全(例如帐户可以更改为负数)。但是,如果我们将数据隐藏在正式定义的方法接口后面,我们将获得灵活性和安全性。

 public class BankAccount {
    private int dollars;

    public void deposit(int dollars) {
        this.dollars += Math.max(0, dollars);
    }
}

我们现在可以控制状态的修改方式,我们还可以在不破坏客户端代码的情况下更改实现:

 public class BankAccount {
    private int cents;

    public void deposit(int dollars) {
        deposit(dollars, 0);
    }

    public void deposit(int dollars, int cents) {
        this.cents += Math.max(0, 100 * dollars) + Math.max(0, cents);
    }
}

该类现在被更好地封装了,因为我们隐藏了有关其底层实现的信息。

原文由 Joseph Thomson 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题