购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

4.5 面向对象设计

与结构化方法不同,面向对象的方法并不强调分析与设计之间严格的阶段划分。因为OOA与OOD所采用的概念、原则和表示法都是一致的,二者之间不存在鸿沟,不需要从分析文档到设计文档的转换,所以有些工作无论在分析时进行还是在设计时进行都不存在障碍。当然,OOA与OOD仍然有不同的分工和侧重点。

关于OOA与OOD的关系,目前有两种不同的观点。

一种观点是继续沿用传统的分工——分析着眼于系统“做什么”,设计解决“怎么做”的问题。而Peter Coad和Edward Yourdon的OOA&D方法则采用了另外一种分工方式——分析阶段只考虑问题域和系统责任,建立一个独立于实现的OOA模型;设计阶段考虑与实现有关的因素,对OOA模型进行调整并补充与实现有关的部分,形成OOD模型。

4.5.1 Coad/Yourdon方法

Coad/Yourdon方法严格区分了面向对象分析OOA和面向对象设计OOD。该方法利用五个层次和活动定义和记录系统行为输入和输出。这五个层次的活动包括:

(1)发现类及对象。 描述如何发现类及对象。从应用领域开始识别类及对象,形成整个应用的基础,然后,据此分析系统的责任。

(2)识别结构。 该阶段分为两个步骤。第一,识别一般-特殊结构,该结构捕获了识别出的类的层次结构;第二,识别整体-部分结构,该结构用来表示一个对象如何成为另一个对象的一部分,以及多个对象如何组装成更大的对象。

(3)定义主题。 主题由一组类及对象组成,用于将类及对象模型划分为更大的单位,便于理解。

(4)定义属性。 其中包括定义类的实例(对象)之间的实例连接。

(5)定义服务。 其中包括定义对象之间的消息连接。

在面向对象分析阶段,经过五个层次的活动后的结果是一个分成五个层次的问题域模型,包括主题、类及对象、结构、属性和服务五个层次,由类及对象图表示。5个层次活动的顺序并不重要。

面向对象设计模型需要进一步区分以下4个部分。

1.问题域的设计

问题域部分的设计是任何OOD方法都必须完成的工作,它主要是对OOA结果进行改进和精化,并将其由问题域转化到解域,具体来说,有以下几个方面。

(1)属性: 由于有些属性在分析阶段有助于问题的理解,而到了设计阶段则可以由其他属性导出或根本没必要保留。因此,应将去掉它们。相反地,为了实现服务算法还需要增加相应的一些属性。

(2)服务: OOA只给出了服务的接口,其具体实现算法要在OOD阶段完成。

(3)类及对象: 在OOA阶段有助于问题理解的一些类在OOD阶段成为冗余,需要删除,而为了优化调整继承关系还要增加一些类。所有的类都确定以后还要明确哪些类的对象会引发哪些类创建新对象。

(4)结构: 对类间结构进行优化调整。

(5)对象行为: 明确对象间消息传递的实现算法,依据动态模型确定对象间消息发送的先后顺序,并设计相应算法,协调对象的行为。

2.人-机交互界面的设计

有些设计方法并没有提到交互界面的设计,一方面是因为这些系统中交互界面不十分重要;另一方面是因为这部分的设计很有规律,设计方法也比较成熟,但为完整起见,仍将其列出。主要工作包括。

(1)交互界面子系统的设计: 与界面有关的类及类间结构的设计,以及有关算法的设计。

(2)交互界面子系统和应用之间接口的设计。

3.应用控制的设计

这部分对象主要完成应用的驱动工作。这部分对象不同于从现实世界中抽象出来的对象,在现实世界和问题域中没有原型,它们同界面子系统中的对象及问题对象发生作用,控制系统的运行。

4.与问题领域有关的设计

一些系统具有与应用领域有关的特点,如多任务、分布式计算等,该项工作主要是针对这些特点完成相应设计的。

4.5.2 Booch方法

动态逻辑模型描述对象之间的互相作用。互相作用通过一组协同的对象,对象之间消息有序的序列,参与对象的可见性定义,定义系统运行时的行为。Booch方法中的对象交互作用图被用来描述重要的互相作用,显示参与的对象和对象之间按时间排序的消息。可见性图用来描述互相作用中对象的可见性。对象的可见性定义了一个对象如何处于向它发送消息的方法的作用域之中。例如,它可以是方法的参数、局部变量、新的对象或当前执行方法的对象的部分。静态物理模型通过模块描述代码的布局。动态物理模型描述软件的进程和线程体系结构。

Booch方法的过程包括以下步骤:

(1)在给定的抽象层次上识别类和对象;

(2)识别这些对象和类的语义;

(3)识别这些类和对象之间的关系;

(4)实现类和对象。

这四种活动不仅仅是一个简单的步骤序列,而是对系统的逻辑和物理视图不断细化的迭代和渐增的开发过程。

类和对象的识别包括找出问题空间中关键的抽象和产生动态行为的重要机制。开发人员可以通过研究问题域的术语发现关键的抽象。语义的识别主要是建立前一阶段识别出的类和对象的含义。开发人员确定类的行为(即方法)和类及对象之间的互相作用(即行为的规范描述)。该阶段利用状态转移图描述对象的状态的模型,利用时态图(系统中的时态约束)和对象图(对象之间的互相作用)描述行为模型。

在关系识别阶段描述静态和动态关系模型。这些关系包括使用、实例化、继承、关联和聚集等。类和对象之间的可见性也在此时确定。

在类和对象的实现阶段要考虑如何用选定的编程语言实现,如何将类和对象组织成模块。

在面向对象的设计方法中,Booch强调基于类和对象的系统逻辑视图与基于模块和进程的系统物理视图之间的区别。他还区别了系统的静态和动态模型。然而,他的方法偏向于系统的静态描述,对动态描述支持较少。

Booch方法的力量在于其丰富的符号体系,包括:

(1)类图(类结构-静态视图);

(2)对象图(对象结构-静态视图);

(3)状态转移图(类结构-动态视图);

(4)时态图(对象结构-动态视图);

(5)模块图(模块体系结构);

(6)进程图(进程体系结构)。

用于类和对象建模的符号体系使用注释和不同的图符(如不同的箭头)表达详细的信息。Booch建议在设计的初期可以用符号体系的一个子集,随后不断添加细节。对每一个符号体系还有一个文本的形式,由每一个主要结构的描述模板组成。符号体系由大量的图符定义,但是,其语法和语义并没有严格的定义。

4.5.3 OMT方法

Rumbaugh的OMT方法从三个视角描述系统,相应地提供了三种模型,对象模型,动态模型和功能模型。对象模型描述对象的静态结构和它们之间的关系。主要的概念包括:

(1)类;

(2)属性;

(3)操作;

(4)继承;

(5)关联(即关系);

(6)聚集。

动态模型描述系统那些随时间变化的方面,其主要概念有:

(1)状态;

(2)子状态和超状态;

(3)事件;

(4)行为;

(5)活动。

功能模型描述系统内部数据值的转换,其主要概念有:

(1)加工;

(2)数据存储;

(3)数据流;

(4)控制流;

(5)角色(源/潭)。

OMT方法将开发过程分为4个阶段:

1.分析

基于问题和用户需求的描述,建立现实世界的模型。分析阶段的产物有:

(1)问题描述;

(2)对象模型=对象图+数据词典;

(3)动态模型=状态图+全局事件流图;

(4)功能模型=数据流图+约束。

2.系统设计

结合问题域的知识和目标系统的体系结构(求解域),将目标系统分解为子系统。

3.对象设计

基于分析模型和求解域中的体系结构等添加的实现细节,完成系统设计。主要产物包括:

(1)细化的对象模型;

(2)细化的动态模型;

(3)细化的功能模型。

4.实现

将设计转换为特定的编程语言或硬件,同时保持可追踪性、灵活性和可扩展性。

4.5.4 Jacobson方法

Jacobson方法与上述3种方法有所不同,它涉及整个软件生命周期,包括需求分析、设计、实现和测试等四个阶段。需求分析和设计密切相关。需求分析阶段的活动包括定义潜在的角色(角色指使用系统的人和与系统互相作用的软、硬件环境),识别问题域中的对象和关系,基于需求规范说明和角色的需要发现用例,详细描述用例。设计阶段包括两个主要活动,从需求分析模型中发现设计对象,以及针对实现环境调整设计模型。第一个活动包括从用例的描述发现设计对象,并描述对象的属性、行为和关联。在这里还要把用例的行为分派给对象。

在需求分析阶段的识别领域对象和关系的活动中,开发人员识别类、属性和关系。关系包括继承、熟悉(关联)、组成(聚集)和通信关联。定义用例的活动和识别设计对象的活动,两个活动共同完成行为的描述。Jacobson方法还将对象区分为语义对象(领域对象)、界面对象(如用户界面对象)和控制对象(处理界面对象和领域对象之间的控制)。

在该方法中的一个关键概念就是用例。用例是指行为相关的事务(transaction)序列,该序列将由用户在与系统对话中执行。每一个用例就是一个使用系统的方式,当用户给定一个输入,就执行一个用例的实例并引发执行属于该用例的一个事务。基于这种系统视图,Jacobson将用例模型与其他5种系统模型关联:

(1)领域对象模型。 用例模型根据领域来表示;

(2)分析模型。 用例模型通过分析来构造;

(3)设计模型。 用例模型通过设计来具体化;

(4)实现模型。 该模型依据具体化的设计来实现用例模型;

(5)测试模型。 用来测试具体化的用例模型。

OOD详细设计阶段应该注意属性、消息和服务的如下特性和问题。

(1)是类属性(所有同类对象的共同特征)还是实例属性?

(2)该属性对实例是常数性的还是参数性的? 在物资类的一个实例中,编码等是常数,而仓位、储量等是参数。常数在实例构造时确定,而参数在实例构造时最多可以有默认值,在系统运行时可以被改变。

(3)服务是主动还是被动的? 若业务规则决定对所有预定代码的物资必须进行质检,则自动请求质检服务就也可能是主动服务。而系统如果要求质检请求经过库房管理用户发出,则物资类的“请求质检”服务就是被动服务了。

(4)是对内还是对外服务? 对内服务是对实例本身的属性的操作,对外服务是对其他实例或系统发出消息或操作其他类实例的属性。

(5)消息的分析对OOA的企业经营模型有特别意义。 因为消息是对象间动态关系的要素,也是信息隐蔽的重要手段。在顺序系统中,消息是向其他对象或系统发出的服务请求,在并行系统中消息表述为对象之间在一次交互中所传递的信息。在C/S结构的系统中,客户端向服务器请求数据属于并行的线程之间的消息,而在单机数据库系统中的用户请求数据,则一般是顺序执行的线程内的消息。接受消息的对象是什么?请求的是什么服务?消息发送者是否要与接收者同步?消息是定向的还是广播的?接收消息者如何处理消息?发送者如何对待消息处理的结果?发出消息的条件是什么?消息是在线程之间还是线程内部传递?

(6)属性、服务的性质是公共的、保护的还是私有的? 这些特性的设置对封装性能影响很大,应该考虑全面和一致。应用面向对象的分析、设计方法时还要求考虑类、对象之间的关系和联系。类和对象间有:整体-部分,一般-特殊关系,以及实例连接、消息连接等联系。

多元连接使系统分析和设计复杂。可以采用增加类的方法解决。例如“出版计划-编辑-图书”这样的三元关联的语意为某编辑在某出版计划中负责某图书,增加图书项目组成员类。

扩充的OOA模型包括用例图和交互图,它们是在类图基本完成的基础上建立的。对企业信息系统应用而言,用例就是一个用户或一个活动者与系统进行交互的一个过程的描述,是一个用类似自然语言的语言或伪代码表述的语序,近似于功能模块描述,包含与系统责任有关的企业经营规则描述的信息化版本。用例所指的一个交互过程应该是原子过程。而活动者就是指系统外与系统交互作用的事物,活动者可能不是类图中的类、对象。在出版社系统中,“编辑”作为人员不是待实现的对象,而是要和系统进行交互的一种事物。总之,活动者是要与系统交互的事物,而其本身不是系统成分,即使可能有与活动者同名的类在类图中。

附于类图的一个重要文档是详细说明,它包含了属性、服务、消息、联系等成分的准确语意。 /iYQkiGT+3Udd6kyzz2Fc+zHXchcooEW/wp/nBlK6DgLjyHjHKJLoU3eJlB2XtWV

点击中间区域
呼出菜单
上一章
目录
下一章
×