抽象 VS 信息隐藏 VS 封装

186

您能告诉我软件开发中抽象信息隐藏之间的区别吗?

我感到困惑。抽象隐藏详细实现,而信息隐藏则抽象了某物的全部细节。

更新: 我找到了一个关于这三个概念的好答案。请参见下面单独的答案,其中引用自此处的几篇文章。


封装是一种技术,通过信息隐藏的方式将信息打包起来,以隐藏应该被隐藏的内容,并显示预期可见的内容。请记住,封装是通过信息隐藏来实现的。 - wulfgarpro
可能是封装和抽象的精确区别的重复问题。 - NoNaMe
引用链接已损坏。 - Rishi Dua
22个回答

163

直达源头!Grady Booch在《面向对象分析与设计》第二版49页中说:

抽象和封装是互补的概念:抽象关注对象的可观察行为...封装关注产生此行为的实现...封装通常通过信息隐藏来实现,这是隐藏不贡献于对象基本特征的所有机密信息的过程。

换句话说:抽象=对象外部;封装(通过信息隐藏实现)=对象内部,

例如: 在.NET框架中,System.Text.StringBuilder类提供了一个字符串缓冲区的抽象。该缓冲区抽象让您可以使用缓冲区而无需考虑其实现。因此,您可以将字符串附加到缓冲区而不用担心StringBuilder内部如何跟踪指针以及在缓冲区满时管理内存(通过封装和信息隐藏实现)。

rp


6
您认为,封装和抽象是互补的,那么封装和信息隐藏也是互补的吗?当然,封装是通过信息隐藏来实现的,但是...难道不是封装机制实现了信息隐藏吗? - wulfgarpro
Booch的定义还有另一个现实世界的例子,可以在这里找到:https://dev59.com/EHRB5IYBdhLWcg3wZmhz#635747。 - lifebalance
请问,以下说法是否正确:抽象最好从客户端代码的角度理解,而封装最好从服务代码(即封装类本身)的角度理解? - crazyTech
以上定义的实际示例在此处解释:https://dev59.com/EHRB5IYBdhLWcg3wZmhz#635755 - user3181500

96

OP更新了他的问题,并在一篇名为“抽象、封装和信息隐藏”的文章中找到了多个引用(Edward V. Berard撰写)。我稍微扩展并重新格式化了OP的更新版本,因为它应该成为单独的答案。

(所有引用均来自上述文章。)

抽象:

“有关抽象的一个困惑点是其同时用作过程和实体。抽象作为过程,表示提取关于项目或一组项目的基本细节,同时忽略不必要的细节。抽象作为实体,则表示实际项目的模型、视图或其他专注表示。”

信息隐藏:

“选择其接口或定义以尽可能少地揭示其内部工作方式。” — [Parnas, 1972b]

“抽象可被用作一种技术,用于确定哪些信息应该被隐藏。”

“当人们无法区分信息隐藏和用于帮助确定应隐藏哪些信息的技术(例如,抽象)时,会产生混淆。”

封装:

“它(封装)指的是在某些事物的集合周围建立一个胶囊,在这种情况下,是一种概念上的障碍。” — [Wirfs-Brock等,1990年]

“作为一种过程,封装表示将一个或多个项目封装在一个[…]容器内。封装作为一种实体,则是指包装或容器,其内包含(包括、封装)一个或多个项目。”

"如果封装与信息隐藏是“同一件事情的话”,那么人们可能会认为“所有被封装的内容都是被隐藏的”。这显然是不正确的。"

结论:

“抽象、信息隐藏和封装是非常不同但高度相关的概念。可以说抽象是帮助我们确定哪些特定信息应该可见,哪些应该隐藏的技术。封装技术则是用来将信息打包,以便隐藏应该隐藏的部分,并显示出本意要展示的内容。”


1
非常好的解释。如果能够提供Java中的具体示例就更好了。在我看来,Java中的setter/getter隐藏了实现,从而实现了“信息隐藏”(或实现隐藏),而通用的“类”实现了封装,通过“private”访问实现了抽象化。 - amulllb
这绝对是我遇到的最好的解释,告诉我这三者之间的区别。 - Raj Kundalia

59

抽象化是通过在基本功能上提供一层来隐藏实现细节。

信息隐藏是隐藏受该实现影响的数据。使用privatepublic都属于这个概念。例如,隐藏类的变量。

封装只是将所有相似的数据和函数分组,比如在编程中使用的Class,在网络中使用的Packet

通过使用类,我们实现了三个概念 - 抽象化信息隐藏封装


36

6
最接近本文所指的抽象概念的牛津英语词典(OED)上给出的解释是“思想分离的行为”。更好的定义可能是“在不包括背景或非必要细节的情况下代表某物的基本特征。”
信息隐藏是一个原则,即软件组件(例如类)的用户只需要知道如何初始化和访问组件的基本细节,而不需要知道实现的细节。
编辑:我认为抽象是决定应该隐藏哪些实现部分的过程。
因此,这不是抽象与信息隐藏的对立。它是通过抽象来实现信息隐藏。

5

抽象

抽象是不包含背景细节的表示基本细节的行为。抽象类只有方法签名,实现类可以有自己的实现,通过这种方式,复杂的细节将被隐藏在用户之外。抽象关注外部视图。换句话说,抽象是将接口与实际实现分离。

封装

封装解释了将数据成员和方法绑定为单个单位的过程。信息隐藏是封装的主要目的。封装是通过使用访问修饰符(如private、public、protected)来实现的。类成员变量被设置为私有,以便不能直接访问。封装关注内部视图。换句话说,封装是一种保护对象中信息不受其他对象影响的技术。


3

抽象化 - 这是识别对象的基本特征而不包括无关和繁琐细节的过程。

封装 - 封装是将处理数据的函数和数据封装在一个单元中的过程。

抽象化和封装是相关但互补的概念。

  1. 抽象化是一个过程。封装是实现抽象化的机制。

  2. 抽象化侧重于对象的可观察行为。封装侧重于产生这种行为的实现。

信息隐藏 - 它是隐藏对象实现细节的过程。这是封装的结果。


3

简而言之:

封装:信息隐藏

抽象:实现隐藏

抽象让你关注对象做什么,而封装意味着对象如何工作


3

抽象: 抽象是一种用于确定对象的外部视图应为何种的概念/技术。只提供必要的接口。

信息隐藏: 它是抽象的补充,通过信息隐藏来实现抽象。隐藏除了外部视图以外的所有内容。

封装: 是将数据和相关功能绑定成一个单元。它促进了抽象和信息隐藏。允许类成员访问被应用到单元上,从而实现抽象和信息隐藏的特性。


3

抽象化是将实现细节隐藏起来,正如您所说。

您可以将某些事物抽象化到足够高的程度,以便执行操作时只需做一些非常简单的事情。

信息隐藏是隐藏实现细节。编程很难。您可能需要处理和处理许多事情。可能有一些变量需要您非常密切地跟踪。隐藏信息可确保没有人意外地通过使用您公开的变量或方法来破坏任何内容。

这两个概念在面向对象编程中非常紧密地联系在一起。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接