小编典典

抽象 VS 信息隐藏 VS 封装

all

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

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

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

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

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

抽象:

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

信息隐藏:

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

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

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

封装:

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

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

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

结论:

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


阅读 67

收藏
2022-08-05

共1个答案

小编典典

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

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

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

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

rp

2022-08-05