3.系统分析-状态图

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

迁移
状态:进入动作
有人制定时刻表,确定是否 包含这个航班。
状态:活动
2. 如果计划批准,则航班转入 Scheduled状态。航班时刻表
发布到Internet上
迁移:保证条件
3. 离起飞时间小于60天,该航
状态
班开始开始售票,进入Open
状态
4. 可以从航班中 增加和删除旅 客,但售出最后一张票,航 班就满了。如果有人退票, 则再次开始售票
batteryEmpty
batteryEmpty
DeadBattery
Fi n a l
2020/4/2
上海理工大学
8
6.活动
一个状态可关联到一个活动,该活动的执行与驻
留在这一状态上的对象的生命周期一样长
动作与活动的区别:动作的执行时间短且不可中
断,而一个活动的执行需要一段时间且其执行是 可以中断的,其中断的时机就是该状态的一个迁 移被时
2020/4/2
上海理工大学
27
9. 建模技巧/10
选择点的命名:在选择点处的回答问题的命名要采用描
述性的方法例如,‘isThereStillLife’或者 'isItTimeToComplain'
选择点名字是唯一的:对任何对象,尽力保证选择点的
名字是唯一的 (同样,保持转换的名字是唯一的)
转换的表达不能过长:如果过长,需要考虑用函数,或
MeasureTime
pressBothButtons 2分钟
Initial
SetTime
batteryEmpty
batteryEmpty
DeadBattery
Fi n a l
2020/4/2
上海理工大学
6
5.动作
可以在状态内使用动作表示其行为 动作是选取一段输入且产生一组输出并最终可改
变系统的状态
者将公共的代码片断用函数表示,转换必须读起来象高 层的伪代码,例如,如果转换上的代码长于25行,可能 就太长了
2020/4/2
上海理工大学
28
9. 建模技巧/11
动作根据它们的任务命名 注意entry和exit动作,很容易发生修改后,忘了
修改它们
退出动作可以提供安全特性,例如从‘heaterOn’
2020/4/2
上海理工大学
30

9. 建模技巧/13
避免下列保安条件:
如果一个事件能触发多个转换,没有一个控制确定对 哪一个保安条件首先进行判断,这样的情况下,结果 是不可预测的
多个保安条件都可能是真的,但是只有一个转换可以 遵循,路径的选择可能是无法预测的
保安条件不是可视化的,很难看到它们的存在
第3讲 状态图
2020/4/2
上海理工大学
1
1 什么是状态图?
状态图描述了一个对象或交互过程在它的生命周期中对
一系列外界激励所呈现出的不同状态以及它相应的响应 和活动
状态机用状态和瞬时过程的变化图形来表示一个对象对
外界激励下的响应,状态机一般附着在一个对象或具体 的方法上
状态图描述了一个状态机,在我们考虑的范围内,它们
方法和操作支持
▪ 在状态图中进行跟踪检查,将它与期待的事件和响应
的顺序进行比较,搜索那些到达不了的状态和“死锁” 状态
▪ 在调整状态机图时,确保语义不变
2020/4/2
上海理工大学
22
9. 建模技巧/5
在有选择的情形下,尽量使用状态机的可视化语义而不
是写详细的转移说明。例如,不要在一个转移上列出多 个信号,然后用文字说明依据不同的信号来管理不同的 控制流;代之以单独的转移,由单独的信号触发。
如果有人退票,则再次开始售票
飞机起飞10分钟前,航班停止售票 如果飞机还没有到达,则航班延迟。 若延迟超过4小时,则航班取消。若乘客不足50人,则也把航班取消。 如果航班取消,则航空公司要为乘客寻找另一航班。 如果飞机到达,则其起飞和着陆,完成这个航班
2020/4/2
上海理工大学
34
1. 航班从Tentative(暂定)开始。
2020/4/2
上海理工大学
18
9. 建模技巧/3
为了对对象的生命周期进行建模:
确定状态机的背景, 是类,用例,还是整个系统 如果背景是类或者是一个用例,收集邻近的类,包括
父类或者通过关联或依赖关系能够到达的类,这些邻 居是动作的可能的目标,或者是保安条件中包含的内 容 如果背景是整个系统,将焦点放在系统的某一个行为 上,然后考虑对象在该方面的生命周期。整个系统的 生命周期太大了。 建立对象的初始和最终状态,如果对于初始和最终状 态有前置条件或后置条件,也要定义它们
2020/4/2
上海理工大学
19
确定对象能够响应的事件,它们可以从对象的接口中 找到,在实时系统中,它们可以从对象的协议中找到
从初始状态到最终状态,画出对象的最高层的状态, 将这些状态用转移连接起来,这些连接由特定的事件 触发
确定进入和退出动作
通过使用子状态能够扩展和简化状态机
2020/4/2
行为进行建模,特别是在对象具有依赖于状态的 行为的时候
可以具有状态机的包括类,子系统,用例和接口
(确定实现接口的对象必须满足的状态)
2020/4/2
上海理工大学
17
9. 建模技巧/2
在实时系统中,状态机可以用于进程(capsules)和协议
(确定实现协议的对象需要满足的状态)
并不是所有的对象都需要状态机. 如果对象的行为是简单
2020/4/2
上海理工大学
32
这种对状态机错误的应用可以通过以下症状来判断:
➢ 消息发送给自己只是为了重用代码 ➢ 非常少的状态,很多的选择点 ➢ 在状态机中没有一个循环,这种状态机在过程控制应用或者控制事
件序列是有效的;在分析阶段中,它们的出现代表了状态机被弱化 成流程图
当问题找到后:
➢ 使主动类变小从而将职责分得更清楚 ➢ 将更多的行为移到与问题主动类相关的数据类中 ➢ 将更多的行为移到主动类功能中 ➢ 构造更富有意义的信号而不是依赖于数据
上海理工大学
14
8.嵌套状态图
嵌套简化了复杂性,可用于取代内部迁移
stm Dynamic View
SetTime
Initial
BlinkHours + rB / incr hour
lB
BlinkMinutes
lB
+ rB / incr min.
BlinkSeconds
lB
+ rB / incr sec.
text, Insert character, Save and quit 引发状态机中的状态的迁移
2020/4/2
上海理工大学
3
3什么是状态?
状态表示的是一个对象或交互过程中的一个特定
阶段:满足了某一个条件,进行某项活动或等待 某个事件的发生,状态对应一段有限的时间。状 态对应于一组对象属性的值
2020/4/2
上海理工大学
23
9. 建模技巧/6
状态命名根据在一个状态中等待或发生的情况来确定。
记住,状态不是一个“时间点”,它是状态机等待什么 事发生的一段时间。例如 ‘waitingForEnd’ 就比‘end’ 好; ‘timingSomeActivity’ 就比‘timeout’好. 不要把状 态命名成动作
2020/4/2
上海理工大学
31
9. 建模技巧/14
不要使状态机象流程图
这种状态可能意味着你对一个可能实际上不存在的抽 象情形进行了建模:
➢ 使用了一个主动类对最好采用被动(或数据)类的行为进行 建模
➢ 采用紧密耦合的数据类和主动类对一个数据类进行建模 (例 如,数据类被用于传递类型信息,但是主动类包含了绝大部 分的数据,这些数据本来应该是与数据类相联系的).
pressButtons/beep
SetTime
+ exit / blink hours + pressLeftButton / blink next number + pressRightButton / increment current number + exit / stop blinking
的,比如说它只是简单的存储和获取数据,对象的行为 是状态不变的(state-invariant ),那么其状态机就没有 多少意义
对对象的生命周期的建模涉及到三件事情:
描述对象需要响应的事件
对这些事件的响应
过去对当前行为的影响
对对象的生命周期的建模也涉及到决定对象响应事件的
次序,这种响应始于对象的创建时刻,继续直到其销毁
2020/4/2
上海理工大学
33
小组作业
航班从Tentative(暂定)开始。有人制定时刻表,确定是否包含这个航
班。
如果计划批准,则航班转入Scheduled状态。航班时刻表发布到
Internet上
离起飞时间小于60天,该航班开始开始售票,进入Open状态 可以从航班中 增加和删除旅客,但售出最后一张票,航班就满了。
状态由一个带圆角的矩形表示 两个特殊状态:
初始状态:一个小实心黑圆 终止状态:一个套有小实心黑圆得圆
2020/4/2
上海理工大学
4
4 什么是迁移?
一个迁移表示由事件、条件或事件触发后状态的
改变
状态间的迁移用一根带箭头的直线来表示。
2020/4/2
上海理工大学
5
stm Dynamic View
活动使用“do 标识”
2020/4/2
上海理工大学
9
2020/4/2
上海理工大学
10
2020/4/2
上海理工大学
11
2020/4/2
上海理工大学
12
2020/4/2
上海理工大学
13
7.内部迁移
内部迁移指一个未离开该状态的迁移。 通过事件触发内部迁移,并可出现与这些事件相
关联的动作
2020/4/2
到heater off状态之间的退出动作,该动作就用以 确保状态转换
2020/4/2
上海理工大学
29
9. 建模技巧/12
子状态必须包含两个或以上状态,除非状态机是
抽象的并将被包含的元素的子类所修饰
选择点必须被用于在动作或转换的条件逻辑的场
合。选择点容易被看到,而在代码中表达的条件 逻辑是隐藏的,容易被忽略
根据触发事件和/或在转换上发生的情况来命名转换。在
选择名字时,也需要从可理解性的角度出发
2020/4/2
上海理工大学
26
9. 建模技巧/9
当你看到一个选择点,你需要问一下是否能够将选择条
件的责任分配给另外一个组件。在这种情况下,发送者 或者其它活动者进行决策,并将带有决策信息的信号发 送给另外一个对象,该信号的名字要带有决策信息,例 如信号的名字为isFull和isEmpty,而不应该是 value 和 checking message data)
上海理工大学
20
9. 建模技巧/4
检查
是否状态机中所有的事件触发转换与由对象实现的接 口所期望的事件匹配
所有的对象接口期望的事件都包含在状态机中 在实时系统中,对进程的协议进行同样的检查。 确定那些明确希望忽略事件的地方 (例如延迟事件)
2020/4/2
上海理工大学
21
▪ 是否状态机中的所有的动作得到了包含的对象的关系、
2020/4/2
上海理工大学
24
9. 建模技巧/7
一致性命名。给状态机中的每一个状态和转换一个
唯一的名字;这将使源代码级的调试更容易
小心使用状态变量 (控制行为的属性)
2020/4/2
上海理工大学
25
9. 建模技巧/8
如果一个图上5 ± 2状态,考虑使用子状态。 一般而言,
在通常的情况下十个状态可能没有问题,但是两个状态 之间却有四十个转换肯定需要重新考虑。我们需要保证 状态图是容易理解的
动作的执行只需要一小段时间且执行不可中断 动作可发生在以下3个位置:
当一条迁移被选中时 当进入一个状态时(entry) 当退出一个状态时(exit)
2020/4/2
上海理工大学
7
stm Dynamic View
Initial
MeasureTime + do / count ticks
pressBothButtons 2分钟
lB
BlinkYear + rB / incr year
2020/4/2
lB
BlinkMonth
+ rB / incr mo.
上海理工大学
BlinkDay
lB
+ rB / incr day
15
打电话的状态图
2020/4/2
上海理工大学
16
9. 建模技巧/1
状态机最经常被用以对一个对象的生命周期中的
是同一件事
UML中关于状态图的定义和描述主要是采用David Hare提
出的状态图方法并加上了面向对象的含义
2020/4/2
上海理工大学
2
2 状态图的构成
状态图由一组表示状态和迁移组成。
一个简单的编辑器可以被看作为一个有限状态机,它具有状态
Empty, Waiting for a command, 和Waiting for text. 事件Load file, Insert
相关文档
最新文档