抽象VS信息隐藏VS封装
你能告诉我软件开发中的抽象和信息隐藏有什么区别吗?
我很困惑。 抽象隐藏了详细的实现和信息隐藏摘要的东西的全部细节。
更新:我为这三个概念find了一个很好的答案。 请参阅下面的单独的答案 ,从那里引用几个引文。
去源! Grady Booch说(在面向对象的分析和devise中,第49页,第二版):
抽象和封装是相辅相成的概念:抽象的重点在于一个对象的可观察的行为…封装着重于引起这种行为的实现…封装通常是通过信息隐藏实现的,这是隐藏所有对其本质特征没有贡献的对象的秘密。
换句话说:抽象=对象外部; 封装(通过信息隐藏实现)=内部对象,
示例:在.NET Framework中, System.Text.StringBuilder
类提供对string缓冲区的抽象。 这个缓冲区抽象允许你使用缓冲区而不考虑它的实现。 因此,您可以将string追加到缓冲区中,而不必考虑StringBuilder
内部如何跟踪指向缓冲区的指针以及在缓冲区满了时(通过信息隐藏进行封装)来pipe理内存。
RP
操作程序更新了他的问题,并用他发现的几个引用,即Edward V. Berard的一篇名为“抽象,封装和信息隐藏”的文章 。 我重新发布了一个OP的更新,稍微扩大和格式化版本,因为它应该是一个本身的答案。
(所有引用均来自上述文章。)
抽象:
“关于抽象的一个混淆之处在于它作为一个过程和一个实体的使用,抽象作为一个过程,意味着提取关于一个项目或者一组项目的基本细节,而忽视不必要的细节。实体,表示一个模型,一个视图,或者某个实际项目的其他重点表示。“
信息隐藏:
“它的界面或定义被select为尽可能less地揭示其内部运作。” – [Parnas,1972b]
“抽象可以用作识别哪些信息应该隐藏的技术。”
“当人们不能区分隐藏信息和用来帮助识别哪些信息被隐藏起来的技术(例如抽象)时,就会出现混乱。
封装:
“它是指构build一个胶囊,在概念上是一个障碍,围绕着一些东西的集合。” – [Wirfs-Brock等人,1990]
作为一个过程,封装意味着将一个或多个物品封装在一个容器内。作为一个实体,封装是指一个包装或一个容纳(包含,封装)一个或多个物品的shell。
“如果封装与信息隐藏是一回事,那么人们可能会认为”封装的一切都隐藏了“。 这显然不是真的。“
结论:
“抽象,信息隐藏和封装是非常不同的,但高度相关的概念,人们可能会争辩说,抽象是一种技术,可以帮助我们识别哪些具体的信息应该是可见的,哪些信息应该隐藏,封装就是技术将信息打包,隐藏应该隐藏的内容,并使可见的内容可见。“
Abstraction
是通过提供基本function层来隐藏实现细节。
Information Hiding
隐藏了正在被该实现影响的数据。 在这之下使用private
和public
。 例如,隐藏类的variables。
Encapsulation
只是将所有类似的数据和function分组在一起,例如编程中的Class
; Packet
在networking中。
通过使用类,我们实现了所有三个概念 – Abstraction
, Information Hiding
和Encapsulation
请不要使简单的概念复杂化。
封装 :将数据和方法封装成一个单元是封装(例如类)
抽象 :这是一个只包含基本事物而不包括背景细节的行为。 (如接口)
示例和更多信息GOTO:
http://thecodekey.com/C_VB_Codes/Encapsulation.aspx
http://thecodekey.com/C_VB_Codes/Abstraction.aspx
批准的定义在这里
PS:我还记得我们在第十一课读过的一本名为C ++的Sumita Arora的定义;)
牛津英语词典(OED)给出的抽象意义最接近这里所指的意思是“思想分离的行为”。 一个更好的定义可能是“代表某些事物的基本特征,而不包括背景或不必要的细节”。
信息隐藏是软件组件(如类)的用户只需要知道如何初始化和访问组件的基本细节,而不需要知道实现细节的原则。
编辑 :在我看来,抽象是决定应该隐藏的实现的哪些部分的过程 。
所以它不抽象VERSUS信息隐藏。 这是隐藏威盛抽象的信息。
抽象隐藏了实现的细节。
你抽象的东西足够高,你只需要做一些非常简单的事情来执行一个动作。
信息隐藏隐藏了实现细节。 编程很难。 你可以有很多事情要处理和处理。 可以有variables你想/需要保持非常密切的轨道。 隐藏信息确保没有人通过使用公开暴露的variables或方法意外地破坏某些东西。
这两个概念在面向对象编程中紧密联系在一起。
封装:将数据成员和成员函数绑定在一起称为封装。 封装是通过类来完成的。 抽象:隐藏实现细节表单的用法或从视图被称为抽象。 例如:int x; 我们不知道int将如何在内部工作。 但是我们知道int将起作用。 这是抽象的。
抽象 – 这是识别对象本质特征的过程,不包括不相关和乏味的细节。
封装(Encapsulation) – 将数据和function封装在一个单元中的过程。
抽象和封装是相关但互补的概念。
-
抽象是过程。 封装是实现抽象的机制。
-
抽象侧重于对象的可观察行为。 封装侧重于引起这种行为的实现。
信息隐藏 – 这是隐藏对象的实现细节的过程。 这是封装的结果。
抽象化
抽象是代表essentail细节的行为,不包括背景细节。 抽象类只有方法签名,实现类可以有自己的实现,这样复杂的细节就会被用户隐藏起来。 抽象侧重于外部的观点。 换句话说,抽象是从实际实现中分离出来的接口。
封装
封装解释了将数据成员和方法绑定到一个单元。 信息隐藏是封装的主要目的。 封装通过使用访问说明符(如私有,公共,受保护)来实现。 类成员variables是私有的,不能直接访问外部世界。 封装着重于内部视图。 换句话说,封装是一种用于保护对象中的信息与其他对象的技术。
请参阅Joel关于泄漏法抽象的文章
JoelOnsoftware
基本上,抽象赋予你更高层次概念的自由。 一个非编程的比喻是,我们大多数人不知道我们的食物来自哪里,或者它是如何产生的,但是我们(通常)不必担心它会使我们自由地做其他事情,比如节目。
至于信息隐藏,我同意堵塞。
抽象允许你把一个复杂的过程看作一个简单的过程。 例如,标准的“文件”抽象将文件视为一个连续的字节数组。 用户/开发人员甚至不必考虑集群和碎片问题。 (抽象通常显示为类或子例程。)
信息隐藏是关于保护您的抽象免受恶意/无能的用户的影响。 通过限制某些状态(例如,硬盘驱动器分配)的控制权给最初的开发者,大量的error handling变得多余。 如果除了文件系统驱动程序以外没有其他人可以写入硬盘驱动器,则文件系统驱动程序确切地知道已经写入到硬盘驱动器的内容以及在哪里。 (这个概念的通常performance是面向对象语言的private
和protected
关键字。)
抽象的东西,我们需要隐藏细节或隐藏的东西,我们需要抽象它的细节。 但是,它们都可以通过封装来实现。
所以,信息隐藏是一个目标,抽象是一个过程,封装是一种技术。
抽象:抽象是用于识别对象的外部视图的概念/技术。 只提供所需的接口。
信息隐藏:它是抽象的补充,因为通过信息隐藏抽象得以实现。 隐藏除了外部视图以外的其他所有内容。
封装:将数据和相关function绑定到一个单元。 它有利于抽象和信息隐藏。 允许在单元上应用成员访问等function来实现抽象和信息隐藏
只要在InformationHiding上添加更多的细节,发现这个链接是非常好的例子源
信息隐藏是一个devise决定应该隐藏的系统的其余部分,以防止意外的耦合的想法。 信息隐藏是一个devise原则。 InformationHiding应该告诉你封装的东西的方式, 但当然不一定 。
封装是一种编程语言function。
我也对抽象和封装这两个概念感到困惑。 但是当我看到myjavatrainer.com上的抽象文章时,我清楚地认识到抽象和封装是苹果和桔子,你不能真正比较它们,因为两者都是必需的。
封装是如何创build对象的,抽象是如何在外部世界中查看对象。
抽象仅仅意味着只有软件的基本细节才能被用户看到,以帮助用户使用或使用软件,因此该软件的实现细节没有被显示(被隐藏)。 封装是具有包含一个或多个项目的包的技术,因此一些信息(特别是程序细节)变得可见并且一些对用户不可见,所以封装通过信息隐藏来实现。 综上所述。 抽象是为了观察行为(外部),封装是为隐形(内部),但这两个是真正的互补。
看完所有上述的答案后,我不能阻止自己张贴
抽象涉及设施来定义代表抽象“演员”,可以执行工作,报告和改变他们的状态,并与系统中的其他对象“沟通”的对象。
然而封装从上面很清楚 – >
术语封装是指隐藏状态细节,但是将数据types的概念从早期的编程语言扩展到与数据最强烈的关联行为,以及标准化不同数据types交互的方式是抽象的开始。
参考维基