1、2022-5-241第第9 9章章 面向对象设计面向对象设计面向对象的准则和启发规则面向对象的准则和启发规则软件重用的基本概念软件重用的基本概念系统的分解及各个子系统的设计系统的分解及各个子系统的设计设计关联设计关联设计优化设计优化2022-5-2429.1 9.1 面向对象设计的准则面向对象设计的准则n 1 1模块化模块化 面向对象软件开发模式,很自然地支持了把系统分解成模块的设计面向对象软件开发模式,很自然地支持了把系统分解成模块的设计原理:对象就是模块。它是把数据结构和操作这些数据的方法紧密地原理:对象就是模块。它是把数据结构和操作这些数据的方法紧密地结合在一起所构成的模块。结合在一起所
2、构成的模块。n 2 2抽象抽象化化 面向对象方法不仅支持过程抽象,而且支持数据抽象。类实际上是面向对象方法不仅支持过程抽象,而且支持数据抽象。类实际上是一种抽象数据类型,它对外开放的公共接口构成了类的规格说明(即一种抽象数据类型,它对外开放的公共接口构成了类的规格说明(即协议),这种接口规定了外界可以使用的合法操作符,利用这些操作协议),这种接口规定了外界可以使用的合法操作符,利用这些操作符可以对类实例中包含的数据进行操作。符可以对类实例中包含的数据进行操作。2022-5-243n 3 3信息隐藏信息隐藏和封装和封装 在面向对象方法中,信息隐藏通过对象的封装性实现:类结在面向对象方法中,信息隐
3、藏通过对象的封装性实现:类结构分离了接口与实现,从而支持了信息隐藏。对于类的用户构分离了接口与实现,从而支持了信息隐藏。对于类的用户来说,属性的表示方法和操作的实现算法都应该是隐藏的。来说,属性的表示方法和操作的实现算法都应该是隐藏的。9.1 9.1 面向对象设计的准则面向对象设计的准则2022-5-2442022-5-2452022-5-246耦合指一个软件结构内不同模块之间互连的紧密程度。在面向对象方法中,耦合指一个软件结构内不同模块之间互连的紧密程度。在面向对象方法中,对象是最基本的模块,因此,耦合主要指不同对象之间相互关联的紧密程度。弱对象是最基本的模块,因此,耦合主要指不同对象之间相
4、互关联的紧密程度。弱耦合是优秀设计的一个重要标准,因为这有助于使得系统中某一部分的变化对其耦合是优秀设计的一个重要标准,因为这有助于使得系统中某一部分的变化对其他部分的影响降到最低程度。他部分的影响降到最低程度。n 一般来说,对象之间的耦合可分为两大类一般来说,对象之间的耦合可分为两大类: (1 1)交互耦合)交互耦合 如果对象之间的耦合通过消息连接来实现,则这种耦合就是交互耦合。如果对象之间的耦合通过消息连接来实现,则这种耦合就是交互耦合。为使交互耦合尽可能松散,应该遵守下述准则。为使交互耦合尽可能松散,应该遵守下述准则。 尽量降低消息连接的复杂程度。应该尽量减少消息中包含的参数个数,降低参
5、数的尽量降低消息连接的复杂程度。应该尽量减少消息中包含的参数个数,降低参数的复杂程度。复杂程度。 减少对象发送(或接收)的消息数。减少对象发送(或接收)的消息数。9.1 9.1 面向对象设计的准则面向对象设计的准则2022-5-247 (2 2)继承耦合)继承耦合 与交互耦合相反,继承耦合应该提高继承耦合程度。继承是一般化类与特与交互耦合相反,继承耦合应该提高继承耦合程度。继承是一般化类与特殊类之间耦合的一种形式。从本质上看,通过继承关系结合起来的基类殊类之间耦合的一种形式。从本质上看,通过继承关系结合起来的基类和派生类,构成了系统中粒度更大的模块,因此,它们彼此之间应该结和派生类,构成了系统
6、中粒度更大的模块,因此,它们彼此之间应该结合得越紧密越好。合得越紧密越好。为获得紧密的继承耦合,特殊类应该确实是对它的一般化类的一种具体化,为获得紧密的继承耦合,特殊类应该确实是对它的一般化类的一种具体化,也就是说,它们之间在逻辑上应该存在也就是说,它们之间在逻辑上应该存在“is a”“is a”的关系。的关系。9.1 9.1 面向对象设计的准则面向对象设计的准则2022-5-248n 5 5 可扩充性可扩充性 第一,继承关系有助于复用已有定义,使开发新定义更加容易。第二,第一,继承关系有助于复用已有定义,使开发新定义更加容易。第二,在面向对象的语言中,类型系统的多态性也支持可扩充的设计。在面
7、向对象的语言中,类型系统的多态性也支持可扩充的设计。n 6 6可重用可重用性性 软件重用是提高软件开发生产率和目标系统质量的重要途径,重用基本软件重用是提高软件开发生产率和目标系统质量的重要途径,重用基本上从设计阶段开始。重用有两方面的含义:一是尽量使用已有的类上从设计阶段开始。重用有两方面的含义:一是尽量使用已有的类(包括开发环境提供的类库,及以往开发类似系统时创建的类),二(包括开发环境提供的类库,及以往开发类似系统时创建的类),二是如果确实需要创建新类,则在设计这些新类的协议时,应该考虑将是如果确实需要创建新类,则在设计这些新类的协议时,应该考虑将来的可重复使用性。来的可重复使用性。9.
8、1 9.1 面向对象设计的准则面向对象设计的准则2022-5-2499.2 9.2 启发规则启发规则n 1 1设计结果应该清晰易懂设计结果应该清晰易懂 使设计结果清晰、易读、易懂,是提高软件可维护性和可重使设计结果清晰、易读、易懂,是提高软件可维护性和可重用性的重要措施。用性的重要措施。 (1 1)用词一致)用词一致 应该使名字与它所代表的事物一致,而且应该尽量使用人们习惯的应该使名字与它所代表的事物一致,而且应该尽量使用人们习惯的名字。不同类中相似服务的名字应该相同。名字。不同类中相似服务的名字应该相同。 (2 2)使用已有的协议)使用已有的协议 如果开发同一软件的其他设计人员已经建立了类的
9、协议,或者在所如果开发同一软件的其他设计人员已经建立了类的协议,或者在所使用的类库中已有相应的协议,则应该使用这些已有的协议。使用的类库中已有相应的协议,则应该使用这些已有的协议。2022-5-2410 (3 3)减少消息模式的数目)减少消息模式的数目 如果已有标准的消息协议,设计人员应该遵守这些协议。如果确需如果已有标准的消息协议,设计人员应该遵守这些协议。如果确需自己建立消息协议,则应该尽量减少消息模式的数目。只要可能,就自己建立消息协议,则应该尽量减少消息模式的数目。只要可能,就使消息具有一致的模式,以利于读者理解。使消息具有一致的模式,以利于读者理解。 (4 4)避免模糊的定义)避免模
10、糊的定义 一个类的用途应该是有限的,而且通过类名应该可以较容易地推想一个类的用途应该是有限的,而且通过类名应该可以较容易地推想出它的用途出它的用途。9.2 9.2 启发规则启发规则2022-5-2411n 2 2一般一般/ /特殊结构的深度应适当特殊结构的深度应适当 应该使类等级中包含的层次数适当。一般来说,在一个中等应该使类等级中包含的层次数适当。一般来说,在一个中等规模(大约包含规模(大约包含100100个类)的系统中,类等级层次数应保持为个类)的系统中,类等级层次数应保持为7 72 2。不应该仅仅从方便编码的角度出发随意创建派生类,应。不应该仅仅从方便编码的角度出发随意创建派生类,应该使
11、一般该使一般/ /特殊结构与领域知识或常识保持一致。特殊结构与领域知识或常识保持一致。9.2 9.2 启发规则启发规则2022-5-2412n 3 3设计简单的类设计简单的类 应该尽量设计小而简单的类,以便于开发和管理。当类比较应该尽量设计小而简单的类,以便于开发和管理。当类比较庞大的时候,要记住它的所有服务是非常困难的。为保持类的庞大的时候,要记住它的所有服务是非常困难的。为保持类的简单,应该注意以下几点。简单,应该注意以下几点。 (1 1)避免包含过多的属性)避免包含过多的属性 属性过多通常表明这个类过分复杂了,它所完成的功能可能太多了。属性过多通常表明这个类过分复杂了,它所完成的功能可能
12、太多了。 (2 2)有明确的定义)有明确的定义 为了使类的定义明确,分配给每个类的任务应该简单,最好能用一为了使类的定义明确,分配给每个类的任务应该简单,最好能用一两个简单语句描述它的任务。两个简单语句描述它的任务。9.2 9.2 启发规则启发规则2022-5-2413 (3 3)尽量简化对象之间的合作关系)尽量简化对象之间的合作关系 如果需要多个对象协同配合才能做好一件事,则破坏了类的简明性如果需要多个对象协同配合才能做好一件事,则破坏了类的简明性和清晰性。和清晰性。 (4 4)不要提供太多服务)不要提供太多服务 一个类提供的服务过多,同样表明这个类过分复杂。典型地,一个一个类提供的服务过多
13、,同样表明这个类过分复杂。典型地,一个类提供的公共服务不超过类提供的公共服务不超过7 7个。个。 在开发大型软件系统时,遵循上述启发规则也会带来另一个问题;在开发大型软件系统时,遵循上述启发规则也会带来另一个问题;设计出大量较小的类,这同样会带来一定复杂性。解决这个问题的办设计出大量较小的类,这同样会带来一定复杂性。解决这个问题的办法,是把系统中的类按逻辑分组,也就是划分法,是把系统中的类按逻辑分组,也就是划分“主题主题”。9.2 9.2 启发规则启发规则2022-5-2414n 4 4使用简单的协议使用简单的协议 一般来说,消息中的参数不要超过一般来说,消息中的参数不要超过3 3个。当然,不
14、超过个。当然,不超过3 3个的个的限制也不是绝对的。但是,经验表明,通过复杂消息相互关联限制也不是绝对的。但是,经验表明,通过复杂消息相互关联的对象是紧耦合的,对一个对象的修改往往导致其他对象的修的对象是紧耦合的,对一个对象的修改往往导致其他对象的修改。改。n 5 5使用简单的服务使用简单的服务 面向对象设计出来的类中的服务通常都很小,一般只有面向对象设计出来的类中的服务通常都很小,一般只有3 35 5行源程序语句,可以用仅含一个动词和一个宾语的简单句子描行源程序语句,可以用仅含一个动词和一个宾语的简单句子描述它的功能。述它的功能。9.2 9.2 启发规则启发规则2022-5-2415n 6
15、6把设计变动减至最小把设计变动减至最小 通常,设计的质量越高,设计结果保持不变的时间也越长。通常,设计的质量越高,设计结果保持不变的时间也越长。即使出现必须修改设计的情况,也应该使修改的范围尽可能小。即使出现必须修改设计的情况,也应该使修改的范围尽可能小。理想的设计变动曲线如图理想的设计变动曲线如图9-19-1所示。所示。 在设计的早期阶段,变动较大,随着时间推移,设计方案日在设计的早期阶段,变动较大,随着时间推移,设计方案日趋成熟,改动也越来越小了。图趋成熟,改动也越来越小了。图9-19-1中所示的峰值与出现设计中所示的峰值与出现设计错误或发生非预期变动的情况相对应。峰值越高,表明设计质错误
16、或发生非预期变动的情况相对应。峰值越高,表明设计质量越差,可重用性也越差。量越差,可重用性也越差。9.2 9.2 启发规则启发规则2022-5-2416图图9-1 9-1 理想的设计变动情况理想的设计变动情况9.2 9.2 启发规则启发规则2022-5-24179.3 9.3 软件重用软件重用9.3.1 9.3.1 概述概述n 1 1、重用、重用n 2 2、软件成分的重用级别、软件成分的重用级别 (1 1)代码重用)代码重用 (2 2)设计结果重用)设计结果重用 (3 3)分析结果重用)分析结果重用2022-5-2418n 3 3、典型的可重用软件成分、典型的可重用软件成分项目计划项目计划成本
17、估计成本估计体系结构体系结构需求模型和规格说明需求模型和规格说明设计设计源代码源代码用户文档和技术文档用户文档和技术文档用户界面用户界面数据数据测试用例测试用例9.3.1 9.3.1 概述概述2022-5-24199.3.2 9.3.2 类构件类构件可重用软件构件应具备的特点可重用软件构件应具备的特点模块独立性强。模块独立性强。具有高度可塑性。具有高度可塑性。接口清晰、简明、可靠。接口清晰、简明、可靠。类构件的重用方式类构件的重用方式实例重用实例重用继承重用继承重用多态重用多态重用2022-5-24209.3.3 9.3.3 软件重用的效益软件重用的效益 近近几几年年来来软软件件产产业业界界的
18、的实实例例研研究究表表明,明,通通过过积积极极的的软软件件重重用用能能够够获获得得可可观观的的商商业业效效益,益,产产品品质质量、量、开开发发生生产产率率和和整整体体成成本本都都得得到到了了改改善。善。质质量量生生产产率率成成本本2022-5-24219.4 9.4 划分子系统划分子系统人类解决复杂问题时普遍采用的策略是人类解决复杂问题时普遍采用的策略是“分而治之,各个击破分而治之,各个击破”。同样,软件工程师在设计比较复杂的应用系统时普遍采用的策略,也是同样,软件工程师在设计比较复杂的应用系统时普遍采用的策略,也是首先把系统分解成若干个比较小的部分,然后再分别设计每个部分。首先把系统分解成若
19、干个比较小的部分,然后再分别设计每个部分。系统的主要组成部分称为子系统,通常根据所提供的功能来划分子系统的主要组成部分称为子系统,通常根据所提供的功能来划分子系统。系统。各个子系统之间应该具有尽可能简单、明确的接口。接口确定了交各个子系统之间应该具有尽可能简单、明确的接口。接口确定了交互形式和通过子系统边界的信息流,但是无须规定子系统内部的实现算互形式和通过子系统边界的信息流,但是无须规定子系统内部的实现算法。法。2022-5-2422在划分和设计子系统时,应该尽量减少子系统彼此间的依赖性。在划分和设计子系统时,应该尽量减少子系统彼此间的依赖性。采用面向对象方法设计软件系统时,面向对象设计模型
20、(即求解域的采用面向对象方法设计软件系统时,面向对象设计模型(即求解域的对象模型),与面向对象分析模型(即问题域的对象模型)一样,也对象模型),与面向对象分析模型(即问题域的对象模型)一样,也由主题、类与对象、结构、属性和服务由主题、类与对象、结构、属性和服务5 5个层次组成。个层次组成。我们可以把面向对象设计模型的我们可以把面向对象设计模型的4 4大组成部分想象成整个模型的大组成部分想象成整个模型的4 4个垂直切片。典型的面向对象设计模型可以用图个垂直切片。典型的面向对象设计模型可以用图9-29-2表示。表示。9.4 9.4 划分子系统划分子系统2022-5-2423图图9-2 9-2 典型
21、的面向对象设计模型典型的面向对象设计模型9.4 9.4 划分子系统划分子系统2022-5-24249.4.1 9.4.1 子系统之间的两种交互方式子系统之间的两种交互方式n 1 1客客户户供供应应商商关关系系 在在这这种种关关系系中,中,作作为为“客客户户”的的子子系系统统调调用用作作为为“供供应应商商”的的子子系系统,统,后后者者完完成成某某些些服服务务工工作作并并返返回回结结果。果。使使用用这这种种交交互互方方案,案,作作为为客客户户的的子子系系统统必必须须了了解解作作为为供供应应商商的的子子系系统统的的接接口,口,然然而而后后者者却却无无须须了了解解前前者者的的接接口,口,因因为为任任何
22、何交交互互行行为为都都是是由由前前者者驱驱动动的。的。2022-5-2425n 2 2平等伙伴关系平等伙伴关系 在这种关系中,每个子系统都可能调用其他子系统,因此,在这种关系中,每个子系统都可能调用其他子系统,因此,每个子系统都必须了解其他子系统的接口。由于各个子系统需每个子系统都必须了解其他子系统的接口。由于各个子系统需要相互了解对方的接口,因此这种组织系统的方案比起客户要相互了解对方的接口,因此这种组织系统的方案比起客户供应商方案来,子系统之间的交互更复杂,而且这种交互方式供应商方案来,子系统之间的交互更复杂,而且这种交互方式还可能存在通信环路,从而使系统难于理解,容易发生不易察还可能存在
23、通信环路,从而使系统难于理解,容易发生不易察觉的设计错误。觉的设计错误。 总的说来,单向交互比双向交互更容易理解,也更容易总的说来,单向交互比双向交互更容易理解,也更容易设计和修改,因此,应该尽量使用客户设计和修改,因此,应该尽量使用客户供应商关系。供应商关系。9.4.1 9.4.1 子系统之间的两种交互方式子系统之间的两种交互方式2022-5-24269.4.2 9.4.2 组织系统的两种方案组织系统的两种方案n 1 1水平水平层次组织层次组织 这种组织方案把软件系统组织成一个层次系统,每层是一个子系统。这种组织方案把软件系统组织成一个层次系统,每层是一个子系统。上层在下层的基础上建立,下层
24、为实现上层功能而提供必要的服务。上层在下层的基础上建立,下层为实现上层功能而提供必要的服务。每一层内所包含的对象,彼此间相互独立,而处于不同层次上的对象,每一层内所包含的对象,彼此间相互独立,而处于不同层次上的对象,彼此间往往有关联。彼此间往往有关联。 层次结构又可进一步划分成两种模式:封闭式和开放式。层次结构又可进一步划分成两种模式:封闭式和开放式。所谓封闭式,就是每层子系统仅仅使用其直接下层提供的服务在开放模式中,某所谓封闭式,就是每层子系统仅仅使用其直接下层提供的服务在开放模式中,某层子系统可以使用处于其下面的任何一层子系统所提供的服务。层子系统可以使用处于其下面的任何一层子系统所提供的
25、服务。2022-5-2427n 2 2垂直垂直块状组织块状组织 这种组织方案把软件系统垂直地分解成若干个相对独立的、弱耦合这种组织方案把软件系统垂直地分解成若干个相对独立的、弱耦合的子系统,一个子系统相当于一块,每块提供一种类型的服务。的子系统,一个子系统相当于一块,每块提供一种类型的服务。 利用层次和块的各种可能的组合,可以成功地由多个子系统组成一利用层次和块的各种可能的组合,可以成功地由多个子系统组成一个完整的软件系统。当混合使用层次结构和块状结构时,同一层次可个完整的软件系统。当混合使用层次结构和块状结构时,同一层次可以由若干块组成,而同一块也可以分为若干层。例如,图以由若干块组成,而同
26、一块也可以分为若干层。例如,图9-39-3所示为所示为一个应用系统的组织结构,这个应用系统采用了层次与块状的混合结一个应用系统的组织结构,这个应用系统采用了层次与块状的混合结构。构。9.4.2 9.4.2 组织系统的两种方案组织系统的两种方案2022-5-2428图图9-3 9-3 典型应用系统的组织结构典型应用系统的组织结构9.4.2 9.4.2 组织系统的两种方案组织系统的两种方案2022-5-24299.4.3 9.4.3 设计系统的拓扑结构设计系统的拓扑结构由子系统组成完整的系统时,典型的拓扑结构有管由子系统组成完整的系统时,典型的拓扑结构有管道形、树形、星形等。设计者应该采用与问题结
27、构相道形、树形、星形等。设计者应该采用与问题结构相适应的、尽可能简单的拓扑结构,以减少子系统之间适应的、尽可能简单的拓扑结构,以减少子系统之间的交互数量。的交互数量。2022-5-24309.5 9.5 设计子系统设计子系统9.5.1 9.5.1 设计问题域子系统设计问题域子系统使用面向对象方法开发软件时,在分析与设计之间并没有明确的分界线,使用面向对象方法开发软件时,在分析与设计之间并没有明确的分界线,对于问题域子系统来说,情况更是如此。对于问题域子系统来说,情况更是如此。通过面向对象分析所得出的问题域精确模型,为设计问题域子系统奠定通过面向对象分析所得出的问题域精确模型,为设计问题域子系统
28、奠定了良好的基础,建立了完整的框架了良好的基础,建立了完整的框架使用面向对象方法学开发软件,能够保持问题域组织框架的稳定性,从使用面向对象方法学开发软件,能够保持问题域组织框架的稳定性,从而便于追踪分析、设计和编程的结果。在设计与实现过程中所做的细而便于追踪分析、设计和编程的结果。在设计与实现过程中所做的细节修改(如增加具体类,增加属性或服务),并不影响开发结果的稳节修改(如增加具体类,增加属性或服务),并不影响开发结果的稳定性,因为系统的总体框架是基于问题域的。定性,因为系统的总体框架是基于问题域的。2022-5-2431对于需求可能随时间变化的系统来说,稳定性是至关重要的。稳定对于需求可能
29、随时间变化的系统来说,稳定性是至关重要的。稳定性也是能够在类似系统中重用分析、设计和编程结果的关键因素。为更性也是能够在类似系统中重用分析、设计和编程结果的关键因素。为更好地支持系统在其生命期中的扩充,也同样需要稳定性。好地支持系统在其生命期中的扩充,也同样需要稳定性。下面介绍在面向对象设计过程中,可能对面向对象分析所得出的问下面介绍在面向对象设计过程中,可能对面向对象分析所得出的问题域模型作的补充或修改。题域模型作的补充或修改。1 1按照需求信息的最新变动调整并修改模型按照需求信息的最新变动调整并修改模型 有两种情况会导致修改通过面向对象分析所确定的系统需求:一是用有两种情况会导致修改通过面
30、向对象分析所确定的系统需求:一是用户需求或外部环境发生了变化;二是分析员对问题域理解不透彻或缺乏领域专户需求或外部环境发生了变化;二是分析员对问题域理解不透彻或缺乏领域专家帮助,以致面向对象分析模型不能完整、准确地反映用户的真实需求。家帮助,以致面向对象分析模型不能完整、准确地反映用户的真实需求。9.5.1 9.5.1 设计问题域子系统设计问题域子系统2022-5-24322 2调整和组合问题域中的类调整和组合问题域中的类 代码重用从设计阶段开始,在研究面向对象分析结果时就应该寻找使代码重用从设计阶段开始,在研究面向对象分析结果时就应该寻找使用已有类的方法。若因为没有合适的类可以重用而确实需要
31、创建新的类,则用已有类的方法。若因为没有合适的类可以重用而确实需要创建新的类,则在设计这些新类的协议时,必须考虑到将来的可重用性。在设计这些新类的协议时,必须考虑到将来的可重用性。 选择有可能被重用的已有类,标出这些候选类中对本问题无用的属性和服务,选择有可能被重用的已有类,标出这些候选类中对本问题无用的属性和服务,尽量重用那些能使无用的属性和服务降到最低程度的类尽量重用那些能使无用的属性和服务降到最低程度的类; 在被重用的已有类和问题域类之间添加归纳关系在被重用的已有类和问题域类之间添加归纳关系; 标出问题域类中从已有类继承来的属性和服务,现在已经无须在问题域类内标出问题域类中从已有类继承来
32、的属性和服务,现在已经无须在问题域类内定义它们了定义它们了; 修改与问题域类相关的关联,必要时改为与被重用的已有类相关的关联。修改与问题域类相关的关联,必要时改为与被重用的已有类相关的关联。9.5.1 9.5.1 设计问题域子系统设计问题域子系统2022-5-2433 3 3调整对象模型中的继承的支持级别调整对象模型中的继承的支持级别 在面向对象设计过程中,设计者往往通过引入一个根类而把问题域类组在面向对象设计过程中,设计者往往通过引入一个根类而把问题域类组合在一起。事实上,这是在没有更先进的组合机制可用时才采用的一种组合在一起。事实上,这是在没有更先进的组合机制可用时才采用的一种组合方法。合
33、方法。 4 4改进系统的性能改进系统的性能 在设计过程中常常发现,一些具体类需要有一个公共的协议,也就是说,在设计过程中常常发现,一些具体类需要有一个公共的协议,也就是说,它们都需要定义一组类似的服务(很可能还需要相应的属性)。在这种情它们都需要定义一组类似的服务(很可能还需要相应的属性)。在这种情况下可以引入一个附加类(例如,根类),以便建立这个协议(即命名公况下可以引入一个附加类(例如,根类),以便建立这个协议(即命名公共服务集合,这些服务在具体类中仔细定义)。共服务集合,这些服务在具体类中仔细定义)。9.5.1 9.5.1 设计问题域子系统设计问题域子系统2022-5-2434 5 5增
34、加底层细节增加底层细节 图图9-49-4所示描绘了第所示描绘了第7 7章给出的章给出的ATMATM系统的问题域子系统的结构。在系统的问题域子系统的结构。在面向对象设计过程中,我们把面向对象设计过程中,我们把ATMATM系统的问题域子系统,进一步划分成系统的问题域子系统,进一步划分成了了3 3个更小的子系统,它们分别是个更小的子系统,它们分别是ATMATM站子系统、中央计算机子系统和分站子系统、中央计算机子系统和分行计算机子系统。它们的拓扑结构为星形,以中央计算机为中心向外辐行计算机子系统。它们的拓扑结构为星形,以中央计算机为中心向外辐射,同所有射,同所有ATMATM站及分行计算机通信。物理连接
35、用专用电话线实现。站及分行计算机通信。物理连接用专用电话线实现。9.5.1 9.5.1 设计问题域子系统设计问题域子系统2022-5-2435图图9-4 ATM9-4 ATM系统问题域子系统的结构系统问题域子系统的结构9.5.1 9.5.1 设计问题域子系统设计问题域子系统2022-5-24369.5.2 9.5.2 设计人机交互子系统设计人机交互子系统在面向对象分析过程中,已经对用户界面需求作了初步在面向对象分析过程中,已经对用户界面需求作了初步分析。在面向对象设计过程中,则应该对系统的人分析。在面向对象设计过程中,则应该对系统的人机交互机交互子系统进行详细设计,以确定人子系统进行详细设计,
36、以确定人机交互的细节,其中包括机交互的细节,其中包括指定窗口和报表的形式、设计命令层次等项内容。指定窗口和报表的形式、设计命令层次等项内容。由于对人由于对人机界面的评价,在很大程度上由人的主观因机界面的评价,在很大程度上由人的主观因素决定,因此,使用由原型支持的系统化的设计策略,是成素决定,因此,使用由原型支持的系统化的设计策略,是成功地设计人功地设计人机交互子系统的关键。机交互子系统的关键。2022-5-2437n 1 1、设计人机交互界面的准则设计人机交互界面的准则 (1 1)一致性一致性 使用一致的术语,一致的步骤,一致的动作。使用一致的术语,一致的步骤,一致的动作。 (2 2)减少步骤
37、减少步骤 应使用户为做某件事情而需敲击键盘的次数、点按鼠标的次数、或者下应使用户为做某件事情而需敲击键盘的次数、点按鼠标的次数、或者下拉菜单的距离,都减至最少。还应使得技术水平不同的用户,为获得有意拉菜单的距离,都减至最少。还应使得技术水平不同的用户,为获得有意义的结果所需使用的时间都减至最少。特别应该为熟练用户提供简捷的操义的结果所需使用的时间都减至最少。特别应该为熟练用户提供简捷的操作方法(如热键)。作方法(如热键)。9.5.2 9.5.2 设计人机交互子系统设计人机交互子系统2022-5-2438 (3 3)及时提供反馈信息及时提供反馈信息 每当用户等待系统完成一项工作时,系统都应该向用
38、户提供有意义的、每当用户等待系统完成一项工作时,系统都应该向用户提供有意义的、及时的反馈信息,以便用户能够知道系统目前已经完成该项工作的多大及时的反馈信息,以便用户能够知道系统目前已经完成该项工作的多大比例。比例。 (4 4)提供撤销命令提供撤销命令 人在与系统交互的过程中难免会犯错误,因此,应该提供人在与系统交互的过程中难免会犯错误,因此,应该提供“撤销撤销(undoundo)”命令,以便用户及时撤销错误动作,消除错误动作造成的命令,以便用户及时撤销错误动作,消除错误动作造成的后果。后果。9.5.2 9.5.2 设计人机交互子系统设计人机交互子系统2022-5-2439 (5 5)无须记忆无
39、须记忆 不应该要求用户记住在某个窗口中显示的信息,然后再用到另一个不应该要求用户记住在某个窗口中显示的信息,然后再用到另一个窗口中,这是软件系统的责任而不是用户的任务。窗口中,这是软件系统的责任而不是用户的任务。 在设计人在设计人机交互部分时应该力求达到下述目标:用户在使用该系统机交互部分时应该力求达到下述目标:用户在使用该系统时用于思考人时用于思考人机交互方法所花费的时间减至最少,而用于做他实际机交互方法所花费的时间减至最少,而用于做他实际想做的工作所用的时间达到最大值。更理想的情况是,人想做的工作所用的时间达到最大值。更理想的情况是,人机交互界机交互界面能够增强用户的能力。面能够增强用户的
40、能力。9.5.2 9.5.2 设计人机交互子系统设计人机交互子系统2022-5-2440 (6 6)易学易学 人人机交互界面应该易学易用,应该提供联机参考资料,以便用户在机交互界面应该易学易用,应该提供联机参考资料,以便用户在遇到困难时可随时参阅。遇到困难时可随时参阅。 人人机交互界面不仅应该方便、高效,还应该使人在使用时感到心情愉机交互界面不仅应该方便、高效,还应该使人在使用时感到心情愉快,能够从中获得乐趣,从而吸引人去使用它。快,能够从中获得乐趣,从而吸引人去使用它。9.5.2 9.5.2 设计人机交互子系统设计人机交互子系统2022-5-2441n2 2 、设计人设计人机交互子系统的策略
41、机交互子系统的策略 (1 1)分类用户分类用户 人人机交互界面是给用户使用的。显然。为设计好人机交互界面是给用户使用的。显然。为设计好人机机交互子系统,设计者应该认真研究使用它的用户。应该深入到用户交互子系统,设计者应该认真研究使用它的用户。应该深入到用户的工作现场,仔细观察用户是怎样做他们的工作的,这对设计好的工作现场,仔细观察用户是怎样做他们的工作的,这对设计好人人机交互界面非常必要。机交互界面非常必要。 通常从下列几个不同角度进行分类。通常从下列几个不同角度进行分类。 按技能水平分类(新手按技能水平分类(新手/ /初级初级/ /中级中级/ /高级)。高级)。 按职务分类(总经理按职务分类
42、(总经理/ /经理经理/ /职员)。职员)。 按所属集团分类(职员按所属集团分类(职员/ /顾客)。顾客)。9.5.2 9.5.2 设计人机交互子系统设计人机交互子系统2022-5-2442 (2 2)描述用户描述用户 应该仔细了解将来使用系统的每类用户的情况,把获得的下列应该仔细了解将来使用系统的每类用户的情况,把获得的下列各项信息记录下来。各项信息记录下来。 用户类型。用户类型。 使用系统欲达到的目的。使用系统欲达到的目的。 特征(年龄、性别、受教育程度、使用系统的权限等)。特征(年龄、性别、受教育程度、使用系统的权限等)。 关键的成功因素(需求、爱好、习惯等)。关键的成功因素(需求、爱好
43、、习惯等)。 技能水平。技能水平。 完成本职工作的脚本。完成本职工作的脚本。9.5.2 9.5.2 设计人机交互子系统设计人机交互子系统2022-5-2443(3 3)设计命令层次设计命令层次1 1)研究现有的人)研究现有的人机交互含义和准则机交互含义和准则 现在的现在的WindowsWindows已经成了微机上图形用户界面事实上的工业标准,已经成了微机上图形用户界面事实上的工业标准,所有所有WindowsWindows应用程序的基本外观及给用户的感受都是相同的。应用程序的基本外观及给用户的感受都是相同的。WindowsWindows程序通常还遵守广大用户习以为常的许多约定。程序通常还遵守广大
44、用户习以为常的许多约定。 设计图形用户界面时,应该保持与普通设计图形用户界面时,应该保持与普通WindowsWindows应用程序界面相一应用程序界面相一致,并遵守广大用户习惯的约定,这样才会被用户接受和喜受。致,并遵守广大用户习惯的约定,这样才会被用户接受和喜受。9.5.2 9.5.2 设计人机交互子系统设计人机交互子系统2022-5-24442 2)确定初始的命令层次)确定初始的命令层次 所谓命令层次,实质上是使用过程抽象机制组织起来的、可供选用的服务所谓命令层次,实质上是使用过程抽象机制组织起来的、可供选用的服务的表示形式。设计命令层次时,通常先从对服务的过程抽象着手,然后再进一步的表示
45、形式。设计命令层次时,通常先从对服务的过程抽象着手,然后再进一步修改它们,以适合具体应用环境的需要。修改它们,以适合具体应用环境的需要。9.5.2 9.5.2 设计人机交互子系统设计人机交互子系统2022-5-24453 3)精化命令层次)精化命令层次从以下因素考虑来精华命令层次:从以下因素考虑来精华命令层次: 次序:仔细选择每个服务的名字,并在命令层的每一部分内把服次序:仔细选择每个服务的名字,并在命令层的每一部分内把服务排好次序。排序时或者把最常用的服务放在最前面,或者按照用户习务排好次序。排序时或者把最常用的服务放在最前面,或者按照用户习惯的工作步骤排序。惯的工作步骤排序。 整体整体部分
46、关系:寻找在这些服务中存在的整体部分关系:寻找在这些服务中存在的整体部分模式,这部分模式,这样做有助于在命令层中分组组织服务。样做有助于在命令层中分组组织服务。 宽度和深度:由于人的短期记忆能力有限,命令层次的宽度和深宽度和深度:由于人的短期记忆能力有限,命令层次的宽度和深度都不应该过大。度都不应该过大。 操作步骤:应该用尽量少的单击、拖动和击键组合来表达命令,操作步骤:应该用尽量少的单击、拖动和击键组合来表达命令,而且应该为高级用户提供简捷的操作方法。而且应该为高级用户提供简捷的操作方法。9.5.2 9.5.2 设计人机交互子系统设计人机交互子系统2022-5-2446 (4 4)设计人机交
47、互类设计人机交互类 人人机交互类与所使用的操作系统及编程语言密切相关,如在机交互类与所使用的操作系统及编程语言密切相关,如在WindowsWindows环境下运行的环境下运行的Visual C+Visual C+语言提供了语言提供了MFCMFC类库。设计类库。设计人人机交互类时,仅需从机交互类时,仅需从MFCMFC类库中选出一些适用的类,然后从类库中选出一些适用的类,然后从这些类派生出符合自己需要的类。这些类派生出符合自己需要的类。9.5.2 9.5.2 设计人机交互子系统设计人机交互子系统2022-5-24479.5.3 9.5.3 设计任务管理子系统设计任务管理子系统 1 1确定事件驱动型
48、任务确定事件驱动型任务 某些任务是由事件驱动的,这类任务可能主要完成通信工某些任务是由事件驱动的,这类任务可能主要完成通信工作作。这类任务的工作过程如下:任务处于睡眠状态(不消耗这类任务的工作过程如下:任务处于睡眠状态(不消耗处理器时间),等待来自数据线或其他数据源的中断;一旦处理器时间),等待来自数据线或其他数据源的中断;一旦接收到中断就唤醒了该任务,接收数据并把数据放入内存缓接收到中断就唤醒了该任务,接收数据并把数据放入内存缓冲区或其他目的地,通知需要知道这件事的对象,然后该任冲区或其他目的地,通知需要知道这件事的对象,然后该任务又回到睡眠状态。务又回到睡眠状态。2022-5-2448 2
49、 2确确定定时时钟钟驱驱动动型型任任务务 某某些些任任务务每每隔隔一一定定时时间间间间隔隔就就被被触触发发以以执执行行某某些些处处理。理。时时钟钟驱驱动动型型任任务务的的工工作作过过程程如如下:下:任任务务设设置置了了唤唤醒醒时时间间后后进进入入睡睡眠眠状状态;态;任任务务睡睡眠眠(不不消消耗耗处处理理器器时时间)间)等等待待来来自自系系统统的的中中断;断;一一旦旦接接收收到到这这种种中中断,断,任任务务就就被被唤唤醒醒并并做做它它的的工工作,作,通通知知有有关关的的对对象,象,然然后后该该任任务务又又回回到到睡睡眠眠状状态。态。9.5.3 9.5.3 设计任务管理子系统设计任务管理子系统20
50、22-5-2449 3 3确定优先任务确定优先任务和和关键任务关键任务 优先任务优先任务可以满足高优先级或低优先级的处理需求。可以满足高优先级或低优先级的处理需求。 高优先级:某些服务具有很高的优先级,为了在严格限定的时间内完成这高优先级:某些服务具有很高的优先级,为了在严格限定的时间内完成这种服务,可能需要把这类服务分离成独立的任务。种服务,可能需要把这类服务分离成独立的任务。 低优先级:与高优先级相反,有些服务是低优先级的,属于低优先级处理低优先级:与高优先级相反,有些服务是低优先级的,属于低优先级处理(通常指那些背景处理)。设计时可能用额外的任务把这样的处理分离出来。(通常指那些背景处理