11

抽象封装是互补的概念:抽象关注对象的可观察行为……封装关注引起这种行为的实现……封装通常通过信息隐藏来实现,即隐藏所有信息的过程对象的秘密对其本质特征没有贡献。” - Grady Booch面向对象分析和设计

你能告诉我一些通过信息隐藏封装的好处的令人信服的例子吗?

4

5 回答 5

24

我的第一个 OO 课程中给出的示例:

想象一个媒体播放器。它抽象了播放、暂停、快进等概念。作为用户,您可以使用它来操作设备。

您的 VCR 实现了此接口并隐藏封装了机械驱动器和磁带的详细信息。

当媒体播放器的新实现出现时(例如 DVD 播放器,它使用光盘而不是磁带),它可以替换封装在媒体播放器中的实现,并且用户可以像使用 VCR 一样继续使用它(相同的操作,例如如播放、暂停等...)。

这就是通过抽象隐藏信息的概念。它允许在用户无需知道的情况下更改实现细节,并促进代码的低耦合

于 2009-03-11T18:23:07.563 回答
11

*nix 将字符流(磁盘文件、管道、套接字、tty 等)抽象为单个实体(“一切都是文件”)模型,允许将各种工具应用于各种数据源/ 以一种没有封装根本不可能的方式下沉。

同样,各种语言中流的概念,对列表、数组、文件等进行抽象。

此外,诸如数字之类的概念(对整数、六种浮点数、有理数等进行抽象)可以想象,如果更高级别的代码被赋予尾数格式等等并让其自生自灭,这将是一场多么可怕的噩梦。

于 2009-03-11T18:21:23.683 回答
2

我知道已经有一个公认的答案,但我想再抛出一个:OpenGL/DirectX

这些 API 都不是完整的实现(尽管 DirectX 在这方面肯定是头重脚轻),而是将渲染命令传送到图形卡的通用方法。

卡供应商是为特定卡提供实现(驱动程序)的供应商,在许多情况下,它是非常特定于硬件的,但作为用户,您永远不需要关心一个用户正在运行 GeForce ABC 而另一个用户正在运行 Radeon XYZ,因为确切的实现隐藏在高级 API 后面。如果不是这样,您将需要在您的游戏中为您想要支持的市场上的每张卡都有一个代码路径,这从第一天起就完全无法管理。这种方法的另一个重要优点是 Nvidia/ATI 可以发布一个更新,更高效的驱动程序版本,您无需付出任何努力即可自动受益。

同样的原理也适用于声音、网络、鼠标、键盘……基本上是计算机的任何组件。无论封装发生在硬件级别还是软件驱动程序中,在某些时候,所有设备细节都被隐藏起来,以便您可以将任何键盘视为键盘,而不是 Microsoft Ergonomic Media Explorer Deluxe Revision 2 .

当您以这种方式看待它时,很快就会发现,如果没有我们今天所知道的某种形式的封装/抽象计算机根本无法工作。这对你来说足够精彩吗?

于 2010-01-18T22:48:17.293 回答
0

什么?你还不相信?

显示相反的情况更容易。我们过去常常编写无法控制谁可以访问其实现细节的代码。这使得有时几乎不可能确定哪些代码修改了变量。

此外,如果世界上的每一段代码都可能依赖于特定具体类的实现,那么你就不能真正抽象出一些东西。

于 2009-03-11T18:19:07.650 回答
0

世界上几乎每个 Java、C# 和 C++ 代码库都具有信息隐藏功能:就像类的 private: 部分一样简单。

外部世界看不到私有成员,因此开发人员可以更改它们而无需担心其余代码无法编译。

于 2009-03-11T18:21:35.803 回答