抽象VS信息隐藏VS封装


167

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

我很困惑。抽象隐藏细节实现,而信息隐藏则抽象事物的整个细节。

更新:我为这三个概念找到了一个很好的答案。请参见下面的单独答案从采取了一些引文出现


“封装是一种以一种隐藏信息的方式封装信息的技术,以隐藏应该隐藏的内容,并使可见的内容可见。” ; 记住封装是通过信息隐藏实现的。
wulfgarpro


引文扭折
Rishi Dua 2014年

Answers:


152

转到源代码!Grady Booch说(在面向对象的分析和设计,第49页,第二版):

抽象和封装是互补的概念:抽象集中于对象的可观察行为...封装着重于引起这种行为的实现...封装通常是通过信息隐藏来实现的,信息隐藏是隐藏所有对象的过程。对物体的本质没有帮助的秘密。

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

示例:在.NET Framework中,System.Text.StringBuilder该类提供了对字符串缓冲区的抽象。这种缓冲区抽象使您可以使用缓冲区而无需考虑其实现。因此,您可以将字符串追加到缓冲区,而无需考虑StringBuilder内部如何跟踪缓冲区的指针以及在缓冲区变满时管理内存等事情(通过信息隐藏进行封装)。

rp


5
您是否会说抽象和封装是互补的,封装和信息隐藏也是互补的?当然,封装是通过信息隐藏实现的,但是...封装不是实现信息隐藏的机制吗?
wulfgarpro

另为Booch的定义现实世界的例子,请点击这里
lifebalance

您能否告诉我是否正确地说,从客户代码的角度可以最好地理解抽象,而从服务代码的角度(即,封装类本身)可以最好地理解封装?
user1338998

此处解释了上述定义的真实示例:stackoverflow.com/a/635755/3181500
user3181500 '16

83

OP用他发现的几种引用来更新他的问题,即在Edward V. Berard文章“抽象,封装和信息隐藏”中。我将重新发布OP更新的稍作扩展和重新格式化的版本,因为它本身就是一个答案。

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

抽象:

“与抽象有关的一个混淆点是它既是过程又是实体,它既是过程,又是实体,它表示提取一个或一组项目的基本细节,而忽略了无关紧要的细节。实体,表示实际项目的模型,视图或其他一些集中表示。”

信息隐藏:

“选择它的界面或定义是为了尽可能少地揭示其内部运作方式。” -[Parnas,1972b]

“抽象可以[…]用作识别应隐藏哪些信息的技术。”

“当人们无法区分信息隐藏和用于帮助识别哪些信息要隐藏的技术(例如抽象)之间时,就会发生混乱。”

封装形式:

“它[…]是指围绕一些东西建立一个胶囊,在概念性障碍的情况下。” — [Wirfs-Brock等,1990]

“作为一个过程,封装是指将一个或多个项目封装在[…]容器中的行为。封装作为一个实体,是指容纳(包含,封装)一个或多个项目的包装或封装。”

“如果封装是'与信息隐藏相同的东西',那么人们可能会说'封装的所有东西也都被隐藏了。” 这显然是不正确的。”

结论:

“抽象,信息隐藏和封装是非常不同的,但是却是高度相关的概念。人们可以说抽象是一种技术,可以帮助我们识别哪些特定信息应该可见,哪些信息应该被隐藏。封装就是这种技术。用于包装信息的方式,以隐藏应隐藏的内容,并使要显示的内容可见。”


实用的解释。最好在Java中提供具体示例。在我看来,Java中的setter / getter隐藏了实现,因此实现了Information Hiding(或实现隐藏),而通用class则通过private访问实现了封装和抽象
abarik

57

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

Information Hiding隐藏受该实现影响的数据。使用privatepublic属于此。例如,隐藏类的变量。

Encapsulation只是将所有类似的数据和功能归为一组,例如Class在编程中;Packet在网络中。

通过使用类,我们实现了所有三个概念- AbstractionInformation HidingEncapsulation


33

请不要使简单的概念复杂化。

封装:将数据和方法包装到一个单元中就是封装(例如,类)

抽象:这是仅代表基本事物而不包含背景细节的一种行为。(例如接口)

有关示例和更多信息,请转到:

http://thecodekey.com/C_VB_Codes/Encapsulation.aspx

http://thecodekey.com/C_VB_Codes/Abstraction.aspx

此处批准的定义

PS:我也记得Sumita Arora在一本名为C ++的书中的定义,我们在第11堂课中读过;)


6

牛津英语词典(OED)给出的最接近此处意图的抽象含义是“思想分离行为”。更好的定义可能是“在不包括背景或无关紧要的细节的情况下代表事物的本质特征”。

信息隐藏是一个原则,即软件组件(如类)的用户只需了解如何初始化和访问组件的基本细节,而无需了解实现的细节。

编辑:在我看来,抽象是确定实现中应该隐藏的部分的过程

因此,它不是抽象的VERSUS信息隐藏。这是隐藏VIA抽象的信息。


4

抽象化

抽象是表示基本细节而不包含背景细节的一种行为。抽象类仅具有方法签名,实现类可以具有自己的实现,这样,复杂的细节将对用户隐藏。抽象侧重于外部视图。换句话说,抽象是接口与实际实现的分离。

封装形式

封装说明将数据成员和方法绑定到一个单元中。信息隐藏是封装的主要目的。通过使用访问说明符(例如私有,公共,受保护)可以实现封装。类成员变量被设为私有,因此外界无法直接访问它们。封装集中在内部视图上。换句话说,封装是一种用于保护对象中的信息免受其他对象攻击的技术。


3

正如您所说的那样,抽象隐藏了实现的细节。

您可以将某事物抽象到足够高的高度,而只需执行非常简单的操作即可执行某项操作。

信息隐藏隐藏了实现细节。编程很难。您可以处理很多事情。您可能希望/需要密切关注变量。隐藏信息可确保没有人通过使用公开公开的变量或方法意外破坏某些东西。

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


3

抽象 -它是识别对象的基本特征而不包含无关紧要的细节的过程。

封装 -这是封装数据和将数据处理为单个单元的功能的过程。

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

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

  2. 抽象集中于对象的可观察行为。封装着重于引起这种行为的实现。

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


2

封装:将数据成员和成员函数绑定在一起称为封装。封装是通过类完成的。抽象:从用法或视图中隐藏实现细节被称为抽象。例如:int x; 我们不知道int在内部如何工作。但我们知道int会起作用。那是抽象。


2

抽象:抽象是用于识别对象的外部视图的概念/技术。仅使所需的接口可用。

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

封装:将数据和相关功能绑定到一个单元中。它有助于抽象和信息隐藏。允许将诸如成员访问之类的功能应用于单元以实现抽象和信息隐藏


2

参见乔尔关于泄漏抽象定律的文章

JoelOnsoftware

基本上,抽象使您可以自由思考高级概念。一个非编程的类比是,我们大多数人都不知道我们的食物来自何处或如何生产,但是我们(通常)不必担心它的事实使我们可以腾出时间去做其他事情,例如编程。

至于信息隐藏,我同意干扰。



1

抽象使您可以将复杂过程视为简单过程。例如,标准的“文件”抽象将文件视为字节的连续数组。用户/开发人员甚至不必考虑群集和碎片问题。(抽象通常显示为类或子例程。)

信息隐藏是关于保护抽象免受恶意/不称职的用户的侵害。通过将某些状态的控制(例如,硬盘分配)限制为原始开发人员,大量的错误处理将变得多余。如果除了文件系统驱动程序之外没有其他人可以写入硬盘驱动器,则文件系统驱动程序会确切知道已写入硬盘驱动器的内容以及写入位置。(此概念的通常表现是OO语言中的privateand protected关键字。)


1

要抽象某些东西,我们需要隐藏细节或隐藏我们抽象的东西的细节。但是,它们两者都可以通过封装来实现。

因此,信息隐藏是一个目标,抽象是一个过程,封装是一种技术。


您可以提供相同的Java示例吗?
Chinmay '17

1

抽象仅表示一种技术,在该技术中,只有用户可以看到软件的基本细节,以帮助用户使用软件或与软件一起操作,因此该软件的实现细节未显示(不可见)。 封装是一种具有容纳一个或多个项目的程序包的技术,因此某些信息(尤其是程序详细信息)变得可见,而某些信息对于用户不可见,因此封装是通过信息隐藏实现的。综上所述。抽象用于(外部)可观察到的行为,而封装(用于内部)则用于隐蔽,但这两者是互补的。


1

只是添加了有关InformationHiding的更多详细信息,发现此链接确实是带有示例的好资源

InformationHide的想法是,应将设计决策隐藏在系统的其余部分中,以防止意外耦合。信息隐藏是一种设计原则。InformationHide应该告知您封装事物的方式,但是当然不必如此

封装是一种编程语言功能。


1

抽象和封装都是四个基本的OOP概念中的两个,它们使您可以将现实世界中的事物建模为对象,以便可以在程序和代码中实现它们。许多初学者对抽象和封装感到困惑,因为它们看上去非常相似。如果您问某人什么是抽象,他会说这是一个OOP概念,它通过隐藏不必要的细节来关注相关信息,而当您询问封装时,许多人会说这是另一个OOP概念,它将外界的数据隐藏起来。定义是正确的,因为抽象和封装都隐藏了某些东西,但是关键的区别在于意图。

通过为您提供更抽象的图片(一种10,000英尺的视图),抽象隐藏了复杂性,而封装则隐藏了内部工作,以便您以后可以进行更改。换句话说,抽象在设计级别隐藏细节,而封装在实现级别隐藏细节。


0

在阅读完上述所有答案后,我无法阻止自己发布该答案

抽象涉及到定义代表抽象“角色”的对象的功能,这些抽象“角色”可以执行工作,报告并更改其状态,并与系统中的其他对象“通信”。

从上面看封装很清楚->

术语封装是指状态细节的隐藏,但是将数据类型的概念从早期的编程语言扩展到将行为与数据最紧密地关联起来,并使不同数据类型交互的方式标准化是抽象的开始。

参考维基


0

我对抽象和封装这两个概念也感到非常困惑。但是,当我在myjavatrainer.com上看到有关抽象的文章时,对我来说很清楚,抽象和封装是Apple和Oranges,您不能真正比较它们,因为两者都是必需的。

封装是对象的创建方式,抽象是在外部环境中查看对象的方式。


0

封装:绑定数据和对其进行操作的方法。这样可以隐藏其他类中所有其他方法的数据。例如:MyList类,可以添加项目,删除项目,并删除所有项目的方法addremoveremoveAll在列表上,不能从外部直接访问行为(私有数组)。

抽象:隐藏不相关的行为和数据。项的实际存储,添加或删除方式是隐藏的(摘要)。我的数据可能保存在简单数组,ArrayList,LinkedList等中。而且,如何实现这些方法从外部隐藏。


0

封装-强制以受控方式访问内部数据或阻止直接访问成员。

抽象-隐藏某些方法的实现细节被称为抽象

让我们借助示例来理解:-

class Rectangle
{
private int length;
private int breadth;// see the word private that means they cant be accesed from 
outside world.
 //now to make them accessed indirectly define getters and setters methods
void setLength(int length)
{  
// we are adding this condition to prevent users to make any irrelevent changes 
  that is why we have made length private so that they should be set according to 
   certain restrictions
if(length!=0)
{
 this.length=length
 }
void getLength()
{
 return length;
 }
 // same do for breadth
}

现在,为抽象起见,定义一个只能访问且用户不知道该方法的主体是什么以及它如何工作的方法。让我们考虑上面的示例,我们可以定义一个用于计算矩形面积的方法区域。

 public int area()
 {
  return length*breadth;
 }

现在,每当用户使用上述方法时,他只会得到面积,而不是面积的计算方式。我们可以考虑一个println()方法的示例,我们只知道它用于打印,而我们不知道它如何打印数据。我已经写了一个详细的博客,您可以在下面的链接中找到更多信息 抽象与封装


0

值得注意的是这些术语具有标准化的IEEE定义,可以在https://pascal.computer.org/上进行搜索。

抽象

  1. 专注于与特定目的相关的信息而忽略其余信息的对象的视图
  2. 提出观点的过程
  3. 压制无关紧要的细节以建立简化模型的过程,或该过程的结果

信息隐藏

  1. 一种软件开发技术,其中每个模块的接口尽可能少地显示有关模块内部工作的信息,并且阻止其他模块使用未包含在模块接口规范中的有关模块的信息
  2. 将设计或实施决策包含在单个模块中,以便该决策对其他模块隐藏

封装

  1. 一种软件开发技术,包括隔离模块中的系统功能或一组数据以及对这些数据的操作,并为该模块提供精确的规格
  2. 一个概念,即访问类的名称,含义和值与访问其实现完全分开
  3. 认为模块的外部与内部不同,它具有外部接口和内部实现
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.