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

我很困惑。抽象隐藏了详细的实现和信息隐藏摘要的内容。

更新: 我为这三个概念找到了一个很好的答案。 请参阅下面的单独答案 多次引用自 那里.

有帮助吗?

解决方案

追寻源头!Grady Booch 说道(《面向对象分析与设计》,第 49 页,第二版):

抽象和封装是互补的概念:抽象专注于对象的可观察行为...封装着眼于产生这种行为的实施...封装通常是通过信息隐藏来实现的,这是隐藏对物体的所有秘密的过程,这些秘密不会造成其基本特征。

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

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

RP

其他提示

OP用他发现的几处引文更新了他的问题,即在 爱德华五世的文章Berard 的标题是“抽象、封装和信息隐藏”. 。我重新发布了 OP 更新的稍微扩展和重新格式化的版本,因为它本身应该是一个答案。

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

抽象:

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

信息隐藏:

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

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

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

封装:

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

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

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

结论:

“抽象、信息隐藏和封装是非常不同但高度相关的概念。有人可能会说,抽象是一种帮助我们识别哪些特定信息应该可见、哪些信息应该隐藏的技术。封装是一种封装信息的技术,其方式是隐藏应该隐藏的内容,并使想要可见的内容变得可见。”

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

Information Hiding 正在隐藏受该实现影响的数据。用于 privatepublic 属于这个范畴。例如,隐藏类的变量。

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

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

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

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

抽象 :这是一种只表现本质事物而不包括背景细节的行为。(例如。界面)

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

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

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

批准的定义 这里

附:我还记得我们在 11 年级时读到的 Sumita Arora 所著的《C++》一书中的定义;)

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

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

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

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

抽象

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

封装

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

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

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

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

这两个概念在面向对象编程中紧密相连。

抽象 - 这是确定对象的基本特征而不包括无关紧要和乏味的细节的过程。

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

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

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

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

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

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

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

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

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

请参阅 Joel 关于泄漏抽象法则的帖子

乔尔昂软件公司

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

至于信息隐藏,我同意jamting。

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

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

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

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

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

只是添加更多细节 信息隐藏, , 成立 这个链接确实是很好的例子来源

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

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

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

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

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

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

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

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

参考 维基百科

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

抽象: 隐藏不相关的行为和数据。项目的实际存储、添加或删除方式是隐藏的(抽象的)。我的数据可能保存在简单数组、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. 认为模块有一个与其内部不同的外部,它有一个外部接口和一个内部实现
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top