第八章 面向对象设计
o 面向对象设计概述
o 问题域子系统( PDC)的设计
o 人 — 机交互子系统( HIC)的设计
o 任务管理子系统( DMC)的设计
o 数据管理子系统( DMC)的设计
面向对象设计( OOD)仍然需要进行总
体设计和详细设计。在面向对象方法中,
总体设计和详细设计也没有清晰的界限。
本章主要介绍如何建立系统的基本框架。
总体设计将系统分成几个子系统,建立
系统的基本框架,每个子系统使用与面向
对象分析一致的表示方法建立模型,可以
说,总体设计是逐渐扩充面向对象分析模
型的过程;详细设计则针对每个子系统中
的每个类的作用、类的内部构成(属性和
服务)以及类之间关系进行清晰、具体的
描述,使得在实现阶段程序员根据该描述
能很容易地转化成程序。
第一节 面向对象设计概述
一、面向对象设计系统的基本框架
面向对象分析集中于问题域、系统责任和需
求,它是独立于编程语言的,面向对象设计集中
于用可得到的技术实现上述需求,在很大程度上
仍然独立于编程语言。面向对象设计是面向对象
分析的扩充,主要是增加各种组成部分。具体地
说,面向对象分析识别和定义类 — &— 对象,这
些类 — &— 对象直接反映问题域和系统任务。而
面向对象设计识别和定义其它附加类 — &— 对象,
它们反映需求的一种实现。
面向对象设计的模型仍然由 5层组成,
但划分为四个组成部分:人机交互部分
( HIC,Human Interface Component)、
问题域( PDC,Problem Domain
Component)、任务管理( TMC,Task
Management Component)和数据管理( DMC:
Data Management Component)。
人机交
互部分
主题层
类 — &— 对象层
结构层
属性层
方法层
问题域
部分
任务管
理部分
数据管
理部分
面向对象设计模型
人机交互部分包括,
有效的人机交互所必需的实际显示和输
入,负责向用户提供良好的界面;
问题域部分就是对面向对象分析的结果
进行改进;
任务管理部分是对系统中若干任务并发
执行时,设计合理的任务执行方案;
数据管理部分是对数据的存放和相应的
服务进行设计。
这四个部分相对独立,它们之间通过消
息相互联系。之所以这样划分是出于使整
个系统容易维护的考虑,让将来的每一次
变动使系统的修改程度最小。
例如将来考虑将系统的鼠标点击输入改
为语音输入,那么只需修改人机交互部分,
其它部分不用改动。
二、面向对象设计的准则
结构化方法中软件设计的基本原理在进
行面向对象设计时仍然成立,但是增加了
一些与面向对象方法密切相关的新特点,
从而具体化为面向对象设计准则。
(一 )模块化
面向对象软件开发模式,很自然地支持
了把系统分解成模块的设计原理:类就是
模块。
它是把数据结构和对数据的操作紧密地
结合在一起所构成的模块。
(二 )抽象
面向对象方法不仅支持过程抽象,而且
支持数据抽象。类实际上是一种抽象数据
类型,它对外开放的公共接口构成了类的
规格说明(即协议),这种接口规定了外
界可以使用的合法操作符,利用这些操作
符可以对类实例中包含的数据进行操作。
使用者无须知道这些操作符的实现算法和
类中数据元素的具体表示方法,就可以通
过这些操作符使用类中定义的数据。通常
把这类抽象称为规格说明抽象。
(三 )信息隐藏
在面向对象方法中,信息隐藏通过对象
的封装来实现。对于用户来说,类中的属
性的表示方法和操作的实现算法都应该是
隐藏的。
(四 )弱耦合
结构化方法中耦合是指在系统中的各个
模块之间的相互连接或相互依赖的强度。
在面向对象方法中,耦合主要指不同对象
之间通过消息相互关联的紧密程度。应该
遵守下列准则使这种耦合尽量松散:
1.尽量降低消息连接的复杂程度。应该
尽量减少消息中包含的参数个数,降低参
数的复杂程度。
2.减少对象发送(或接收)的消息数。
(五 )强内聚
内聚用于描述系统内组成部分中各元素
彼此结合的紧密程度,应尽量避免低内聚。
在面向对象设计中,从三个层次来考察内
聚性。
1.单个方法的内聚性:方法是指操作的
实现过程,一个操作由一个或多个方法实
现。对方法的内聚性的评价与结构化设计
中的相同,具有高内聚的方法应当只执行
一个功能。
2.类的内聚性:设计类的原则是,一个
类应该只有一个用途,类中的属性和操作
应该全都是完成该类的任务所必需的,其
中不包括无用的属性和操作。如果某个类
有多个用途,通常应该把它分解成多个专
用的类。
3.层次结构的内聚性:对象之间通过继
承关系而构成的层次结构,特殊类应该确
实是对它的一般化类的一种具体化。如果
一个派生类 摒 弃了它基类的许多属性和服
务,那就是一个低内聚的。
(六 )可重用
软件重用是提高软件开发生产率和目标
系统质量的重要途径。重用基本上从设计
开始。
重用有两方面的含义:一是尽量使用已
有的类(包括开发环境提供的类库,以及
以往开发类似系统是创建的类);二是如
果确实需要创建新类,则在设计这些新类
的协议时,应该考虑将来的可重复使用性。
第二节 问题域子系统( PDC)的设计
一般来说,基于问题域的总体组织框架
是长时间保持稳定的(当然,细节是会变
的,这里加一个类说明,那里加一个属性
或服务)。
例如银行储蓄系统中分行、终端、储户
这个组织结构会长期保持稳定,虽然如储
户的属性可能会发生变化。正是基于这种
稳定,面向对象的分析和设计模型按问题
域本身的样子来组织系统,也能从容适应
变化的需求,能保持稳定性。
OOD中,OOA的结果恰好就是 OOD的问题
域部分。这也正是面向对象的设计和分析
方法的一个最优良的特点。但是可能要作
些改动,这种改动不是否定 OOA的分析结果,
而是完善。
这些改动基于以下几个原因:
( 1)由于需求的变化;
( 2)分析员对问题域的理解可能有误
解或欠缺,需要对此加以修正;
( 3)分析与设计毕竟是性质不同的两
类开发工作,分析可以而且应该与具体实
现无关,而设计在很大程度上受具体实现
环境的约束。
一、对 OOA的改动准则
(一 )依照面向对象设计的准则审核每个
类
优秀的设计能够权衡各种因素,从而使
得系统在其整个生命周期中的总开销最小。
对大多数软件系统而言,60%以上的软件费
用都用于软件维护,因此,优秀软件设计
的一个主要特点就是容易维护。在问题域
系统中,仔细对照面向对象设计的准则,
审查 OOA中的每个类。
(二 )重用设计和编程的类
根据需要重用现成的类,现成类是已用
OO语言或非 OO语言编写的可用源程序。例
如图( a)是 OOA结果中有一个类, 交通工
具,,设计者发现有一个类似的现成类
,交通工具 1”( 图( b)),那么他就可
以按以下步骤重用现成类(图( c))。
PDC中重用类例子
颜色
性能
制造商
问题域中的类
类别
性能
制造商
现成的类
类别
性能
制造商
重用现成类
颜色
性能
制造商
( a) ( b) ( c)
交通工具 交通工具 1 交通工具 1 交通工具
(三 )通过增添超类而建立协议
将问题域许多不同的类聚集在一起,这
时可建立一个新的父类 —— 超类,将这许
多类作为该超类的子类。这样一方面有助
于改进模型的可理解性,同时可以在超类
中给出一个公共的协议,用来与其它子系
统或与外部系统部件进行通信。通信的细
节在子类中定义。
(四 )考虑语言调整继承支持级别
如果 OOA模型依赖于多重继承而设计者
发现最终用于实现系统的程序设计语言只
能支持单继承或不具备继承机制。这时就
需要修改原来的类层次结构。
(五 ) 修改设计以提高性能
如果开发的系统在执行速度上要求严格,
我们就需对问题域部分加以修改,例如合
并那些消息频繁连接的类。
二、银行储蓄系统的 PDC
储蓄系统中,为了提高整个系统的性能,
增加, 终端控制器, 来控制和协调柜员及
终端的所有动作,它和, 事务, 对象协同
工作;此外,增加了, 事务记录器,,用
一个独立的对象记录柜员的操作过程,当
需要时能复查柜员的操作过程。以下是银
行储蓄系统的 PDC部分,为简单起见,以简
单的类表示方式描述。
储户
帐户
事务
1+
1
+ 1+
1+
1+
存款事
务
取款事
务
总行 分行
储蓄所
1+
柜员
终端控制器 事务记录器
银行储蓄系统的 PDC
终端
1+
1+
1+
第三节 人 — 机交互子系统( HIC)的设计
对任何一个系统来说,良好的界面是保证其
成功的基本条件。面向对象方法在设计阶段考虑
HIC,目的是在开发 OOA模型时集中对问题的分析,
可以避免了依赖于实现的细节,如窗口和屏幕等。
OOD中将用户界面技术从系统其它部分分离出来,
目的是如果将来决定该改变用户的界面,那么只
需修改 HIC类,而系统的其它部分可以保持不变。
HIC包括屏幕、报告、调制解调器连接、网络接
口、控制面板(如按钮、指示灯和仪表等)。
一、人 — 机交互界面设计的过程
在面向对象设计方法中,也和其它设计
方法一样,人机交互界面需要详细考究。
在这方面,常常从以下几个方面来考虑。
(一 ) 研究系统用户
花些时间研究将使用系统的用户,将用
户按技能、组织、身份进行分类,对每一
类用户研究他们的特征(年龄、教育水平、
限制等)、使用系统的目的、最关心的功
能以及如何使用系统。
(二 ) 设计命令
为用户设计命令形式,研究现有的人机
交互含义和准则。如果在微机上使用,现
在 windows已成了微机上图形用户界面事实
上工业标准,应该仔细研究。同时结合本
系统与用户的特点,设计出最友好的人机
界面。
(三 ) 设计详细的交互
为每一个命令设计详细的交互,在
设计交互过程中要遵循以下规则:
1.一致性(一致的术语、一致的步骤、
一致的活动);
2.操作步骤少;
3.减少人脑记忆负担;
4.趣味浓,有吸引力;
5.具有 undo功能;
6.具有闭合块(用一些小步骤引出定义
良好的活动)。
(四 ) 作原型
在对人机交互部分的设计中,做人机交
互原型是非常必要的。这样,用户可对提
出的交互活动进行体验和操作,从而找出
不足。这对于完善交互设计系统起到了监
督和促进作用,使将来设计的界面更令人
满意。
二、人 — 机交互类的设计
人机交互类的设计很大程度上依赖于所
用的操作系统和编程语言。
例如在 windows环境下,从主窗口和部
件的人机交互开始,以分类或组装的结构
设计出各层的窗口类,每个类中封装了菜
单条、下拉菜单、弹出菜单的定义;定义
了用来创建菜单、加亮选择项、引用相应
的响应所需的服务、所有的物理对话、窗
口的实际显示。设计人员可以重用现成的
类,例如 Visual C++语言提供的 MFC类库。
三、银行储蓄系统的 HIC
下图是储蓄系统的 HIC,由各种窗口组
成,实际上,每个窗口对象可以进一步分
解为各种文本域、选择按钮、图符等。当
然如果有现成的构成 GUI的类库,那么可以
直接利用,只需提供合适的参数就行。
银行系统窗口
存款窗口 取款窗口
初次存款窗口 一般存款窗口
银行储蓄系统的 HIC
事务窗口 验卡窗口 验密码窗口
第四节 任务管理子系统( DMC)的设计
有的系统中存在着许多并发行为,例如
银行储蓄系统中,每个时刻多个柜员同时
都在请求系统处理着各项事务,因此存在
着许多并发行为。当系统中有许多并发行
为时,需要依照各个行为的协调和通信关
系,划分各种任务,以简化并发行为的设
计和编码。任务是进程的别称,是执行一
系列活动的一段程序。不同的任务标识了
同时发生的不同行为。这种并发行为既可
以在不同的处理器上实现,也可以在单个
处理器上利用中断机制实现。
任务管理主要包括任务的选择和调整,
为此,在任务管理子系统中需要标识一些
新类,这些类建立以后将主要负责处理并
发问题、中断、操作系统一级的调度以及
有关特定平台的一些问题。正如 HIC所做那
样,TMC把有关特定平台的处理机制与系统
其它部分隔离开来。这样,如果决定将系
统移植到另一个平台,那么只需替换 TMC的
类就可以了。
一、任务管理子系统设计策略
任务管理子系统设计首先要对任务进行选择,
然后对每个任务进行审查。
(一 )任务的选择
任务的选择从以下几个方面去查找:
1、事件驱动 有些任务是事件驱动的,而
事件常常是当数据到来时发出一个信号。在系统
运行时,这种任务的工作过程是,任务睡眠 (不
消耗 CPU时间),等待一个来自数据线或其它数
据源的中断;当接到中断时,任务唤醒,接收数
据并把数据放入内存缓冲区或其它目的地,通知
需要知道这件事的对象;然后该任务又 回到睡眠
状态 。
2、时钟驱动 某些任务每隔一定时间
间隔就被触发以执行某些处理。
例如某些设备需要周期性地获得数据;
某些人机界面、子系统、任务、处理机或
与其它系统需要周期性的通信。在这些场
合往往需要使用时钟驱动型任务。
这种任务工作过程是:任务设置了唤醒
时间后进入睡眠状态,等待来自系统的时
钟中断;当接到中断时,任务唤醒并做它
的工作,通知有关的对象;然后设置唤醒
时间后又回到睡眠状态。
(二 )审查任务并调整
任务找到之后,仔细审查每个任务。
1、设置任务的优先级 系统中,对每
个任务的时间要求不同,可以通过设置优
先级来安排各个任务。某些操作必须在很
强的时间限制内完成,应该把它分离成独
立的任务,设置高优先级,执行时优先执
行。
2.识别协调者 当有三个或更多的任务
时,应当增加一个附加任务,起协调者的
作用。
3.调整任务 进一步仔细分析和选择每
个确实需要的任务,应该使系统中包含的
任务数尽量少。
二,银行储蓄系统的 TMC
下图中,储蓄系统中,通过读卡器将存
折的帐号读入,密码也由储户从密码输入
器输入,那么可以设计两个任务,,读卡
中断,,, 密码中断, 分别接收读卡器的
数据和密码输入器的数据。
中断
读卡中断 密码中断
读卡器和密码输入器如何接收数据的过
程被封装在相应, 读卡中断, 和, 密码中
断, 类中,接收数据之后,将它进行相应
的处理并送到有关的对象中。图 8,6以读
卡为例,表明了银行储蓄系统中 TMC,PDC、
HIC之间如何工作。银行储蓄系统中 TMC、
PDC,HIC相互隔离,每一子系统内部的信
息对系统其它部分是隐藏的,它们相互之
间通过消息进行联系。
银行系统 TMC的, 读卡中断, 平常处于
睡眠状态,当读卡器开始工作时,,读卡
中断, 被唤醒,获得数据,向 PDC的, 分行,
类发送消息,要求检验帐号,,分行, 类
接收消息后,执行相应的服务,将结果发
给 HIC的, 验卡窗口, 类,,验卡窗口, 类
接到消息,将相应的检验结果以一定的方
式显示在屏幕上。
很明显,在这个过程中,需要做许多工
作。但这样做的好处是:提高系统的可维
护性和可修改性,系统只需要修改一小部
分就能适应一个新的环境。
例如读卡器的读卡方式发生变化或验卡
窗口的显示方式发生变化,只需修改相应
的读卡中断或验卡窗口而不影响系统其它
部分。
读卡中断分行验卡窗口
HIC PDC TMC
检验帐号
读卡
器
HIC,PDC,TMC的联系
第五节 数据管理子系统( DMC)的设计
当系统中的数据需要长期保存时,需要
对数据管理进行设计。设置 DMC部分的主要
原因,和 OOD的其它部分一样,将特定的数
据库管理技术与其它部分隔离开来,避免
数据存储管理模式的改变对系统的影响。
目前主要有 3种数据管理模式:
文件管理
关系数据库管理
面向对象数据库管理。
一、文件管理
文件管理系统是操作系统的一个组成部分,
使用它长期保存数据具有成本低和简单的特点。
用这种方式存储数据时,列出需要存储的类和属
性,把这个列表引入第一范式,为每个第一范式
表建立一个文件。为减少文件数,可把表示一
般 — 特殊结构的属性萎缩成一个单一文件。要注
意满足性能及存储的需求。在 DMC中定义一个
,ObjectSever”(对象服务器)类,为每个文件
创建一个实例,该类中封装了如何建立、读、写
以及删除的机制。其它子系统中的对象需要访问
数据时,增加服务,与 DMC中的对象建立消息连
接。
二、关系数据库管理
关系数据库管理系统建立在关系理论的
基础上,它使用若干表格来管理数据。用
这种方式存储数据时,列出需要存储的类
和属性,把这个列表引入第三范式,为每
个第三范式表建立一个文件。设计时要注
意满足性能及存储的需求。在 DMC中定义一
个, ObjectSever”(对象服务器)类,为
每个关系表创建一个实例,该类中封装了
如何建立、读、写以及删除的机制。其它
子系统中的对象需要访问数据时,增加服
务,与 DMC中的对象建立消息连接。
三、面向对象数据库管理
面向对象数据库管理系统是一种新技术,
有两种设计途径:
( 1)在关系数据库的基础上进行扩展,
增加了抽象数据类型和继承机制,增加了
创建及管理类和对象的通用服务。这种方
式可以采用关系数据库类似的方法建立 DMC。
( 2)扩充了面向对象设计语言的语法
和功能,增加了在数据库存储和管理对象
的机制。
这种数据库管理系统已经给为每个对象
提供了, 存储自己, 的行为,无须规范化
属性的步骤,无须为需存储的对象增加服
务。只需给需要长期保存的对象加个标记,
然后由面向对象数据库管理系统负责存储
和恢复这类对象。
总之,分析是提取和整理用户需求,并
建立问题域精确模型的过程。设计则把分
析阶段得到的需求转变成符合成本和质量
要求的、抽象的系统实现方案的过程。从
面向对象分析到面向对象设计是一个逐渐
扩充模型的过程。 OOD扩充、完善和细化
OOA模型。为简化系统,同时考虑了每一次
变动使系统的修改程度最小,将 OOD分成了
四个子系统,PDC,HIC,TMC,DMC。
可以说,面向对象设计就是用面向对象
观点建立求解域模型的过程。尽管分析和
设计的定义有明显区别,但是在实际的软
件开发过程中两者的界限是模糊的。许多
分析结果可以直接映射成设计结果,而在
设计过程中又往往会加深和补充对系统需
求的理解,从而进一步完善分析结果。因
此,分析和设计是一个多次反复迭代的过
程。
o 面向对象设计概述
o 问题域子系统( PDC)的设计
o 人 — 机交互子系统( HIC)的设计
o 任务管理子系统( DMC)的设计
o 数据管理子系统( DMC)的设计
面向对象设计( OOD)仍然需要进行总
体设计和详细设计。在面向对象方法中,
总体设计和详细设计也没有清晰的界限。
本章主要介绍如何建立系统的基本框架。
总体设计将系统分成几个子系统,建立
系统的基本框架,每个子系统使用与面向
对象分析一致的表示方法建立模型,可以
说,总体设计是逐渐扩充面向对象分析模
型的过程;详细设计则针对每个子系统中
的每个类的作用、类的内部构成(属性和
服务)以及类之间关系进行清晰、具体的
描述,使得在实现阶段程序员根据该描述
能很容易地转化成程序。
第一节 面向对象设计概述
一、面向对象设计系统的基本框架
面向对象分析集中于问题域、系统责任和需
求,它是独立于编程语言的,面向对象设计集中
于用可得到的技术实现上述需求,在很大程度上
仍然独立于编程语言。面向对象设计是面向对象
分析的扩充,主要是增加各种组成部分。具体地
说,面向对象分析识别和定义类 — &— 对象,这
些类 — &— 对象直接反映问题域和系统任务。而
面向对象设计识别和定义其它附加类 — &— 对象,
它们反映需求的一种实现。
面向对象设计的模型仍然由 5层组成,
但划分为四个组成部分:人机交互部分
( HIC,Human Interface Component)、
问题域( PDC,Problem Domain
Component)、任务管理( TMC,Task
Management Component)和数据管理( DMC:
Data Management Component)。
人机交
互部分
主题层
类 — &— 对象层
结构层
属性层
方法层
问题域
部分
任务管
理部分
数据管
理部分
面向对象设计模型
人机交互部分包括,
有效的人机交互所必需的实际显示和输
入,负责向用户提供良好的界面;
问题域部分就是对面向对象分析的结果
进行改进;
任务管理部分是对系统中若干任务并发
执行时,设计合理的任务执行方案;
数据管理部分是对数据的存放和相应的
服务进行设计。
这四个部分相对独立,它们之间通过消
息相互联系。之所以这样划分是出于使整
个系统容易维护的考虑,让将来的每一次
变动使系统的修改程度最小。
例如将来考虑将系统的鼠标点击输入改
为语音输入,那么只需修改人机交互部分,
其它部分不用改动。
二、面向对象设计的准则
结构化方法中软件设计的基本原理在进
行面向对象设计时仍然成立,但是增加了
一些与面向对象方法密切相关的新特点,
从而具体化为面向对象设计准则。
(一 )模块化
面向对象软件开发模式,很自然地支持
了把系统分解成模块的设计原理:类就是
模块。
它是把数据结构和对数据的操作紧密地
结合在一起所构成的模块。
(二 )抽象
面向对象方法不仅支持过程抽象,而且
支持数据抽象。类实际上是一种抽象数据
类型,它对外开放的公共接口构成了类的
规格说明(即协议),这种接口规定了外
界可以使用的合法操作符,利用这些操作
符可以对类实例中包含的数据进行操作。
使用者无须知道这些操作符的实现算法和
类中数据元素的具体表示方法,就可以通
过这些操作符使用类中定义的数据。通常
把这类抽象称为规格说明抽象。
(三 )信息隐藏
在面向对象方法中,信息隐藏通过对象
的封装来实现。对于用户来说,类中的属
性的表示方法和操作的实现算法都应该是
隐藏的。
(四 )弱耦合
结构化方法中耦合是指在系统中的各个
模块之间的相互连接或相互依赖的强度。
在面向对象方法中,耦合主要指不同对象
之间通过消息相互关联的紧密程度。应该
遵守下列准则使这种耦合尽量松散:
1.尽量降低消息连接的复杂程度。应该
尽量减少消息中包含的参数个数,降低参
数的复杂程度。
2.减少对象发送(或接收)的消息数。
(五 )强内聚
内聚用于描述系统内组成部分中各元素
彼此结合的紧密程度,应尽量避免低内聚。
在面向对象设计中,从三个层次来考察内
聚性。
1.单个方法的内聚性:方法是指操作的
实现过程,一个操作由一个或多个方法实
现。对方法的内聚性的评价与结构化设计
中的相同,具有高内聚的方法应当只执行
一个功能。
2.类的内聚性:设计类的原则是,一个
类应该只有一个用途,类中的属性和操作
应该全都是完成该类的任务所必需的,其
中不包括无用的属性和操作。如果某个类
有多个用途,通常应该把它分解成多个专
用的类。
3.层次结构的内聚性:对象之间通过继
承关系而构成的层次结构,特殊类应该确
实是对它的一般化类的一种具体化。如果
一个派生类 摒 弃了它基类的许多属性和服
务,那就是一个低内聚的。
(六 )可重用
软件重用是提高软件开发生产率和目标
系统质量的重要途径。重用基本上从设计
开始。
重用有两方面的含义:一是尽量使用已
有的类(包括开发环境提供的类库,以及
以往开发类似系统是创建的类);二是如
果确实需要创建新类,则在设计这些新类
的协议时,应该考虑将来的可重复使用性。
第二节 问题域子系统( PDC)的设计
一般来说,基于问题域的总体组织框架
是长时间保持稳定的(当然,细节是会变
的,这里加一个类说明,那里加一个属性
或服务)。
例如银行储蓄系统中分行、终端、储户
这个组织结构会长期保持稳定,虽然如储
户的属性可能会发生变化。正是基于这种
稳定,面向对象的分析和设计模型按问题
域本身的样子来组织系统,也能从容适应
变化的需求,能保持稳定性。
OOD中,OOA的结果恰好就是 OOD的问题
域部分。这也正是面向对象的设计和分析
方法的一个最优良的特点。但是可能要作
些改动,这种改动不是否定 OOA的分析结果,
而是完善。
这些改动基于以下几个原因:
( 1)由于需求的变化;
( 2)分析员对问题域的理解可能有误
解或欠缺,需要对此加以修正;
( 3)分析与设计毕竟是性质不同的两
类开发工作,分析可以而且应该与具体实
现无关,而设计在很大程度上受具体实现
环境的约束。
一、对 OOA的改动准则
(一 )依照面向对象设计的准则审核每个
类
优秀的设计能够权衡各种因素,从而使
得系统在其整个生命周期中的总开销最小。
对大多数软件系统而言,60%以上的软件费
用都用于软件维护,因此,优秀软件设计
的一个主要特点就是容易维护。在问题域
系统中,仔细对照面向对象设计的准则,
审查 OOA中的每个类。
(二 )重用设计和编程的类
根据需要重用现成的类,现成类是已用
OO语言或非 OO语言编写的可用源程序。例
如图( a)是 OOA结果中有一个类, 交通工
具,,设计者发现有一个类似的现成类
,交通工具 1”( 图( b)),那么他就可
以按以下步骤重用现成类(图( c))。
PDC中重用类例子
颜色
性能
制造商
问题域中的类
类别
性能
制造商
现成的类
类别
性能
制造商
重用现成类
颜色
性能
制造商
( a) ( b) ( c)
交通工具 交通工具 1 交通工具 1 交通工具
(三 )通过增添超类而建立协议
将问题域许多不同的类聚集在一起,这
时可建立一个新的父类 —— 超类,将这许
多类作为该超类的子类。这样一方面有助
于改进模型的可理解性,同时可以在超类
中给出一个公共的协议,用来与其它子系
统或与外部系统部件进行通信。通信的细
节在子类中定义。
(四 )考虑语言调整继承支持级别
如果 OOA模型依赖于多重继承而设计者
发现最终用于实现系统的程序设计语言只
能支持单继承或不具备继承机制。这时就
需要修改原来的类层次结构。
(五 ) 修改设计以提高性能
如果开发的系统在执行速度上要求严格,
我们就需对问题域部分加以修改,例如合
并那些消息频繁连接的类。
二、银行储蓄系统的 PDC
储蓄系统中,为了提高整个系统的性能,
增加, 终端控制器, 来控制和协调柜员及
终端的所有动作,它和, 事务, 对象协同
工作;此外,增加了, 事务记录器,,用
一个独立的对象记录柜员的操作过程,当
需要时能复查柜员的操作过程。以下是银
行储蓄系统的 PDC部分,为简单起见,以简
单的类表示方式描述。
储户
帐户
事务
1+
1
+ 1+
1+
1+
存款事
务
取款事
务
总行 分行
储蓄所
1+
柜员
终端控制器 事务记录器
银行储蓄系统的 PDC
终端
1+
1+
1+
第三节 人 — 机交互子系统( HIC)的设计
对任何一个系统来说,良好的界面是保证其
成功的基本条件。面向对象方法在设计阶段考虑
HIC,目的是在开发 OOA模型时集中对问题的分析,
可以避免了依赖于实现的细节,如窗口和屏幕等。
OOD中将用户界面技术从系统其它部分分离出来,
目的是如果将来决定该改变用户的界面,那么只
需修改 HIC类,而系统的其它部分可以保持不变。
HIC包括屏幕、报告、调制解调器连接、网络接
口、控制面板(如按钮、指示灯和仪表等)。
一、人 — 机交互界面设计的过程
在面向对象设计方法中,也和其它设计
方法一样,人机交互界面需要详细考究。
在这方面,常常从以下几个方面来考虑。
(一 ) 研究系统用户
花些时间研究将使用系统的用户,将用
户按技能、组织、身份进行分类,对每一
类用户研究他们的特征(年龄、教育水平、
限制等)、使用系统的目的、最关心的功
能以及如何使用系统。
(二 ) 设计命令
为用户设计命令形式,研究现有的人机
交互含义和准则。如果在微机上使用,现
在 windows已成了微机上图形用户界面事实
上工业标准,应该仔细研究。同时结合本
系统与用户的特点,设计出最友好的人机
界面。
(三 ) 设计详细的交互
为每一个命令设计详细的交互,在
设计交互过程中要遵循以下规则:
1.一致性(一致的术语、一致的步骤、
一致的活动);
2.操作步骤少;
3.减少人脑记忆负担;
4.趣味浓,有吸引力;
5.具有 undo功能;
6.具有闭合块(用一些小步骤引出定义
良好的活动)。
(四 ) 作原型
在对人机交互部分的设计中,做人机交
互原型是非常必要的。这样,用户可对提
出的交互活动进行体验和操作,从而找出
不足。这对于完善交互设计系统起到了监
督和促进作用,使将来设计的界面更令人
满意。
二、人 — 机交互类的设计
人机交互类的设计很大程度上依赖于所
用的操作系统和编程语言。
例如在 windows环境下,从主窗口和部
件的人机交互开始,以分类或组装的结构
设计出各层的窗口类,每个类中封装了菜
单条、下拉菜单、弹出菜单的定义;定义
了用来创建菜单、加亮选择项、引用相应
的响应所需的服务、所有的物理对话、窗
口的实际显示。设计人员可以重用现成的
类,例如 Visual C++语言提供的 MFC类库。
三、银行储蓄系统的 HIC
下图是储蓄系统的 HIC,由各种窗口组
成,实际上,每个窗口对象可以进一步分
解为各种文本域、选择按钮、图符等。当
然如果有现成的构成 GUI的类库,那么可以
直接利用,只需提供合适的参数就行。
银行系统窗口
存款窗口 取款窗口
初次存款窗口 一般存款窗口
银行储蓄系统的 HIC
事务窗口 验卡窗口 验密码窗口
第四节 任务管理子系统( DMC)的设计
有的系统中存在着许多并发行为,例如
银行储蓄系统中,每个时刻多个柜员同时
都在请求系统处理着各项事务,因此存在
着许多并发行为。当系统中有许多并发行
为时,需要依照各个行为的协调和通信关
系,划分各种任务,以简化并发行为的设
计和编码。任务是进程的别称,是执行一
系列活动的一段程序。不同的任务标识了
同时发生的不同行为。这种并发行为既可
以在不同的处理器上实现,也可以在单个
处理器上利用中断机制实现。
任务管理主要包括任务的选择和调整,
为此,在任务管理子系统中需要标识一些
新类,这些类建立以后将主要负责处理并
发问题、中断、操作系统一级的调度以及
有关特定平台的一些问题。正如 HIC所做那
样,TMC把有关特定平台的处理机制与系统
其它部分隔离开来。这样,如果决定将系
统移植到另一个平台,那么只需替换 TMC的
类就可以了。
一、任务管理子系统设计策略
任务管理子系统设计首先要对任务进行选择,
然后对每个任务进行审查。
(一 )任务的选择
任务的选择从以下几个方面去查找:
1、事件驱动 有些任务是事件驱动的,而
事件常常是当数据到来时发出一个信号。在系统
运行时,这种任务的工作过程是,任务睡眠 (不
消耗 CPU时间),等待一个来自数据线或其它数
据源的中断;当接到中断时,任务唤醒,接收数
据并把数据放入内存缓冲区或其它目的地,通知
需要知道这件事的对象;然后该任务又 回到睡眠
状态 。
2、时钟驱动 某些任务每隔一定时间
间隔就被触发以执行某些处理。
例如某些设备需要周期性地获得数据;
某些人机界面、子系统、任务、处理机或
与其它系统需要周期性的通信。在这些场
合往往需要使用时钟驱动型任务。
这种任务工作过程是:任务设置了唤醒
时间后进入睡眠状态,等待来自系统的时
钟中断;当接到中断时,任务唤醒并做它
的工作,通知有关的对象;然后设置唤醒
时间后又回到睡眠状态。
(二 )审查任务并调整
任务找到之后,仔细审查每个任务。
1、设置任务的优先级 系统中,对每
个任务的时间要求不同,可以通过设置优
先级来安排各个任务。某些操作必须在很
强的时间限制内完成,应该把它分离成独
立的任务,设置高优先级,执行时优先执
行。
2.识别协调者 当有三个或更多的任务
时,应当增加一个附加任务,起协调者的
作用。
3.调整任务 进一步仔细分析和选择每
个确实需要的任务,应该使系统中包含的
任务数尽量少。
二,银行储蓄系统的 TMC
下图中,储蓄系统中,通过读卡器将存
折的帐号读入,密码也由储户从密码输入
器输入,那么可以设计两个任务,,读卡
中断,,, 密码中断, 分别接收读卡器的
数据和密码输入器的数据。
中断
读卡中断 密码中断
读卡器和密码输入器如何接收数据的过
程被封装在相应, 读卡中断, 和, 密码中
断, 类中,接收数据之后,将它进行相应
的处理并送到有关的对象中。图 8,6以读
卡为例,表明了银行储蓄系统中 TMC,PDC、
HIC之间如何工作。银行储蓄系统中 TMC、
PDC,HIC相互隔离,每一子系统内部的信
息对系统其它部分是隐藏的,它们相互之
间通过消息进行联系。
银行系统 TMC的, 读卡中断, 平常处于
睡眠状态,当读卡器开始工作时,,读卡
中断, 被唤醒,获得数据,向 PDC的, 分行,
类发送消息,要求检验帐号,,分行, 类
接收消息后,执行相应的服务,将结果发
给 HIC的, 验卡窗口, 类,,验卡窗口, 类
接到消息,将相应的检验结果以一定的方
式显示在屏幕上。
很明显,在这个过程中,需要做许多工
作。但这样做的好处是:提高系统的可维
护性和可修改性,系统只需要修改一小部
分就能适应一个新的环境。
例如读卡器的读卡方式发生变化或验卡
窗口的显示方式发生变化,只需修改相应
的读卡中断或验卡窗口而不影响系统其它
部分。
读卡中断分行验卡窗口
HIC PDC TMC
检验帐号
读卡
器
HIC,PDC,TMC的联系
第五节 数据管理子系统( DMC)的设计
当系统中的数据需要长期保存时,需要
对数据管理进行设计。设置 DMC部分的主要
原因,和 OOD的其它部分一样,将特定的数
据库管理技术与其它部分隔离开来,避免
数据存储管理模式的改变对系统的影响。
目前主要有 3种数据管理模式:
文件管理
关系数据库管理
面向对象数据库管理。
一、文件管理
文件管理系统是操作系统的一个组成部分,
使用它长期保存数据具有成本低和简单的特点。
用这种方式存储数据时,列出需要存储的类和属
性,把这个列表引入第一范式,为每个第一范式
表建立一个文件。为减少文件数,可把表示一
般 — 特殊结构的属性萎缩成一个单一文件。要注
意满足性能及存储的需求。在 DMC中定义一个
,ObjectSever”(对象服务器)类,为每个文件
创建一个实例,该类中封装了如何建立、读、写
以及删除的机制。其它子系统中的对象需要访问
数据时,增加服务,与 DMC中的对象建立消息连
接。
二、关系数据库管理
关系数据库管理系统建立在关系理论的
基础上,它使用若干表格来管理数据。用
这种方式存储数据时,列出需要存储的类
和属性,把这个列表引入第三范式,为每
个第三范式表建立一个文件。设计时要注
意满足性能及存储的需求。在 DMC中定义一
个, ObjectSever”(对象服务器)类,为
每个关系表创建一个实例,该类中封装了
如何建立、读、写以及删除的机制。其它
子系统中的对象需要访问数据时,增加服
务,与 DMC中的对象建立消息连接。
三、面向对象数据库管理
面向对象数据库管理系统是一种新技术,
有两种设计途径:
( 1)在关系数据库的基础上进行扩展,
增加了抽象数据类型和继承机制,增加了
创建及管理类和对象的通用服务。这种方
式可以采用关系数据库类似的方法建立 DMC。
( 2)扩充了面向对象设计语言的语法
和功能,增加了在数据库存储和管理对象
的机制。
这种数据库管理系统已经给为每个对象
提供了, 存储自己, 的行为,无须规范化
属性的步骤,无须为需存储的对象增加服
务。只需给需要长期保存的对象加个标记,
然后由面向对象数据库管理系统负责存储
和恢复这类对象。
总之,分析是提取和整理用户需求,并
建立问题域精确模型的过程。设计则把分
析阶段得到的需求转变成符合成本和质量
要求的、抽象的系统实现方案的过程。从
面向对象分析到面向对象设计是一个逐渐
扩充模型的过程。 OOD扩充、完善和细化
OOA模型。为简化系统,同时考虑了每一次
变动使系统的修改程度最小,将 OOD分成了
四个子系统,PDC,HIC,TMC,DMC。
可以说,面向对象设计就是用面向对象
观点建立求解域模型的过程。尽管分析和
设计的定义有明显区别,但是在实际的软
件开发过程中两者的界限是模糊的。许多
分析结果可以直接映射成设计结果,而在
设计过程中又往往会加深和补充对系统需
求的理解,从而进一步完善分析结果。因
此,分析和设计是一个多次反复迭代的过
程。