178

你能告诉我软件开发中的抽象信息隐藏有什么区别吗?

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

更新:我为这三个概念找到了一个很好的答案。请参阅下面的单独答案以获取从那里获取的几个引文。

4

22 回答 22

161

去源头!Grady Booch 说(在面向对象的分析和设计中,第 49 页,第二版):

抽象和封装是互补的概念:抽象关注对象的可观察行为……封装关注引起这种行为的实现……封装通常通过信息隐藏来实现,即隐藏所有信息的过程不影响其本质特征的对象的秘密。

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

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

rp

于 2008-08-24T00:57:31.370 回答
91

OP 用他发现的几个引用更新了他的问题,即在Edward V. Berard 的一篇题为“抽象、封装和信息隐藏”的文章中。我正在重新发布 OP 更新的略微扩展和重新格式化的版本,因为它本身应该是一个答案。

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

抽象:

“关于抽象的一个混淆点是它既用作过程又用作实体。抽象作为一个过程,表示提取有关一个项目或一组项目的基本细节,同时忽略不重要的细节。抽象,作为一个实体,表示模型、视图或实际项目的其他一些重点表示。”

信息隐藏:

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

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

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

封装:

“它 [...] 是指围绕一些事物集合构建一个胶囊,在这种情况下是一个概念障碍。” — [Wirfs-Brock 等人,1990 年]

“作为一个过程,封装是指将一件或多件物品封装在 […] 容器内的行为。封装作为一个实体,是指容纳(包含、封装)一件或多件物品的包装或外壳。”

“如果封装是‘与信息隐藏一样’,那么人们可能会提出‘所有被封装的东西也被隐藏’的论点。这显然不是真的。”

结论:

“抽象、信息隐藏和封装是非常不同但高度相关的概念。有人可能会争辩说,抽象是一种帮助我们识别哪些特定信息应该可见以及哪些信息应该隐藏的技术。封装就是这种技术以隐藏应该隐藏的内容并让应该可见的内容可见的方式包装信息。”

于 2012-01-01T19:06:28.887 回答
58

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

Information Hiding正在隐藏受该实施影响的数据。使用privateandpublic属于这个。例如,隐藏类的变量。

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

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

于 2012-10-01T12:22:04.563 回答
34

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

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

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

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

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

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

此处批准的定义

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

于 2012-08-09T05:32:38.057 回答
6

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

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

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

所以它不是抽象 VERSUS 信息隐藏。它是隐藏 VIA 抽象的信息。

于 2008-08-23T21:46:56.727 回答
4

抽象

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

封装

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

于 2016-06-29T07:43:05.537 回答
3

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

您将某些东西抽象到足够高的程度,以至于您只需要做一些非常简单的事情即可执行操作。

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

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

于 2008-08-23T21:47:05.040 回答
3

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

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

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

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

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

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

于 2013-05-12T10:16:55.967 回答
3

简而言之

封装:– 信息隐藏

抽象 :– 实现隐藏

Abstraction让您专注于what the object does封装意味着how an object works

于 2019-06-26T07:21:07.743 回答
2

参见 Joel 关于泄漏抽象定律的帖子

乔尔昂软件

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

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

于 2008-08-23T22:53:48.813 回答
2

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

于 2011-08-17T12:50:56.423 回答
2

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

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

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

于 2013-08-09T07:47:48.460 回答
2

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

抽象

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

信息隐藏

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

封装

  1. 软件开发技术,包括隔离一个系统功能或一组数据以及对模块内这些数据的操作,并为模块提供精确的规范
  2. 对类职责的名称、含义和值的访问与对其实现的访问完全分离的概念
  3. 认为模块具有与其内部不同的外部,它具有外部接口和内部实现的想法
于 2018-10-10T13:34:55.913 回答
1

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

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

于 2008-08-24T00:29:47.787 回答
1

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

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

于 2009-11-12T09:17:24.603 回答
1

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

于 2013-04-19T20:20:26.853 回答
1

只需添加有关 InformationHiding 的更多详细信息,发现此链接是带有示例的非常好的来源

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

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

于 2016-06-28T10:40:09.690 回答
1

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

Abstraction hides complexity by giving you a more abstract picture, a sort of 10,000 feet view, while Encapsulation hides internal working so that you can change it later. In other words, Abstraction hides details at the design level, while Encapsulation hides details at the implementation level.

于 2020-05-20T15:18:53.500 回答
0

在一一阅读以上所有答案后,我无法阻止自己发布

抽象涉及定义代表抽象“参与者”的对象的工具,这些参与者可以执行工作、报告和更改其状态,以及与系统中的其他对象“通信”。

然而,封装从上面很清楚->

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

参考维基

于 2015-04-19T20:06:54.313 回答
0

我也对抽象和封装这两个概念感到非常困惑。但是当我在 myjavatrainer.com 上看到抽象文章时,我很清楚抽象和封装是苹果和橘子,你无法真正比​​较它们,因为两者都是必需的。

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

于 2016-11-27T14:27:50.547 回答
0

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

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

于 2018-02-12T12:48:45.783 回答
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
}

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

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

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

于 2018-08-05T14:46:15.847 回答