1
 软件工程
1.9.1.4 7.1.4 建立动态模型

7.1.4 建立动态模型

建立对象模型后,就需要考察对象和关系的动态变化情况。面向对象分析设定对象和关系都具有生存周期。生存周期由许多阶段组成,每个阶段都有一系列的运行规律和规则,这些规律和规则用于调节和管理对象的行为。对象和关系的生存周期由动态模型来描述。模型描述对象和关系的状态、状态转换的触发事件,以及对象的服务(行为)。

(1)状态:对象在其生存周期中的某个特定阶段所具有的行为模式。

状态是对影响对象行为的属性值的一种抽象。状态规定了对象对输入事件的响应方式。对象对输入事件的响应,既可以做一个或一系列的动作,也可以仅仅改变对象本身的状态。

(2)事件:事件是引起对象状态转换的控制信息。

事件是某个特定时刻所发生的事情,是引起对象从一种状态转换到另一种状态的事情的抽象。事件没有持续时间,是瞬间完成的。

(3)服务:也称为行为,是对象在某种状态下所发生的一系列处理操作。行为是需要消耗时间的。

建立动态模型首先编写脚本,从脚本中提取事件,画出UML图的顺序图(也称为事件跟踪图),再画出对象的状态转换图。

1.编写脚本

当系统与用户交互时,为了对目标系统的行为有更具体的认识,常用脚本表示系统的行为。脚本描述用户(或其他外部设备)与目标系统之间的一个或多个典型的交互过程,利用脚本来建立动态模型。在建立动态模型的过程中,为了确保整个交互过程的正确性和清晰性,不遗漏重要的交互步骤,首先要编写脚本,为建立动态模型奠定基础。

脚本是事件序列,当系统中的对象与外部用户交换信息时,就产生一个事件,所互换的信息值就是该事件的参数。对于事件来说,确定触发事件的动作对象和该事件的参数是非常重要的。

有时,在需求陈述中已经描写了完整的交互过程,但还需要花很大精力去构思交互的形式。例如,教务信息管理系统的需求陈述虽然表明了账号需要管理,但是没有详细说明用户注册、修改密码等行为的具体过程。因此,编写脚本的过程,是分析用户对系统交互行为的需求的过程,需要用户参与、提出意见,并审查和更改。

首先,编写正常情况的脚本。然后,考虑特殊情况的脚本,如输入/输出的数据的值域。最后,考虑用户出错情况的脚本,如非法输入值或响应失败。此外,还应该考虑在基本交互行为之上的“通用”交互行为、帮助要求和状态查询等。

表7-1和表7-2分别给出了用户查询成绩的正常情况脚本和异常情况脚本。

表7-1 用户查询成绩的正常情况脚本

img122

表7-2 用户查询成绩的异常情况脚本

img123

2.设计用户界面

大多数交互行为都可以分为应用逻辑和用户界面两部分。通常,系统分析员首先集中精力考虑系统的信息流和控制流,而不是首先考虑用户界面。动态模型着重表示应用系统的控制逻辑。

但是用户界面的美观、方便、易学及效率,是用户使用系统时首先感受到的。用户界面的好坏往往对用户是否喜欢、是否接受一个系统起很重要的作用,所以在分析阶段不能忽略用户界面的设计。应该快速建立用户界面原型,供用户试用与评价。

3.事件跟踪图

完整、正确的脚本为建立动态模型奠定了必要的基础。但是,用自然语言书写的脚本往往不够简明,而且有时在阅读时会有二义性。为了有助于建立动态模型,可以借助事件跟踪图。在画事件跟踪图之前需要进一步明确事件及事件与对象的关系。

1)确定事件

前面准备的脚本,理解时不是很简明,可能存在二义性。为了有助于建立动态模型,应该认真分析脚本的各个步骤,以便从中确定所有外部事件。事件包括系统与用户(或外部设备)交互的所有信号、输入、输出、中断和动作等。从脚本中容易发现正常事件,但是,应注意不要遗漏了出错条件和异常事件。

经过分析,在应用系统中找出系统所有的事件后,还需要确定事件与对象的关系。也就是对于一个事件来说,哪个对象是事件的发送者,哪个对象又是事件的接收者。某事件对于发送者来说是输出事件,对于接收者来说则是输入事件。有时,一个事件可能既是输出事件又是输入事件,这是因为对象将事件发给了自己。

2)画出事件跟踪图

从脚本中提取出各类事件并确定了每类事件的发送对象和接收对象之后,就可以用事件跟踪图把事件序列及事件与对象的关系,形象、清晰地表示出来。事件跟踪图实际上是扩充的脚本,可以认为事件跟踪图是简化的UML顺序图。

在事件跟踪图中,一条竖线代表一个对象,每个事件用一条水平的箭头线表示,箭头方向从事件的发送对象指向接收对象。时间从上向下递增。也就是说,画在最上面的水平箭头线代表最先发生的事件,画在最下面的水平箭头线所代表的事件最晚发生。箭头线之间的间距并没有具体含义。教师查询学生信息的事件跟踪图如图7-7所示。

img124

图7-7 教师查询学生信息的事件跟踪图

4.状态图

在画出事件跟踪图后,可根据事件跟踪图再画出状态图。状态图用于描述对象对外部事物所做出的响应的状态序列。状态图侧重于描述某个对象生命周期中的动态行为,包括对象在各个不同状态间的转移及触发这些状态转移的外部事件,即从状态到状态的控制流。

一般情况下,状态图确定了由事件序列引出的状态序列,因而,可用一个状态图描绘一类对象的行为。在动态模型中,并不是任何一个类对象都需要用一个状态图来描述,我们只需考虑那些具有重要交互行为的类就可以了。

一个状态图反映对象发送和接收的事件:每个脚本或事件跟踪图都对应状态图中的一条路径(箭头线),路径上应标以事件名;两个事件之间的间隔就是一个状态,应给每个状态取一个有意义的名字。图7-8描述了教师类的状态图。

img125

图7-8 教师类的状态图

根据一个事件跟踪图画出状态图以后,再把其他脚本的事件跟踪图合并到已画出的状态图中。为此需要在事件跟踪图中找出以前考虑过的脚本的分支点,然后把其他脚本中的事件序列并入已有的状态图中,作为一条可选的路径。

状态图不但要考虑正常事件,还需要考虑边界情况、特殊情况和异常情况。当发生了异常情况时,系统应给出出错处理的脚本,并且并入已有的状态图中。

状态图的构造应考虑所有脚本,并且包含影响某类对象状态的全部事件。因而,在完成初始状态图后,应进一步检查状态图,发现有遗漏的情况,应该立即补充遗漏脚本,并且并入已有的状态图中。