您能告诉我软件开发中抽象和信息隐藏之间的区别吗?
我感到困惑。抽象隐藏详细实现,而信息隐藏则抽象了某物的全部细节。
更新: 我找到了一个关于这三个概念的好答案。请参见下面单独的答案,其中引用自此处的几篇文章。
您能告诉我软件开发中抽象和信息隐藏之间的区别吗?
我感到困惑。抽象隐藏详细实现,而信息隐藏则抽象了某物的全部细节。
更新: 我找到了一个关于这三个概念的好答案。请参见下面单独的答案,其中引用自此处的几篇文章。
直达源头!Grady Booch在《面向对象分析与设计》第二版49页中说:
抽象和封装是互补的概念:抽象关注对象的可观察行为...封装关注产生此行为的实现...封装通常通过信息隐藏来实现,这是隐藏不贡献于对象基本特征的所有机密信息的过程。
换句话说:抽象=对象外部;封装(通过信息隐藏实现)=对象内部,
例如: 在.NET框架中,System.Text.StringBuilder类提供了一个字符串缓冲区的抽象。该缓冲区抽象让您可以使用缓冲区而无需考虑其实现。因此,您可以将字符串附加到缓冲区而不用担心StringBuilder内部如何跟踪指针以及在缓冲区满时管理内存(通过封装和信息隐藏实现)。
rp
OP更新了他的问题,并在一篇名为“抽象、封装和信息隐藏”的文章中找到了多个引用(Edward V. Berard撰写)。我稍微扩展并重新格式化了OP的更新版本,因为它应该成为单独的答案。
(所有引用均来自上述文章。)
抽象:
“有关抽象的一个困惑点是其同时用作过程和实体。抽象作为过程,表示提取关于项目或一组项目的基本细节,同时忽略不必要的细节。抽象作为实体,则表示实际项目的模型、视图或其他专注表示。”
信息隐藏:
“选择其接口或定义以尽可能少地揭示其内部工作方式。” — [Parnas, 1972b]
“抽象可被用作一种技术,用于确定哪些信息应该被隐藏。”
“当人们无法区分信息隐藏和用于帮助确定应隐藏哪些信息的技术(例如,抽象)时,会产生混淆。”
封装:
“它(封装)指的是在某些事物的集合周围建立一个胶囊,在这种情况下,是一种概念上的障碍。” — [Wirfs-Brock等,1990年]
“作为一种过程,封装表示将一个或多个项目封装在一个[…]容器内。封装作为一种实体,则是指包装或容器,其内包含(包括、封装)一个或多个项目。”
"如果封装与信息隐藏是“同一件事情的话”,那么人们可能会认为“所有被封装的内容都是被隐藏的”。这显然是不正确的。"
结论:
“抽象、信息隐藏和封装是非常不同但高度相关的概念。可以说抽象是帮助我们确定哪些特定信息应该可见,哪些应该隐藏的技术。封装技术则是用来将信息打包,以便隐藏应该隐藏的部分,并显示出本意要展示的内容。”
抽象化
是通过在基本功能上提供一层来隐藏实现细节。
信息隐藏
是隐藏受该实现影响的数据。使用private
和public
都属于这个概念。例如,隐藏类的变量。
封装
只是将所有相似的数据和函数分组,比如在编程中使用的Class
,在网络中使用的Packet
。
通过使用类,我们实现了三个概念 - 抽象化
,信息隐藏
和封装
抽象
抽象是不包含背景细节的表示基本细节的行为。抽象类只有方法签名,实现类可以有自己的实现,通过这种方式,复杂的细节将被隐藏在用户之外。抽象关注外部视图。换句话说,抽象是将接口与实际实现分离。
封装
封装解释了将数据成员和方法绑定为单个单位的过程。信息隐藏是封装的主要目的。封装是通过使用访问修饰符(如private、public、protected)来实现的。类成员变量被设置为私有,以便不能直接访问。封装关注内部视图。换句话说,封装是一种保护对象中信息不受其他对象影响的技术。
抽象化 - 这是识别对象的基本特征而不包括无关和繁琐细节的过程。
封装 - 封装是将处理数据的函数和数据封装在一个单元中的过程。
抽象化和封装是相关但互补的概念。
抽象化是一个过程。封装是实现抽象化的机制。
抽象化侧重于对象的可观察行为。封装侧重于产生这种行为的实现。
信息隐藏 - 它是隐藏对象实现细节的过程。这是封装的结果。
简而言之:
封装:信息隐藏
抽象:实现隐藏
抽象
让你关注对象做什么
,而封装意味着对象如何工作
抽象: 抽象是一种用于确定对象的外部视图应为何种的概念/技术。只提供必要的接口。
信息隐藏: 它是抽象的补充,通过信息隐藏来实现抽象。隐藏除了外部视图以外的所有内容。
封装: 是将数据和相关功能绑定成一个单元。它促进了抽象和信息隐藏。允许类成员访问被应用到单元上,从而实现抽象和信息隐藏的特性。
抽象化是将实现细节隐藏起来,正如您所说。
您可以将某些事物抽象化到足够高的程度,以便执行操作时只需做一些非常简单的事情。
信息隐藏是隐藏实现细节。编程很难。您可能需要处理和处理许多事情。可能有一些变量需要您非常密切地跟踪。隐藏信息可确保没有人意外地通过使用您公开的变量或方法来破坏任何内容。
这两个概念在面向对象编程中非常紧密地联系在一起。