信息隐藏和封装之间有什么区别?
我已经读过,封装意味着将数据和应该对其进行操作的过程捆绑在一起。如果是这样,那么下面的类是否实现了封装?
class IsThisEncapsulation {
public int age;
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
}
现在声明数据属性age
private
会实现信息隐藏吗?
从抽象到信息隐藏再到封装
抽象和封装是互补的概念:抽象关注对象的可观察行为。。。封装主要关注导致这种行为的实现。。。封装通常是通过信息隐藏来实现的,信息隐藏是隐藏对象的所有秘密的过程,这些秘密与对象的基本特征无关。
信息隐藏:
“选择其界面或定义是为了尽可能少地揭示其内部工作。”[帕纳斯,1972b]
“抽象可以[…]用作确定哪些信息应该隐藏的技术。”
“当人们无法区分信息的隐藏和用来帮助识别哪些信息要隐藏的技术(如抽象)时,就会产生混淆。”
封装:
“它[…]指的是围绕一些东西的集合建造一个胶囊,在这种情况下是一个概念上的障碍。”[Wirfs Brock等人,1990年]
“作为一个过程,封装是指将一个或多个项目封装在[…]容器中的行为。封装作为一个实体,是指包含(包含)一个或多个项目的包或外壳。”
“如果封装是‘与信息隐藏相同的事情’,那么有人可能会说‘封装的所有东西都是隐藏的’,这显然不是真的。”
封装和信息隐藏是非常紧密相连的概念,尽管它们的确切定义因您与谁交谈而异。
Parnas(1972)首先描述了“信息隐藏”的概念,他建议应限制对信息的访问,以减少系统的互联性。他提议,这将有助于将一个系统分为几个模块,同时保持一个用户友好的外部界面,并允许在不影响客户的情况下更改实施细节。
术语封装是Zilles(1973)创造的,用来描述使用过程来控制对底层数据的访问,以降低系统复杂性并保护数据免受危险修改。
随后,Parnas(1978)将信息隐藏和封装(以及抽象)描述为同义词,这些同义词描述了隐藏可能发生变化的系统细节。然而,信息隐藏和封装之间已经有了区别,如Michallef(1987)将封装描述为“严格执行信息隐藏”。一些作者,如Cohen(1984年)、Abreu和Melo(1996年)将“封装机制”(尤其是在面向对象编程语言中)描述为允许信息隐藏。
相反,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);
}
}
该类现在封装得更好了,因为我们隐藏了有关其底层实现的信息。
我知道,将字段设置为私有,然后将字段的setter和getter设置为私有,这就是封装。然而,封装是否就意味着这一点?
---
信息隐藏:
--
最初,信息/数据隐藏被认为是封装的一部分,封装的定义如下:
第二个定义的动机是,在许多OOP语言中,组件的隐藏不是自动的,或者可以被覆盖;因此,喜欢第二种定义的人将信息隐藏定义为一个单独的概念。
参考:维基网页
问题内容: 封装和信息隐藏之间到底有什么区别? 好吧,我知道将字段设为私有,然后将字段的setter和getter设为封装。但是封装只是这个意思吗? 假设我有一个如下所述的课程。 现在,类IsThisEncapsulation是封装的示例吗? 现在将上述类中的“年龄”字段设为私有可以实现信息隐藏吗? 您能给我清楚的例子,以帮助我清楚地区分这些概念吗? 问题答案: 好吧,我知道将字段设为私有,然后将
问题内容: Java中的封装和抽象之间到底有什么区别?任何简短的例子也将不胜感激。 问题答案: 抽象和封装是两个很好的味道,它们在一起味道很好。 封装 可以最大程度地减少向代码用户展示的内容。该“用户”可以是您代码的其余部分,也可以是使用您发布的代码的任何人。 封装有一定的好处: 代码的用户不依赖于程序中可能更改的部分。当您更改程序时,他们不必更改代码 您可以更好地控制代码和状态在程序生命周期中的
在采访中,我被要求解释抽象和封装之间的区别。我的回答是大致相同的 > 抽象允许我们以最简单的方式表示复杂的现实世界。它是识别一个对象应该具备的相关品质和行为的过程;换句话说,代表必要的特征而不代表背景细节。 封装是一个从外部真实世界隐藏对象所有内部细节的过程。“封装”这个词,就像“封装”成一个“胶囊”。它限制客户端查看实现抽象行为的内部视图。 我想通过以上的回答,面试官确信了这一点,但随后我被问到
问题内容: 在此示例中: 无法编译为: 而被编译器接受。 这个答案说明唯一的区别是,与不同,它允许您稍后引用类型,似乎并非如此。 是什么区别,并在这种情况下,为什么不第一编译? 问题答案: 通过使用以下签名定义方法: 并像这样调用它: 在jls§8.1.2中,我们发现(有趣的部分被我加粗了): 通用类声明定义了一组参数化类型(第4.5节), 每种可能通过类型arguments调用类型参数节的类型
问题内容: 使用Angular Material时,我一直看到aria属性。有人可以向我解释,aria前缀是什么意思?但最重要的是,我想了解的是和属性之间的区别。 问题答案: ARIA(可访问的富Internet应用程序)定义了一种使残障人士更容易访问Web内容和Web应用程序的方法。 该属性是HTML5中的新增属性,它告诉 浏览器 不要显示该元素。该属性告诉 屏幕阅读器 是否应该忽略该元素。请查
在使用Angular材质时,我一直在看aria属性。有人能给我解释一下,aria前缀是什么意思吗?但最重要的是,我试图理解的是和属性之间的区别。