抽象VS信息隐藏VS封装

时间:2008-08-23 21:41:50

标签: encapsulation abstraction glossary ooad information-hiding

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

我很困惑。抽象隐藏了详细的实施和 信息隐藏提取了某些事物的全部细节。

更新:我找到了这三个概念的好答案。 See the separate answer below来自there的多次引用{/ 3}}。

22 个答案:

答案 0 :(得分:145)

转到来源! Grady Booch说(面向对象分析与设计,第49页,第二版):

  

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

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

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

RP

答案 1 :(得分:74)

OP通过他发现的几个引用更新了他的问题,即article by Edward V. Berard titled, "Abstraction, Encapsulation, and Information Hiding"。我正在重新发布一个稍微扩展和重新格式化的OP更新版本,因为它本身应该是一个答案。

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

<强>抽象:

  

“关于抽象的一个混淆点是它作为过程和实体的使用。抽象,作为一个过程,表示提取关于一个项目或一组项目的基本细节,而忽略了不必要的抽象,作为一个实体,表示实际项目的模型,视图或其他一些集中表示。“

信息隐藏:

  

“选择其界面或定义以尽可能少地揭示其内部运作。” - [Parnas,1972b]

     

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

     

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

<强>封装:

  

“它[...]指的是围绕某些东西构建一个胶囊,在概念屏障的情况下。” - [Wirfs-Brock et al,1990]

     

“作为一个过程,封装是指将一个或多个物品封装在一个容器内的行为。封装作为一个实体,指的是一个包含或包含(包含,封闭)一个或多个物品的外壳。更多项目。“

     

“如果封装与信息隐藏相同,那么人们可能会提出这样的论点:'封装的所有内容也都是隐藏的'。这显然不是真的。“

<强>结论:

  

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

答案 2 :(得分:50)

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

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

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

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

答案 3 :(得分:30)

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

封装:将数据和方法整合到一个单元中是封装(例如Class)

抽象:这是一种仅包含基本内容而不包含背景细节的行为。 (例如界面)

示例和更多信息GOTO:

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

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

批准的定义here

P.S。:我还记得Sumita Arora的一本名为C ++的书中的定义,我们在第11课读到了这本书;)

答案 4 :(得分:6)

牛津英语词典(OED)给出的抽象意义最接近于此处的意思是“思想中的分离行为”。一个更好的定义可能是“代表某些东西的基本特征而不包括背景或非必要的细节。”

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

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

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

答案 5 :(得分:4)

抽象

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

<强>封装

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

答案 6 :(得分:3)

抽象隐藏了实施细节。

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

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

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

答案 7 :(得分:3)

抽象 - 识别对象的基本特征的过程                    没有包含无关紧要和繁琐的细节。

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

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

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

  2. 抽象专注于对象的可观察行为。封装侧重于导致此行为的实现。

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

答案 8 :(得分:2)

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

答案 9 :(得分:2)

抽象:抽象是用于识别对象外部视图的概念/技术。只提供所需的界面。

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

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

答案 10 :(得分:2)

见Joel关于漏洞抽象法的文章

JoelOnsoftware

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

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

答案 11 :(得分:1)

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

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

答案 12 :(得分:1)

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

答案 13 :(得分:1)

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

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

答案 14 :(得分:1)

只需在 InformationHiding 周围添加更多详细信息,找到This link is really good source with examples

  

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

     

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

答案 15 :(得分:1)

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

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

答案 16 :(得分:1)

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

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

答案 17 :(得分:0)

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

  

抽象涉及定义表示抽象&#34; actor&#34;的对象的工具。可以执行工作,报告和更改其状态,以及&#34;沟通&#34;与系统中的其他对象一起使用。

封装从上面可以清楚地看出 - &gt;

  

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

参考wiki

答案 18 :(得分:0)

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

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

答案 19 :(得分: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()方法的示例,我们仅知道该方法用于打印,而我们不知道它如何打印数据。    我已经写了一个详细的博客,您可以查看以下链接以获取更多信息 abstraction vs encapsulation

答案 20 :(得分:0)

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

抽象

  1. 一个对象的视图,该对象侧重于与特定目的相关的信息,而忽略了其余信息
  2. 制定视图的过程
  3. 抑制无关细节以建立简化模型的过程或该过程的结果

信息隐藏

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

封装

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

答案 21 :(得分:0)

很简短

封装:–信息隐藏

抽象:–隐藏实现

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