《C++面向对象高效编程(第2版)》——第2章 什么是数据抽象

简介:

第2章 什么是数据抽象
C++面向对象高效编程(第2版)
面向对象编程的一项基本任务是创建带有适当功能的类,并隐藏不必要的细节(即抽象数据)。下面,我们将用一个现实生活中的例子来解释数据抽象的概念。

绝大多数人都见过影碟播放机(laser disc player)(或LD播放机)。现在,提出一个简单的问题:设计一个影碟播放机,要求易于使用和修改,可后续添加更多有用的功能。

注意:
如果难以理解影碟播放机,可以用CD播放机代替LD播放机,其设计原理类似。实际上,影碟播放机的功能是CD播放机功能的超集。
我们需要解决的问题是:

(1)面板上应该提供哪些控件?

(2)为了连接到不同的设备(如扩音器、电视机或计算机),播放机应使用何种输入、输出装置?

(3)遥控器上应该有多少个按钮?

播放机应该能够:

根据用户要求,播放影碟;
向前和向后查找特定的节(如果是CD播放机,则查找特定的音轨);
允许用户插入和弹出影碟;
根据用户要求,启动和关闭播放机;
当播放机播放影碟时,用户可随时要求暂停;
根据用户要求,完全停止播放。
下面初步分析一下,在面板上应提供的用户控件(开关或按钮)(见图2-1)。

先来分析其中一个控件的功能:

PLAY:当我们按下PLAY按钮时,自然希望影碟播放机开始启动,并在它所连接的电视屏幕上显示图像。但是,在其他情况下按下PLAY按钮,结果是否会不同?

(a)只有在播放机已接通电源,且POWER开关为ON的情况下,PLAY按钮才会响应。否则,按下PLAY按钮不会响应。

(b)如果播放机内无影碟,则PLAY按钮不会响应。

(c)如果满足(a)和(b),则播放机内的激光束被激活,机械驱动系统带动马达开始转动影碟。

(d)播放机内的电子元件读取影碟上的编码信息,将其转换为视频信号(在多项信号处理操作后),并将视频信号传输给电视机显示图像。CD播放机和LD播放机对碟片的音频信息处理方式类似。
image

图2-1

(e)如果加载的影碟格式不正确(例如,如果在PAL播放机中放入了NTSC碟片)1,播放机的显示面板(或播放机连接的电视机屏幕)上会显示错误的消息。

(f)如果满足以上所有前提条件,则给出一个可视或可听(或兼而有之)的指示,表明播放机正在播放。

从这些简化的步骤中可以看出,只是按下PLAY按钮就会启动播放机内的许多操作。但是,对于使用播放机的用户而言2,她只对屏幕上出现的图像和伴随的音频信息感兴趣,甚至不会意识到播放机内有一个激光束!更不会注意到影碟的旋转或激光束的活动。当她按下PLAY按钮后,希望在电视机屏幕上看见清晰的图像并听见悦耳的声音。

作为LD播放机的设计人员,能从这些信息中获得什么?

在用户看来,LD播放机是一个魔术盒。用户插入影碟,按下PLAY按钮,它就能让与其连通的电视机屏幕上出现画面。这是LD播放机公认的性质(见图2-2)。

我们的设计必须从客户角度出发,不应让内部的细节打扰终端用户的使用。在电视出现图像之前,我们还需要考虑许多其他的事情。

我们已经设计好LD播放机,上面布满许多小按钮,其中一个就是PLAY键。装入影碟后按下PLAY按钮,屏幕上便会出现图像。无论你相信与否,我们已经抽象了数据部分(即我们已经完成了数据抽象)。

image

图2-2

数据抽象(data abstraction)在忽略类对象间存在差异的同时,展现了对用户而言最重要的特性。的确,抽象应该对终端用户隐藏无关紧要的细节,避免暴露有可能分散用户注意力或与使用环境毫不相干的细节。

分析LD播放机的设计

(1)我们不会让激光束、马达等部件暴露出来,也不会让用户对它们一无所知。我们会提供可视或可听(或兼而有之)的指示,显示播放机的内部工作状态。

(2)用户只需按下PLAY按钮,即可欣赏影碟中记录的图像,不必亲自开启马达、接通激光束装置电源、将其对焦在影碟上等。完全没必要让普通用户这么做。有些操作相当危险,假如要求用户手动操作激光束会怎样?制造商很快就会被法律诉讼淹没。(警告:在无任何保护的情况下,暴露在激光束下非常危险。)

(3)如果用户在未装入碟片的情况下,按下PLAY按钮,播放机既不会开启激光束,也不会启动马达。我们的设计应该能智能检测此信息。实际上,播放机随时都记录下自身的状态,并根据相应的信息做出响应。

(4)如果设计人员将LD播放机的各个零部件拆分,放在桌上,告诉用户这就是LD播放机,用户肯定会认为设计人员的精神有问题。设计,或者说抽象,就是把各个大小不一、功能各异的零部件组合起来,在它们之间建立适当的通信机制。进一步而言,设计为用户提供一个明晰的接口,将组成LD播放机的所有部件(即实现)隐藏,只显示用户操作播放机所需的控件。

相关文章
|
1月前
|
安全 程序员 编译器
【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则
【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则
75 11
|
2月前
|
存储 安全 编译器
【C++核心】一文理解C++面向对象(超级详细!)
这篇文章详细讲解了C++面向对象的核心概念,包括类和对象、封装、继承、多态等。
22 2
|
1月前
|
存储 编译器 C语言
【C++】初识面向对象:类与对象详解
【C++】初识面向对象:类与对象详解
|
3月前
|
存储 C++
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
|
3月前
|
存储 算法 C++
C++ STL应用宝典:高效处理数据的艺术与实战技巧大揭秘!
【8月更文挑战第22天】C++ STL(标准模板库)是一组高效的数据结构与算法集合,极大提升编程效率与代码可读性。它包括容器、迭代器、算法等组件。例如,统计文本中单词频率可用`std::map`和`std::ifstream`实现;对数据排序及找极值则可通过`std::vector`结合`std::sort`、`std::min/max_element`完成;而快速查找字符串则适合使用`std::set`配合其内置的`find`方法。这些示例展示了STL的强大功能,有助于编写简洁高效的代码。
43 2
|
3月前
|
编译器 C++
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
|
3月前
|
存储 数据挖掘 C语言
【C/C++】C/C++车辆交通违章管理系统(源码+数据文件)【独一无二】
【C/C++】C/C++车辆交通违章管理系统(源码+数据文件)【独一无二】
|
3月前
|
存储 安全 数据处理
【C++】C++ 超市会员卡管理系统(面向对象)(源码+数据)【独一无二】
【C++】C++ 超市会员卡管理系统(面向对象)(源码+数据)【独一无二】
|
4月前
|
存储 C++ 容器
开发与运维数组问题之C++标准库中提供数据容器作为数组的替代如何解决
开发与运维数组问题之C++标准库中提供数据容器作为数组的替代如何解决
53 5
|
4月前
|
设计模式 监控 Go
开发与运维C++问题之C++部分原有的数据发送能力如何解决
开发与运维C++问题之C++部分原有的数据发送能力如何解决
26 1