当前课程知识点:软件工程 > 第10章 行为建模 > 10.5 状态图 > 讲课视频
关于状态建模
我们已经说了很多原理性的知识
下边我们再对状态图的
文法表示进行进一步的介绍
在UML中
状态图用来表示一个类对象的
全生命周期的过程
在系统中 类最主要的动态行为
就是对它们自身的状态
进行检查和管理
状态图关注的就是一个类对象
全生命周期的状态切换
每一个状态都是对象
所能处在的一个上下文条件
我们来看课件图中的
这个状态机
它为这个类定义了5个状态
包括开始状态
也就是对象创建意识时
所处的状态
以及对象撤销时
所处的结束状态
一般来说
对象有且只有一个起始状态
但是可以没有
或者有多个结束状态
对象的迁移描述的是
对象如何从一个状态
进入另外一个状态
迁移的发生可以由事件出发
也可以是在迁移的过程中
执行某些操作
比如在课程的讲授过程中
有学生中途退课
当退课的学生人数
导致课程注册人数
下降为零的时候
课程就结束了
这里 学生人数的监控
是通过一个卫士的条件来完成的
在状态的内部
对象也可以执行一系列的活动
活动的开始进入该状态
活动完成时退出该状态
这个时候状态图
也可以演化为一个活动图
状态图关注的活动核心行为
是迁移的效果
状态的出入条件和动作
以及状态持续期间的条件和动作
由此我们可以看到
状态图的建模元素包括
状态 事件和状态迁移
还包括特殊状态的定义
比如初始状态 结束状态
组合状态 嵌套状态
历史状态以及状态图的绘制
这就是我们下面要介绍的内容
状态 定义为一个对象
生命周期中的一个阶段
在该阶段中
对象要满足一些特定的条件
执行特定的活动
或者等待某些事件的发生
它的具体体现是对
对象属性的取值
包含状态的入口
或者出口条件及行为的描述
它从不同的抽象层次上
分析对象的行为
因此 状态的定义
是可以嵌套 组合的
针对给定的场景
对象的状态是确定的
也就是说 可以满足
或者不满足某个状态
事件在状态的迁移过程中
有重要的作用
事件定义为可以触发对象
状态改变的那些外部刺激
在面向对象的上下文下
也就是对象消息的发出
与接收
它决定状态迁移何时发生
状态迁移是对象状态之间的
一种动态关系
当一个触发事件发生
或者迁移条件满足时
就会发生从源状态
到目标状态的一次转变
从这个定义我们可以看出
状态迁移的发生要求
当且仅当迁移条件满足的时候
才会触发
每一个状态迁移都伴随着一个
触发事件
同时 还要满足一定的
警戒条件
当触发事件发生
或者相关的警戒条件满足的时候
一个切实可行的状态迁移
将会被触发
状态迁移的过程
有时候还会伴随相关的对象操作
在UML状态图中的状态
它定义为在某个时间段内
某条陈述是正确的
一般来说这个陈述是
关于对象的属性取值的
一个表达式
比如这里给出的例子
就是说当前的项目
它处在预算还是有结余的状况
或者是说某个动作正在执行
以及在某个时间等待触发
比如检查订单商品的存活
这个动作等在执行
或者等待缺货的产品到货
这些都是一个状态的定义
一个状态的相关的活动类型
可以是状态持续期内的活动
用关键字do/activity来表示
意思就是当对象
处于这个状态的时候
这个活动就会一直执行
直到离开这个状态
入口动作或者出口动作
是指进入或者离开这个状态时
需要执行的一次性的动作
包含子图这样的关系
就是指在当前的状态下
我们会转到另一个完整的状态图
形成分层次的状态图
也是就嵌套关系
这里我们给出了状态的
定义的例子
可以看出在状态的定义中
我们首先有状态名的定义
以及刚才所提到的
各种状态相关活动的定义
两个特殊的状态
分别是初始状态和结束状态
初始状态是一个实心原点
结束状态是一个靶子形状的
带实心原点的一个圆圈
UML状态图中
迁移的定义包括五部分的内容
首先是源状态
其次是触发事件 警戒条件
和相伴的动作
最后是目标状态
我们通过图中可以看出
中间迁移的线上
应该标注的是按触发事件
警戒条件和动作的顺序排列
源状态和目标状态
分别处于这个迁移线的
左侧和右侧
对于一个给定的状态
我们只能发生一个迁移
这样才是一个
确定行为的状态机
因此 从相同的状态出发
事件相同的几个迁移之间
它的迁移条件一定是互斥的
也就是说 迁移条件
不能存在重叠或遗漏的情况
UML状态图中
对事件的定义的意义在于
它帮助系统了解
正在发生什么事情
状态图中事件仅需和系统
或当前建模的对象相关
它从系统的角度出发
事件必须建模成一个
瞬间可以完成的原子动作
比如完成工作 考试未通过
系统崩溃等等
在面向对象设计中
通过传递消息来实现事件
UML中 有四种典型的事件
首先是变更事件
也就是说当给定的条件成立时
发生一个状态的变化
或者调用事件
向给定的对象发出调用
某个操作或者执行某个命令的
这样的事件
时间相关的事件
是指某个时间段过去
或者某个特殊的时刻来临
信号事件是指给定的信号
收到了某些实时的
信号处理要求
变更事件可以通过
布尔表达式中
变量的改变来表示
也就是说 通过改变变量的值
来使得事件触发
这种事件的表达
往往就是一个条件表达式
比如当温度大于120度的时候
要报警
变更事件和警戒条件的
区别在于
警戒条件只是在
所相关的事件所出现时
计算一次
而变更事件
则是要监控 反复监控 持续监控
调用事件是指
当前对象的状态迁移时
未发出一个动作
调用其它对象的方法
它要包括事件的名字
和该调用事件的参数的列表
这里我们是说从手工状态
转成自动状态的时候
我们要发出调用
自动导航功能这样一个事件
时间事件是通过时间表达式
来表示的事件
它可以表示
一个绝对时间点的到来
也就是时刻
或者经过一个时间段之后
对象进入了一个新的状态等等
常用的关键字是
when and after
在这一个状态图中
我们可以看到从活动态
进入空闲态
是说经过2秒钟
就从活动态进入空闲态
然后在这个迁移发生的时候
要把电话的连接破坏掉
从第二个活动态进入空闲态
是指当2000年的1月1日
到来的时候
我们要进入空闲态
信号事件是由一个对象
异步的发送
并由另一个对象接收的
命名对象
它可能引起对象的状态迁移
表达了对象之间的
异步通信关系和行为
信号事件和调用事件的区别在于
信号是一个异步的事件
而调用则是一个同步的事件
UML状态图中
动作定义为在对象状态内部
或者状态间迁移时
所执行的原子操作
两个特殊的动作
分别是入口和出口动作
用关键字entry和action来标记
在动作定义表达式中
我们可以引用当前对象的属性
或者在输入事件中
所获得的参数
从状态抽象的角度来讲
动作是具有原子性的
及时性 不可中断
它的执行时间可以忽略不计
我们需要注意的一点是
动作是由当前的对象
向外发出的消息
因此 它一定是由
外部的对象提供的某种服务
而当前对象所接收到的事件
是来自外部对象的调用
或者是服务请求
因此 它一定是当前对象
对外提供的操作
这里我们给出的是一个
订单处理对象的
生命周期的状态机图
在这个图中
订单处理对象一经创建
就进入了检查订单项的状态
在从初始状态
到检查状态的迁移
发生的时候
它将发出一个动作
就是获取第一个订单项
在订单检查的过程中
任何一个订单项
如果没有货的话将进入等待状态
一旦货品备齐将进入发货状态
在发货状态下
它将创建一个运货的
初始请求
初始化过程
一旦货品发出
它就进入Delivered状态
当货品送到之后
该定单处理对象
自动进入结束状态
也就是对象完成执行
从这个状态机图我们可以看到
斜杠后边的就是
当前迁移发生的时候
由该对象发出的动作
也就是要调用
其它的对象的一个操作
而不带斜杠的字符串
表达的是接收到的事件
也就是取下一个订单项
比如送货
这个都是当前对象
可以响应到的操作
而方括号引用的
则是条件表达式的定义
这些都属于警戒条件
也就是说
通过检查这些条件的满足与否
我们能够确定是在当前状态下
循环执行
还是进入下一个状态
完成状态的迁移
对这样简单的一个业务逻辑
我们能够通过状态图
非常清楚的表达出来
订单出来的流程
因此 任何一个状态相关的
这样的对象的生命周期
用状态图表示
都能帮我们理清
系统的业务流程
因此 我们会为系统的主要的
信息对象建立状态机模型
-1.1 软件无处不在
--讲课视频
-1.2 软件的本质特性
--讲授视频
-1.3 软件工程的产生与发展
--讲授视频
-1.4 软件工程的基本概念
--讲授视频
-1.5 软件质量实现
--讲授视频
-1.6 业界人士谈软件工程
-测验题--作业
-讨论题
--讨论题
-作业题
--第一张 作业题
-2.1 编程过程与规范
--讲课视频
-2.2 良好的编程实践
--讲课视频
-2.3 Python集成开发环境
--讲课视频
-2.4 代码静态检查
--讲课视频
-2.5 代码性能分析
--讲课视频
-2.6 结对编程实践
--讲课视频
-2.7 刘贺谈软件工程
--讲课视频
--讨论
-测验题--作业
-作业题
--第二章 作业题
-3.1 单元测试概述
--讲课视频
-3.2 黑盒测试方法
--黑盒测试方法
-3.3 白盒测试方法
--基本概念
--代码覆盖标准
--基本路径测试
-3.4 单元测试工具
--单元测试工具
--html
-测验题--作业
-作业题
--第三章 作业题
--作业题附件
-4.1 软件过程
--讲课视频
-4.2 软件过程模型
--讲课视频
-4.3 敏捷开发过程
--讲课视频
-4.4 微软公司开发过程
--邹欣经理自我介绍
--微软开发过程之一
--微软开发过程之二
-测验题--作业
-5.1 团队组织与管理
--讲课视频
-5.2 项目沟通管理
--讲课视频
-5.3 软件项目计划
--讲课视频
-5.4 软件项目估算
--讲课视频
-测验题--作业
-讨论题
--讨论
-6.1 敏捷开发之Scrum
-- 敏捷开发之Scrum
--html
-6.2 用户故事与估算
--讲课视频
-6.3 团队协作工具Tower
-6.4 配置管理
--讲课视频
-6.5 配置管理工具Git
--讲课视频
-测验题--作业
-作业题--作业
-7.1 需求工程师
--讲课视频
-7.2 需求定义
--讲课视频
-7.3 需求的类型
--讲课视频
--讲课视频(2)
-7.4 需求工程过程
--讲课视频
-7.5 需求的主要来源
--讲课视频
-7.6 需求获取技术
--讲课视频
--讲课视频二
--讲课视频三
-7.7 撰写需求文档
--讲课视频
-测验题--作业
-讨论题
--讨论
-8.1 用例建模概念
--讲课视频
-8.2 用例建模过程
--讲课视频
-8.3 用例建模精讲
--讲课视频
-8.4 建模工具介绍
--讲课视频
-8.5 微信抢票应用案例
--讲课视频
-测验题--作业
-讨论题
--讨论
-9.1 面向对象分析
--讲课视频
-9.2 CRC卡片分拣法
--讲课视频-1
--讲课视频-2
-9.3 面向对象设计
--讲课视频-1
--讲课视频-2
-9.4 类图建模
--讲课视频-1
--讲课视频-2
-第9章 面向对象分析与设计--测验题
-讨论题
--讨论
-10.1 顺序图概念
--讲课视频
-10.2 顺序图建模
--讲课视频
-10.3 顺序图风格
--讲义视频
-10.4 状态建模
--讲课视频
-10.5 状态图
--讲课视频
-10.6 状态图精讲
--讲义视频
-测验题--作业
-讨论题
--讨论
-11.1 软件体系结构概念
--讲授视频
-11.2 软件设计原则
--讲授视频
-11.3 软件体系结构风格(一)
--讲授视频
-11.4 软件体系结构风格(二)
--讲授视频
-11.5 软件体系结构风格(三)
--讲授视频
-11.6 软件设计过程
--讲授视频
-11.7 Web系统架构设计
--讲授视频
-11.8 数据库选择策略
--讲授视频
-测验题--作业
-作业题
--html
--html
--html
-作业题--作业
-12.1 交互设计概述
--讲授视频
-12.2 交互设计目标
--讲授视频
-12.3 GUI设计原则
--讲课视频
-12.4 KLM效率模型
--Video
-12.5 Fitts定律
--讲授视频
-12.6 交互设计过程
--讲授视频
-测验题--作业
-13.1 软件测试概念
--讲课视频
-13.2 软件测试类型
--讲课视频
-13.3 软件功能测试
--讲课视频
-13.4 软件性能测试
--讲课视频
-测验题--作业
-14.1 软件部署与交付
--讲课视频
-14.2 软件演化与维护
--讲课视频
-测验题--作业
-第一部分:基础知识
-第二部分:编程与测试(选做)