转六篇:原型法和面向对象的分析与设计方法(4)

9.2.3 面向对象的设计方法

面向对象设计(OOD)是对面向对象分析产生的逻辑结果进行设计,从面向对象的分析转到面向对象的设计是一个累进的模型扩充过程。面向对象分析的各个层次(如对象、结构、主题、属性和服务)是对“问题空间”进行了模型化,而面向对象的设计则需要对一个特定的“实现空间”进行模型化,通过抽象、封装、继承性、消息通信、通用的组织法则、粒度和行为分类等途径控制设计的复杂性。OOD的基本目标是改进设计、增进软件生产效率、提高软件质量以及加强可维护性。

本节介绍面向对象设计系统模型和面向对象设计的主要过程。

1. OOD系统模型

下列面向对象设计模型是由Coad和Yourdon提出的。该模型由四个部分和五个层次组成。如下图9-10所示。

其四个组成部分是问题空间部件(Problem Domain Component, 简称PDC)、人机交互部件(Human Interaction Component, 简称HIC)、任务管理部件(Task Management Component, 简称TMC)和数据管理部件(Data Management Component, 简称DMC)。五个层次是主题层、对象层、结构层、属性层和服务层,这五个层次分别对应Coad的面向对象分析方法中的确定对象、确定结构、定义主题、定义属性、确定服务等行动。

这四个部件对应目标系统的四个子系统,在不同的软件中,这四个部件的大小和重要程度可能差异较大,可以根据需要做出进一步的合并和分解。PDC是针对总体进行的设计。HIC给出实现人机交互需要的对象。TMC提供协调和管理目标系统软件各个任务的对象。DMC定义专用对象。

OOD系统模型的基本思路是简单的,但很重要。它以OOA模型为设计模型的雏形,使用OOA模型中的类和对象,围绕着这些类和对象又加入了一些其他的类和对象,用来处理与现实有关的活动,如TMC、DMC和HIC。DMC将对象转换成数据库记录或表格;HIC将大量的精力放在窗口和屏幕设计上,以向用户提供友好的图形用户界面(GUI);TMC则结合每个任务单,给出了每个任务单实现的连接方式。而在传统的方法中,基本上废弃了分析模型,并以一个新的设计模型重新开始,这正是OOD方法的核心所在。OOD模型类似于构件蓝图,它以完整的形式全面定义了如何用特定的实现技术建立一个目标系统。

2. OOD设计

本小节介绍Coad和Yourdon方法的设计过程,也是OOD系统模型中的四个部件。

 (1) 问题论域部分的设计(PDC)

在面向对象设计中,面向对象分析(OOA)的结果恰好符合面向对象设计(OOD)的问题空间部分,因此,OOA的结果就是OOD部分模型中的一个完整部分。但是,为了解决一些特定设计所需要考虑的实际变化,可能要对OOA结果进行一些改进和增补。主要是根据需求的变化,对OOA产生模型中的某些类与对象、结构、属性、操作进行组合与分解。要考虑对时间与空间的折衷、内存管理、开发人员的变更、以及类的调整等。另外根据OOD的附加原则,增加必要的类、属性和关系。

① 复用设计:根据问题解决的需要,把从类库或其他来源得到的既存类增加到问题解决方案中去。既存类可以是用面向对象程序语言编写出来的,也可以是用其他语言编写出来的可用程序。要求标明既存类中不需要的属性和操作,把无用的部分维持到最小限度。并且增加从既存类到应用类之间的泛化-特化的关系。进一步地,把应用中因继承既存类而成为多余的属性和操作标出。还要修改应用类的结构和连接,必要时把它们变成可复用的既存类。

② 把问题论域相关的类关联起来:在设计时,从类库中引进一个根类,做为包容类,把所有与问题论域有关的类关联到一起,建立类的层次。把同一问题论域的一些类集合起来,存于类库中。

③ 加入一般化类以建立类间协议:有时,某些特殊类要求一组类似的服务。在这种情况下,应加入一个一般化的类,定义为所有这些特殊类共用的一组服务名,这些服务都是虚函数。在特殊类中定义其实现。

调整继承支持级别:在OOA阶段建立的对象模型中可能包括有多继承关系,但实现时使用的程序设计语言可能只有单继承,甚至没有继承机制,这样就需对分析的结果进行修改。可通过对把特殊类的对象看做是一个一般类对象所扮演的角色,通过实例连接把多继承的层次结构转换为单继承的层次结构;把多继承的层次结构平铺,成为单继承的层次结构等方法。

⑤ 改进性能

提高执行效率和速度是系统设计的主要指标之一。有时,必须改变问题论域的结构以提高效率。如果类之间经常需要传送大量消息,可合并相关的类以减少消息传递引起的速度损失。增加某些属性到原来的类中,或增加低层的类,以保存暂时结果,避免每次都要重复计算造成速度损失。

⑥ 加入较低层的构件

在做面向对象分析时,分析员往往专注于较高层的类和对象,避免考虑太多低层的实现细节。但在做面向对象设计时,设计师在找出高层的类和对象时,必须考虑到底需要用到哪些较低层的类和对象。

(2) 人机交互部分的设计(HIC)

通常在OOA阶段给出了所需的属性和操作,在设计阶段必须根据需求把交互的细节加入到用户界面的设计中,包括有效的人机交互所必需的实际显式和输入。如WindowsPaneSelector等。人机交互部分的设计决策影响到人的感情和精神感受,设计HIC的策略由以下几点构成:用户分类;描述人及其任务的脚本;设计命令层;设计详细的交互;继续做原型;设计HIC类;根据图形用户界面(GUI)进行设计。

用户分类

进行用户分类的目的是明确使用对象,针对不同的使用对象设计不同的用户界面,以适合不同用户的需要。分类的原则有:

按技能层次分类:外行/初学者/熟练者/专家;

按组织层次分类:行政人员/管理人员/专业技术人员/其他办事员;

按职能分类:顾客/职员。

描述人及其任务脚本

对以上定义的每一类人,描述其身份、目的、特征、关键的成功因素、熟练程度及任务剧本。例如,在 有一个例子:

什么人:分析员

目的:要求一个工具来辅助分析工作(摆脱繁重的画图和检查图的工作)。

特点:年龄=42岁;教育水平=大学;限制=不要微型打印。

成功的关键因素:工具应当使分析工作顺利进行;工具不应与分析工作冲突;工具应能捕获假设和思想,能适时做出折衷;应能及时给出模型各个部分的文档,这与给出需求同等重要。

熟练程度:专家。

任务脚本:主脚本-识别“核心的”类和对象;识别“核心”结构;在发现了新的属性或操作时随时都可以加进模型中去。检验模型-打印模型及其全部文档。

设计命令层

研究现行的人机交互活动的内容和准则,建立一个初始的命令层,再细化命令层:这时,要考虑:排列命令层次,把使用最频繁的操作放在前面,按照用户工作步骤排列;通过逐步分解,找到整体-部分模式,帮助在命令层中对操作进行分块;根据人们短期记忆的“ ”或“每次记忆3/每块3项”的特点,组织命令层中的服务,宽度与深度不宜太大,减少操作步骤。

设计详细的交互

用户界面设计有若干原则,一般有:一致性,操作步骤少,不要“哑播放”:即每当用户等待系统完成一个活动时,要给出一些反馈信息,说明工作正在进展,以及进展的程度。:在操作出现错误时,要恢复或部分恢复原来的状态。提供联机的帮助信息。并具有趣味性,在外观和感受上,尽量采用图形界面,符合人类习惯,有一定吸引力。

继续做原型

做人机交互原型是HIC设计的基本工作,界面应使人花最少的时间去掌握其使用技法,做几个可候选的原型,让人们一个一个地试用,要达到“臻于完善”,由衷地满意。

设计HIC

设计HIC类,从组织窗口和部件地人机交互设计开始,窗口作基本类、部件作属性或部分类。特殊窗口作特殊类。每个类包括窗口的菜单条、下拉菜单、弹出菜单的定义,每个类还定义了用来创造菜单、加亮选择等所需的服务。

根据GUI(图形用户界面)进行设计

图形用户界面区分为字型、坐标系统和事件。图形用户界面的字型是字体、字号、样式和颜色的组合。坐标系统主要因素有原点(基准点)、显式分辨率、显示维数等。事件则是图形用户界面程序的核心,操作将对事件做出响应,这些事件可能是来自人的,也可能是来自其他操作的。事件的工作方式有两种:直接方式和排队方式。所谓直接方式,是指每个窗口中的项目有它自己的事件处理程序,一旦事件发生,则系统自动执行相应的事件处理程序。所谓排队方式,是指当事件发生时系统把它排到队列中,每个事件可用一些子程序信息来激发。应用可利用“next event”来得到一个事件并执行它所需要的一切活动。

主要的GUI包括MacintoshWindowsPresentation ManagerX.WindowsMotif.

(3) 任务管理部分的设计TMC)

OOD中,任务是指系统为了达到某一设定目标而进行的一连串的数据操作(或服务),若干任务的并发执行叫做多任务。任务能简化并发行为的设计和编码,TMC的设计就是针对任务项,对一连串的数据操作进行定义和封装,对于多任务要确定任务协调部分,以达到系统在运行中对各项任务进行合理组织与管理。

TMC设计策略

.识别事件驱动任务。  事件驱动任务是指睡眠任务(不占用CPU),当某个事件发生时,任务被此事件触发,任务醒来做相应处理,然后又回到睡眠状态。

.识别时钟驱动任务。按特定的时间间隔去触发任务进行处理,如某些设备需要周期性的数据采集和控制。

.识别优先任务和关键任务。把它们分离开来进行细致的设计和编码,保证时间约束或安全性。

.识别协调者。增加一个任务来协调诸任务,这个任务可以封装任务之间的协作。

.审查每个任务,使任务数尽可能少。

.定义每个任务:包括任务名、驱动方式、触发该任务的事件、时间间隔、如何通信等。

设计步骤

.对类和对象进行细化,建立系统的OOA/OOD工作表格。OOA/OOD工作表格包括:某系统可选定的对象的条目,对该对象在OOD部件中位置的说明和注释等。

.审查OOA/OOD工作表格,寻找可能被封装在TM中那些与特定平台有关的部分以及任务协调部分、通信的从属关系、消息、线程序列等。

.构建新的类。TM部件设计的首要任务就是构建一些新的类,这些类建立的主要目的是处理并发执行、中断、调度以及特定平台有关的一些问题。

任务管理部件一般在信息系统中使用较少,在控制系统中应用较多。

(4) 数据管理部分的设计(DMC)

数据管理部分提供了在数据管理系统中存储和检索对象的基本结构,包括对永久性数据的访问和管理。它分离了数据管理机构所关心的事项,包括文件、关系型DBMS或面向对象DBMS等。

① 数据管理方法

数据管理方法主要有3种:文件管理、关系数据库管理和面向对象库数据管理。

.文件管理:提供基本的文件处理能力。

.关系数据库管理系统(RDBMS):关系数据库管理系统建立在关系理论的基础上,它使用若干表格来管理数据,使用特定操作,如select(提取某些行)、project(提取某些栏)、join(联结不同表格中的行,再提取某些行)等,可对表格进行剪切和粘贴。通常根据规范化的要求,可对表格和它们的各栏重新组织,以减少数据冗余,保证修改一致性数据不致出错。

.面向对象数据库管理系统(OODBMS):通常,面向对象的数据库管理系统以两种方法实现:一是扩充的RDBMS,二是扩充的面向对象程序设计语言(OOPL)。

扩充的RDBMS主要对RDBMS扩充了抽象数据类型和继承性,再加上一些一般用途的操作来创建和操纵类与对象。扩充的OOPL对面向对象程序设计语言嵌入了在数据库中长期管理存储对象的语法和功能。这样,可以统一管理程序中的数据结构和存储的数据结构,为用户提供了一个统一视图,无需在它们之间做数据转换。

② 数据管理部分的设计

数据存储管理部分的设计包括数据存放方法的设计和相应操作的设计。

.数据存放设计

数据存放有三种形式:文件存放方式、关系数据库存放方式和面向对象数据库存放方式,根据具体情况选用。

.设计相应的操作

为每个需要存储的对象及其类增加用于存储管理的属性和操作,在类及对象的定义中加以描述。通过定义,每个需要存储的对象将知道如何“存储我自己”。

9.2.4 面向对象的实施方法

这一阶段主要是将OOD中得到的模型利用程序设计实现。具体操作包括:选择程序设计语言编程、调试、试运行等等。前面两阶段得到的对象及其关系最终必须由程序语言、数据库等技术实现,但由于在设计阶段对此有所侧重考虑,故系统实现不会受具体语言的制约,因而本阶段占整个开发周期的比重较小。

一般建议应尽可能采用面向对象程序设计语言,一方面由于面向对象技术日趋成熟,支持这种技术的语言已成为程序设计语言的主流;另一方面,选用面向对象语言能够更容易,安全和有效地利用面向对象机制,更好地实现OOD阶段所选的模型。

1. 程序设计语言选择

详细的面向对象设计是与语言有关的。这样,可以有效地为过程型语言、面向软件包的语言、面向对象的语言所用。

一般地,所有的语言都可以完成面向对象实现,但某些语言能够提供更丰富的语法,能够显式地描绘在面向对象分析和面向对象设计过程中所使用的表示法。

(1) 面向对象设计与过程型语言

过程型语言,如C、Pascal、FORTRAN、COBOL,只直接支持过程抽象,但可以增加数据抽象及封装(如利用结构化设计的信息隐蔽模块)。虽然某些公共部分可以作为单独的子程序,但无法明确地表示继承性。也无法明确支持整体与部分、类与成员、对象与属性等关系。也许,面向过程型语言的面向对象设计尽管在技术上不令人满意,但它确实还是能成为一种实用的且可行的方法:从面向对象分析,到面向对象设计,再到具有面向对象特性的过程型语言。

(2) 面向对象设计与基于对象的语言

基于对象的语言,也叫做面向软件包的语言,如Ada等,能够直接支持过程抽象、数据抽象、封装和对象与属性关系。也许,基于对象语言的面向对象设计比较符合人的习惯,它代表着一种可行的开发方法:从面向对象分析,到面向对象设计,再到具有面向对象特性的基于对象的语言。

(3) 面向对象设计与面向对象的程序设计语言

面向对象的程序设计语言,包括C++,Smalltalk,Actor,Objective-C,Eiffel等,都直接支持过程抽象、数据抽象、封装、继承、以及对象与属性、类与成员关系。

(4) 面向对象设计与面向对象数据库语言(OO-DBL)

面向对象数据库管理系统(OO-DBMS)及其语言(OO-DBL),是面向对象程序设计语言(OOPL)与数据管理能力的组合。OO-DBMS有两种不同的体系结构:

l         大属性:扩充关系型DBMS,使容纳大属性,如一个文档。

l         松散耦合:一个OOPL与大量的DBMS组合在一起。

l         紧密耦合:一个OOPL与某个专用的DBMS集成为一个系统。

l         扩充关系型:扩充关系型DBMS,使容纳“过程”之类的属性。

紧密耦合体系结构在程序设计和数据操纵中使用了同一种语言,它更能显式地表达面向对象分析和面向对象设计的语义。

2. 面向对象实施的过程和活动

在面向对象方法中,系统的实施是一个渐进的过程,通过对系统分析设计模型的不断更新和改进,实现按产品发布序列确定的一系列发布版本,最终实现可交付系统。

通过渐进的而不是一次成型的开发方法,我们可以发现哪些约束是真正重要的,哪些约束只是设计者假想的。由于这个原因,渐进实施的重点首先是完成的功能设计,然后是改善局部性能。

渐进实施本质上是一个产品开发过程。这种渐进开发过程可以带来以下一些好处:能够在最需要地时候给用户提供重要地反馈信息;用户可以使用几个不同的框架系统视图从而把老系统平滑地转换成新系统;如果项目的进展延期,不大可能因开发速度要求而削减项目内容,从而保证系统功能满足用户的实际需求;系统的主要界面首先并且经常得到测试检验。系统开发者可以从运行的原型系统看到早期结果,从而鼓舞士气。

渐进实施阶段的主要活动有两个,即微过程的应用与更改管理。

(1)       微过程的应用

两个可实施的版本发布之间的工作过程代表了简化的开发过程,它构成了整个微过程工作的一个“螺旋”。这个活动由对下个版本发布的需求分析开始,经过结构设计,最终发明实施这个设计所需要的类和对象。整个活动典型的工作顺序如下:

1确定这个可实施版本发布所必须满足的功能特征,找到风险最大的领域,尤其使通过对前一个版本的分析发现高风险领域。

2分配任务到设计实施组,启动微过程的一个新“螺旋”。通过以下两个方法来监控微过程:建立合适的微过程评审方法,设置阶段检查目标;以几天或一两周为周期检验并管理开发工作。

3如果需要了解系统期望行为的语义,则可以开发系统行为原型,并为每个行为原型建立清晰的目标和完成检验准则。在行为原型开发完成后,确定一个集成这些原型结果到本次和随后版本发布的方法。

4通过集成和发布可实施版本的方法强制微过程收敛到一个阶段成果上。

(2)       系统模型更改管理

在每个版本发布后,重新检查原来的版本发布计划并根据需要调整随后的发布版本计划与进度。更改管理起源于面向对象系统本质上的渐进和迭代行为。在迭代过程中,通常会发生增加一个新类或新的类协作关系、改变类的实现方法、改变类的表示、重新组织类结构、改变类的接口等,需要对更改过程进行有效的管理,每个改变都有不同的理由,也同样需要付出不同的代价,对系统关键结构进行重大的改变具有最大风险,通过更改管理,分析变更原因风险,加强对系统可实施版本和系统原型的管理和控制,提高系统实施的效率。

在开发过程的早期阶段,主要的可实施版本是由开发组交付给质量保证人员,质量保证人员针对分析阶段提供的场景对它的完全性、正确性进行检验。在开发过程的后期,发布的版本以受控的方式交付给一组选取的最终用户(Alpha和Beta版用户)。所谓受控的方式是指开发组仔细地设定了他们对每个版本的预期成果,并且确定了需要评价的行为。

文档通常是伴随着系统的演进而不断更新。最好的方式是使文档成为渐进实施过程中一种自然的和半自动生成的产物。

3. 面向对象实施的完成指标和交付文档

在产品发布版本的功能和质量(功能、时间、预算)都足以达到可移交到下一个版本的程度时,我们就可以成功地结束系统实施阶段的工作。产品发布版本中间的可实施版本是实现最终产品的开发过程中的主要里程碑。评价本阶段结果好坏程度的标准是用户对分配到每个中间可实施版本上去实现的功能特征的最终满意程度,以及用户需求与系统开发开始时制定的版本发布计划的符合程度。

另外两个基本的检测准测是错误发现追踪速率和结构接口与通用策略的修改率。

系统实施阶段完成后形成的可交付的文档包括:

经过完善后,根据系统模型生成的系统设计文档。

系统实现文档(源码、说明等)。

系统测试报告。

9.2.5 小结

    在面向对象方法中,直接从问题空间映射到模型。对象抽象了问题空间中的事物,使得我们对问题空间的理解更直接、更准确、更快和更容易,减少了语义差异和转换,而且另一个相似的项目可以重用分析的结果,重用以前的一些类和对象。

面向对象方法在可重用性、系统可维护性和可理解性方面有着突出的优势,利用特定的软件工具直接完成从对象客体的描述到软件结构之间的转换,这是OO方法最主要的特点和成就。OO方法的应用解决了传统结构化开发方法中客观世界描述工具与软件结构的不一致性问题,缩短了开发周期,解决了从分析和设计等到软件模块结构之间多次转换映射的繁杂过程,是一种很有发展前途的系统开发方法。

OO方法也存在不足或局限。它对系统分析员的要求更高,前期的工作量更为艰巨。而最终用户直接参与也较为困难,因为每个使用者一般只熟悉自己的日常工作流程,对于系统中的对象没有总体把握,采用面向过程或面向数据的方法对于他们来讲反而更为直接,因此面向对象方法也要求参与用户最好是问题域专家,而不仅仅是使用者。此外,从分析到设计再到实现的平滑过渡过程使得系统开发的阶段性不是那么明显,如何能更好地对不同阶段地成果进行界定和验收,也是为保证软件质量所要解决的一个问题。

   同原型方法一样,OO方法需要一定的软件基础支持才可以应用,另外在大型的MIS开发中如果不经自顶向下的整体划分,而是一开始就自底向上的采用OO方法开发系统,同样也会造成系统结构不合理、各部分关系失调等等问题。所以OO方法和结构化方法目前仍是两种在系统开发领域相互依存的、不可替代的方法。

关键词:

对象 object

属性  attribute 

  class 

方法 method

封装 encapsulation 

继承 inheritance 

实例 instance 

消息 message  

多态性 polymorphism 

用例  use case 

思考题:

1、   软件危机的表现是什么?有哪些解决途径?

2、   生命周期法的基本原理是什么,它存在哪些缺陷?最主要的缺陷是什么?

3、   原型的定义、分类。

4、   原型法的基本思想是什么?

5、   在信息系统分析与设计的过程中,生命周期法需求定义的前提条件是什么?把它与原型法的开发策略的假设相比较。

6、   软件原型的特征是什么?

7、   说出原型法的工作步骤,在每一步中开发者和用户的责任(工作)分别是什么以及应遵循什么原则?

8、   原型法开发系统的特点是什么?它的局限性又在哪里?

9、   原型法对环境的要求是什么?

10、在信息系统分析与设计的过程中使用原型法时要注意哪些问题?

11、利用图表来比较生命周期法和原型法的优点和缺点,以及它们在开发路径、用户参与程度、规范化、早期可测试性、对环境的适应性、开发自动化程度、开发周期、开发技术管理和系统质量方面都有哪些不同。

12、  面向对象方法的主要特点是什么?抽象的概念在面向对象方法中有什么重要意义?

13、  定义对象和类,并举例说明。

14、  Coad&Yourdon的方法为基础,试述面向对象系统开发的过程。

15、试比较面向对象开发方法同传统方法的区别。

参考文献:

1 葛世伦,代逸生,《企业管理信息系统开发的理论和方法》,清华出版社,1996年(中文著作)

2 姜同强,《信息系统分析与设计教程》,科学出版社,2004年(中文著作)

3 刘永,毛奕,张翠英,常金玲,《信息系统分析与设计》,科学出版社,2002年(中文著作)

4 耿继秀,《创建企业计算机信息系统的工程》,清华出版社,1998年(中文著作)

5.左美云,邝孔武主编,《信息系统的开发与管理教程》,清华大学出版社,2001

6.朱顺泉,姜灵敏编著,《管理信息系统理论与实务(修订版)》,人民邮电出版社,2004

7.姜旭平编著,《信息系统开发方法――方法、策略、技术、工具与发展》,清华大学出版社,1997

8.Jeffrey L.Whitten,Lonnie D.Bentley,Kevin C.Dittman著,肖刚,孙慧等译,《系统分析与设计方法》,机械工业出版社,2003

9.郑人杰主编,《软件工程(中级)》,清华大学出版社,1999

10.邝孔武,王晓敏编著,《信息系统分析与设计(第二版)》,清华大学出版社,2002

11.汪成为,郑小军,彭木昌著,《面向对象分析、设计及应用》,国防工业出版社,1992

12.范玉顺,曹军威编著,《复杂系统的面向对象建模、分析与设计》,清华大学出版社,施普林格出版社,2000

13.何有世,刘秋生编著,《管理信息系统》,东南大学出版社,2003

posted on 2006年7月19日 12:43 由 dongwei

Comments