当前位置:文档之家› 第八章状态图

第八章状态图


4. 时间事件 时间事件代表时间的流逝。时间事件既可以被 指定为绝对形式(天数),也可以被指定为相对形式 (从某一指定事件发生开始所经历的时间)。在高层 模型中,时间事件可以被认为是来自整个世界的事件; 在实现模型中,它们由一些特定对象的信号所引起, 这些对象既可能是操作系统也可能是应用中的对象。
状态变量,像计时器或者计数器—样,有时很 有用途。活动是由事件和动作组成:3个常用的事件 和动作是入口动作(entry),即系统进入该状态时要 发生的动作;出口动作(exit),即系统离开该状态时 要发生的动作;动作(do)是系统处于该状态时要发生 的动作。还可以增加其他的动作或事件。
传真机例子可以用来说明状态变量和活动。当它 发传真时,换句话说就是当它处于Faxing(发传真)状 态时,传真机记录下发送传真的日期和时间(用状态变 量“Date”和“Time”来表示),并且记录接收者的电 话号码和名字(用状态变量“Phone N加给传 真“增加日期戳(adding a datestamp)”和“时间戳 (timestamp)”的活动,以及增加电话号码和接收者姓 名到传真机中。这个状态下的其他活动是机器拉进传 真页,逐页传真,完成传输任务。
事件类型
描述
语法
调用事件 接受等待应答的对象的明确形 op(a:T) 式的同步请求 改变事件 对布尔表达式值的修改 When(exp)
信号事件 接受一个对象间外在的、命名 Sname(a:T) 的、异步的通信 时间事件 绝对时间的到达或者相对时间 After(time) 段的终结
1. 信号事件 信号是作为两个对象之间的通信媒介的命名的实体,信号的接收是 信号接受对象的一个事件。发送对象明确地创建并初始化一个信号实例 并把它发送到一个或一组对象。最基本的信号是异步单路通信,发送者 不会等待接收者如何处理信号而是独立地做它自己的工作。在双路通信 模型中,要用到多路信号,即至少要在每个方向上有一个信号。发送者 和接受者可以是同一个对象。 信号可以在类图中被声明为类元,并用关键字《 signal 》表示,信 号的参数被声明为属性。同类元一样,信号间可以有泛化关系,信号可 以是其他信号的子信号,它们继承父信号的参数,并且可以触发依赖于 父信号的转换
3. 修改事件 修改事件是依靠特定属性值的布尔表达式所表示的条件的满足。这是等到 特定条件被满足的一种声明途径,但是一定要小心使用它,因为它表示了一种 具有时间持续性的并且可能是涉及全局的计算过程(是一种远距离的动作,因 为被测试的值可能是远距离的)。这既有好处也有坏处,它的好处在于它将模 型集中在真正的依赖关系上—一种当给定条件被满足时发生的作用—而不是集 中在测试条件的机制上。缺点在于它使修改系统潜在值和最终效果的活动之间 的因果关系变得模糊了。测试修改事件的代价可能很大,因为原则上修改事件 是持续不断的。而实际上,又存在着避免不必要的计算的方法。修改事件应该 仅用在当一个具有更明确表达形式的通信形式显得不自然时。 请注意监护条件与修改事件的区别。监护条件只是在引起转换的触发器事 件触发时和事件接收者对事件进行处理时被赋值一次。如果它为假,那么转换 将不会被激发,条件也不会被再赋值。而修改事件被多次赋值直到条件为真, 这时转换也会被激发。
由于Initializing状态中活动的完成,GUI将转移进 入Working状态。当你对PC选择ShutDown(关闭机器) 时,就生成了一个引起转移到Shuting Down状态的触 发器事件,最后PC自己切断电源,整个过程结束。下 面的状态图捕获了GUI的这些状态和转移。
8.1.4 增加转移的细节:监视条件 上面对GUI的状态变迁还有考虑不全之处。首 先,如果你离开,你的计算机将无人照管或者你 漫无目的坐在一旁,不打字或不碰鼠标,那么过 一段时间屏幕保护程序就会运行。用状态转移的 术语来说,就是如果GUI在足够的时间内没有接收 到用户的输入,那么它将从Working状态转移到另 一种状态——Screensaving(屏幕保护)状态。
第八章 状态图
现在要开始学习的是如何随时间变化的UML动 态元素。本章的主要内容是: 什么是状态图 事件、动作和监视条件 事件类型 子状态:顺序的和并发的 历史状态 为什么状态图很重要
在前—章的最后曾提到,这一章要开始学习在 前面没有遇到过的另一类UML元素。这个新类被称 为行为元素,它们能够展示UML模型部件如何随时 间变化。事物的一个普遍的现象是随着时间的流逝, 都要经历变化。任何计算机系统也是如此。当系统 与用户(也可能是其他系统)交互的时候,组成系统的 对象为了适应交互要经历必要的变化。如果要对系 统建立模型,那么模型中必须要反映出这种变化。 本章将学习这类元素中的一种:状态图。
2. 调用事件 调用事件是一个对象对调用的接收,这个对象用状态的 转换而不是用固定的处理过程实现操作。对调用者来说, 普通的调用(用方法实现的调用)不会被调用事件所辨别。 接收者不是用方法来实现操作就是触发一个状态转换来实 现这个操作。操作的参数即事件的参数。一旦调用的接收 对象通过由事件触发的转换完成了对调用事件的处理或调 用失败而没有进行任何状态转换,则控制返回到调用对象。 不过,与普通的调用不同,调用事件的接收者会继续它自 己的执行过程,与调用者处于并行状态。
Visualizing User Input。 用户输入触发了从Awaiting状态到Registering状 态的转移。Registering状态内的活动引起了GUI到 Visualizing状态的转移。在第3个子状态之后,GUI重 新回到Awaiting状态。下图说明了在Working状态中 的顺序子状态。
进入屏幕保护状态取决于指定的时间间 隔。比如是15分钟。15分钟的时间间隔是一 个保护条件——当满足这个条件时,转移才 能发生。下图是GUI加入了Screensaving状态 和保护条件的状态图,注意图中的保护条件 [is Timeout],被写成一个布尔表达式。
8.2 事件类型
事件是发生在时间和空间上的一点的值得注意的事情。 它在时间上的一点发生,没有持续时间。如果某一事情的发 生造成了影响,那么在状态机模型中它是一个事件。当我 们使用事件这个词时,通常是指一个事件的描述符号,即对 所有具有相同形式的独立发生事件的描述,就像类这个词表 示所有具有相同结构的独立类一样。一个事件的具体发生叫 做事件的实例。事件可能有参数来辨别每个实例,就像类用 属性来辨别每个对象。对类而言,信号利用泛化关系来进行 组织,以使不同的类共享公用的结构。事件可以分成明确或 隐含的几种:信号事件、调用事件、修件事件、时间事件等。
经过一个适宜的时间后,洗衣机可以由洗涤变为 漂洗状态。 UML状态图能够展示这种变化。它描述了一个对 象所处的可能状态以及状态之间的转移,并给出了状 态变化序列的起点和终点。 状态图也被引用为状态机(state machine)。
状态图与类图、对象图和用例图有着本质的不同。前 面章节介绍过的这3种图能够对一个系统或者至少是一组 类、对象或用例建立模型。而状态图只是对单个对象建立 模型。 通常状态名的首字母要大写,并且最好给状态一个以 “ing”为结尾的名字。(例如“Dialing”、“Faxing”)。当然 有时也无法起这样的名字(例如“Idle”)。
8.3.2 并发子状态 在处于Working状态时,GUI并不是仅仅只等待 用户的输入。它还要监视系统的时钟(Watch system clock)或者定期更新应用程序的界面显示。例如,一 个应用程序可能包括一个屏幕时钟,它的GUI需要定 期被更新。 所有这些与前面的顺序子状态的转移同时进行。 尽管每个状态序列是一组顺序子状态,但是两个状 态序列之间是并发关系。并发状态之间用虚线隔开, 表示状态序列之间是并发关系,如下图所示。
在Idle状态 下,传真机要显 示出当前的时间 和日期。下图显 示了传真机的状 态图。
8.1.3 增加转移的细节:事件和动作 可以对状态转移线添加一些细节。可以指明引起 转移发生的事件(触发器事件)和引起状态变化所需执 行的计算(动作)。添加的事件和动作写在转移线上, 触发器事件和动作名之间用反斜杠隔开。有时一个事 件会引起没有相关动作的状态转移,或者有时一个转 移是由于某个状态完成了它的活动所引起(而不是由 于事件引起)。这种类型的状态转移被称为无触发器 转移。
8.3 子状态
我们建立的GUI状态模型好像仍然少了什么。特 别是working状态,应该比以上状态图所表示的内容 更为丰富才对。 当GUI处于working状态,幕后同时进行着许多 事情,尽管这些事情并未在屏幕中显现出来。GUI始 终在等用户的动作——敲键盘、移动鼠标或者按下 鼠标按钮。然后它必须注册这些输入然后改变屏幕 显示来反映用户的动作——例如,如果你移动鼠标 则屏幕就移动光标;如果你按下键盘上的“a”键, 屏幕上就显示出字符“a”。
状态图 (状态机)是展示状态与状态转换的图。 状态图 (状态机)包含了一个类的对象在其生命 期间所有状态的序列以及对象对接受到的事件 所产生的反应。 利用状态图 (状态机)可以精确地描述对象的行 为。
8.1 什么是状态图
一种表征系统变化的方法可以说成是对象改变 了自己的状态(state)以响应事件和时间的流逝。下 面是几个简单的例子: 当你拉下电灯的开关时,电灯改变了它的状态, 由关变为开。 当你按下远程遥控器的调频按钮时,电视机的 状态由显示一个频道的节目变为显示另一个频道的 节目。
8.1.2 在状态图标中增加细节 UML提供了在状态图标中增加细节的选项。类 似于类的图标可以被分成3个区域(名字,属性和操 作区域),你可以把状态图标也分成3个区域。最上 面的区域保存状态名(不管分不分区都得有状态名), 中间区域保存状态变量,下面区域保存的是活动。 下图说明了状态图标中的细节。
图形用户界面(GUI)是一个可以说明状态转移细 节的例子。在这里,假设GUI可以处于以下3种状态 之一: Initializing(初始化)。 Working(工作)。 Shut Down(关闭)。 当打开PC电源的时候,自启动发生。因此 Turning the PC on(打开PC)是一个触发器事件,它导 致了GUI的状态转移到Initializing状态,而Bootup(自 启动)是一个在转移过程中执行的动作。
相关主题