抽象 VS 信息隐藏 VS 封装

你能告诉我在软件开发中 抽象信息隐藏有什么不同吗?

我很困惑。抽象隐藏了细节实现和 隐藏信息抽象事物的全部细节。

更新: 我为这三个概念找到了一个很好的答案。

158132 次浏览

抽象的意义由牛津英语词典(牛津英语词典)给出,最接近这里的意义是“在思想中分离的行为”。一个更好的定义可能是“代表某事物的基本特征而不包括背景或不必要的细节。”。'

信息隐藏的原则是,基于组件的软件工程(如类)的用户只需要知道如何初始化和访问组件的基本细节,而不需要知道实现的细节。

编辑 : 在我看来,抽象是决定实现的哪些部分应该是 藏起来了程序

因此,它不是抽象与信息隐藏,而是通过抽象来隐藏信息。

抽象隐藏了你所说的实现细节。

你抽象事物到一个足够高的点,你只需要做一些非常简单的事情来执行一个动作。

信息隐藏就是隐藏实现细节。编程很难。你有很多事情要处理。有些变量你需要非常密切地关注。隐藏信息可以确保没有人意外地使用您公开公开的变量或方法破坏某些内容。

这两个概念在面向对象程序设计中是紧密联系在一起的。

请看 Joel 关于漏洞抽象法则的文章

JoelOnsoftware

基本上,抽象给了你思考更高层次概念的自由。一个非编程类比是,我们大多数人不知道我们的食物来自哪里,或如何生产,但事实上,我们(通常)不必担心它释放我们做其他事情,如编程。

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

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

信息隐藏是为了保护您的抽象不受恶意/无能用户的攻击。通过将某些状态(例如硬盘分配)的控制限制给原始开发人员,大量的错误处理变得多余。如果除了文件系统驱动程序之外没有其他人可以写到硬盘驱动器,那么文件系统驱动程序就能准确地知道写到硬盘驱动器的内容和位置。(这个概念的通常表现形式是面向对象语言中的 privateprotected关键字。)

Grady Booch 说(在面向对象的分析与设计,第二版,第49页) :

抽象和封装是互补的概念: 抽象 关注对象的可观察行为... 封装 重点放在导致这种行为的实现上..。 封装通常是通过信息隐藏来实现的 是隐藏所有对象的秘密的过程 有助于它的本质特征。

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

例如: 在。NET 框架,System.Text.StringBuilder类通过字符串缓冲区提供抽象。这个缓冲区抽象允许您在不考虑实现的情况下使用缓冲区。因此,您可以将字符串附加到缓冲区,而无需考虑 StringBuilder内部如何跟踪诸如指向缓冲区的指针和在缓冲区满时管理内存之类的事情(它通过信息隐藏进行封装)。

RP

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

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

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

观察员更新了他的问题,他发现了几个引文,即在一个 文章标题为“抽象、封装和信息隐藏”,由爱德华 · V · 伯拉德撰写。我重新张贴一个稍微扩展和重新格式化的 OP 的更新版本,因为它应该是一个答案在它自己的权利。

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

摘要:

“关于抽象的一个困惑之处在于,它既是一个过程,又是一个实体。抽象,作为一个过程,表示对一个项目或一组项目的基本细节的提取,而忽略了不重要的细节。抽象作为一个实体,表示一个实际项目的模型、视图或其他重点表示。”

信息隐藏:

“选择它的界面或定义是为了尽可能少地揭示它的内部工作原理。”

“抽象可以作为一种识别哪些信息应该被隐藏的技术。”

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

封装:

“它(... ...)指的是围绕一些东西建造一个胶囊,在这种情况下是一个概念障碍。”[ Wirfs-Brock 等,1990]

“作为一个过程,封装意味着将一个或多个项目封装在一个[ ... ]容器中。封装,作为一个实体,指的是一个包裹或外壳,其中包含(包含)一个或多个项目

“如果封装和信息隐藏是一回事,那么人们可能会说‘所有被封装的东西都被隐藏了’这显然不是真的。”

结论:

“抽象、信息隐藏和封装是非常不同但高度相关的概念。有人可能会说,抽象是一种技术,它可以帮助我们确定哪些特定的信息应该是可见的,哪些信息应该是隐藏的。封装就是这样一种技术,它将信息打包成隐藏应该隐藏的内容,并使应该可见的内容变得可见。”

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

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

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

返回文章页面例子和更多信息译者:

Http://thecodekey.com/c_vb_codes/encapsulation.aspx

Http://thecodekey.com/c_vb_codes/abstraction.aspx

核准定义 给你

附注: 我还记得 Sumita Arora 写的一本名为 C + + 的书中的定义,我们在第11节课上读过;)

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

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

Encapsulation只是将所有类似的数据和函数放入一个组中,例如,编程中的 Class,网络中的 Packet

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

抽象 简单地指的是这样一种技术,在这种技术中,只有软件的基本细节对用户可见,以帮助用户使用或操作软件,因此软件的实现细节不会显示出来(不可见)。 封装 是一种包含一个或多个项目的技术,因此一些信息(特别是程序细节)可见,一些对用户不可见,所以封装是通过信息隐藏实现的。 总之,抽象用于可观察的行为(外部) ,封装用于不可见性(内部) ,但这两者实际上是互补的。

抽象是识别一个对象的本质特征的过程 不包括无关紧要和乏味的细节。

封装 -将数据和函数封装在一个单元中操作这些数据的过程。

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

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

  2. 抽象关注对象的可观察行为,封装关注引起这种行为的实现。

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

抽象: 抽象是用来确定对象的外部视图的概念/技术。只提供所需的接口。

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

封装: 将数据和相关函数绑定到一个单元中。它促进了抽象和信息隐藏。允许像成员访问这样的特性应用到单元上,以实现抽象和信息隐藏

在阅读了以上所有的答案之后,我不能停止自己发布那个

抽象包括定义对象的功能,这些对象表示抽象的“参与者”,它们可以执行工作、报告和更改状态,并与系统中的其他对象“通信”。

然而,从上面可以很清楚地看到封装->

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

参考 维基百科

只是增加了更多的细节周围的 信息隐藏,发现 这个链接是很好的例子来源

信息隐藏 的思想是,设计决策应该对系统的其他部分隐藏起来,以防止意外的耦合。信息隐藏是一个设计原则。信息隐藏应该通知你 封装事物的方式,但当然不一定

封装 是一种编程语言特性。

抽象

抽象是一种表现必要细节而不包括背景细节的行为。抽象类只有方法签名,实现类可以有自己的实现,这样复杂的细节就对用户隐藏了。抽象关注的是外部视图。换句话说,抽象是接口与实际实现的分离。

封装

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

我也对抽象和封装这两个概念感到非常困惑。但是当我在 myjavatrainer.com 上看到 摘要文章摘要文章摘要文章的时候,我明白了抽象和封装是苹果和橙子,你不能真正地比较它们,因为它们都是必需的。

封装是创建对象的方式,抽象是在外部世界中如何看待对象。

封装: 绑定数据和作用于它的方法。这允许对其他类中的所有其他方法隐藏数据。 示例: MyList类,它可以添加项、删除项和删除所有项 方法 addremoveremoveAll作用于不能从外部直接访问的列表(私有数组)。

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

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

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

让我们通过一个例子来理解:-

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 ()方法的例子,我们只知道它用于打印,但不知道它如何打印数据。 我写了一个详细的博客,你可以看到下面的更多信息链接 抽象与封装

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

抽象

  1. 对象的视图,该视图关注与特定目的相关的信息,而忽略信息的其余部分
  2. 形成观点的过程
  3. 抑制不相关细节以建立简化模型的过程,或该过程的结果

信息隐藏

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

封装

  1. 软件开发技术,包括在一个模块中隔离一个系统功能或一组数据和对这些数据的操作,并为该模块提供精确的规范
  2. 概念,访问一个类的名称,意义和职责的价值是完全分离的访问他们的实现
  3. 认为模块有一个与其内部不同的外部,它有一个外部接口和一个内部实现

简而言之

封装 :-信息隐藏

抽象 :-实现隐藏

Abstraction使您可以专注于 what the object does,而封装意味着 how an object works

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

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