抽象VS信息隐藏VS封装

时间:2020-03-05 18:42:29  来源:igfitidea点击:

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

我很迷惑。抽象隐藏细节实现和
信息隐藏将事物的整个细节抽象化。

更新:我为这三个概念找到了一个很好的答案。请参阅下面的单独答案,以获取从中获得的一些引用。

解决方案

回答

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

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

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

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

回答

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

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

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

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

回答

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

JoelOnsoftware

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

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

回答

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

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

回答

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

Abstraction and encapsulation are complementary concepts: abstraction
  focuses on the observable behavior of an object... encapsulation
  focuses upon the implementation that gives rise to this behavior...
  encapsulation is most often achieved through information hiding, which
  is the process of hiding all of the secrets of object that do not
  contribute to its essential characteristics.

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

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

rp

回答

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

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