当前课程知识点:软件工程 > 第10章 行为建模 > 10.4 状态建模 > 讲课视频
学习了系统行为相关的知识之后
下边展开状态建模相关
内容的学习
进行状态建模
我们首先要确定状态的
建模的对象
图中我们给出了一个开关
在这个开关对象中
我们关注它的两个状态
分别是开和关
定义成on off
在on off这两个状态之间
切换的时候
要接受来自外界的事件
包括开关被按下
这就是一个最简单的
有限状态机的建模
由此我们可以看出
进行状态建模
首先我们要确定一个对象的
状态空间
把具体的状态和抽象的状态
定义好
之后 我们再把状态机
建模的主要元素确定下来
包括状态 迁移 事件和行为
这几个主要的概念
然后我们要了解
如何通过这些概念
以及这些建模元素
构造起一个能够符合
我们要求的状态机模型出来
在构造状态机模型的时候
我们主要关注的是组合状态
以及状态图的绘制方法
进行对象的状态建模
前提条件是所有的对象
都是有状态的
做一个极端情况
至少我们去表达
该对象的存在与否
存在和不存在
就成了该对象的两种状态
在对象存在的情况下
根据它的属性的不同取值
我们也可以规划出
在对象存在态的情况下的
更细的对象状态
每一个状态
都是有一组属性值来决定的
比如对一个堆栈对象来说
它可能处在以下的 N个状态
取决于栈的大小
栈中有几个元素
然后在状态之间的迁移
就是通过压栈和弹栈的操作
来完成的
有限状态机
比如下边的这个
长度为4的堆栈的
状态机模型中
它包含有限数量的状态
这也就意味着对象的属性取值
是一个有限的值域
对于这个最大容量为4的
堆栈来说
可以表达很多的动作序列
比如我们可以创建该堆栈对象
压栈 再压栈
阅读栈中最上面元素的值
弹栈 再压栈
也可以是先创建这个堆栈
压栈 弹栈
压栈 弹栈
也就是说
基于一个有限状态机的模型
我们可以表示无限长的
动作序列
但是 在这个模型中
我们却无法表达
下述的一些行为
比如是从Pop作为起始的
一个动作路径是不可能的
因为堆栈的这种数据结构中
我们只能先压栈再弹栈
也不可能有弹栈的操作数
超过压栈操作数的动作序列
也不存在多于4个压栈操作
而中间没有弹栈的操作
也就是说 通过这样的
状态机模型
我们可以表示
我们想允许的系统的行为
对于大部分的对象而言
它的状态空间都是非常庞大的
状态空间的大小
是由对象的每个属性的
取值空间的乘积 再加上1
比如 具有5个布尔型的
属性的对象
它就会有2的5次方加1个状态
具有5个整型属性取值的对象
就有最大整数5次方再加1个状态
具有5个实性属性的对象
则会有无穷多个状态
这里2的5次方加1
和最大整数的5次方加1
这个后边的加1
就是指对象不存在
这一个状态的定义
如果忽略我们存储空间的
局限性的话
状态空间是无限的
对于一个数据库
或者是一个Java
程序中的对象来说
它的状态表示是非常庞大的
但是 是有限的
因为如果我们把属性的
数据类型定义成是一个
有限的数据类型的话
那么它的状态空间
即便巨大 但也是有限的
但是 在现实世界中的对象
它的状态空间几乎总是无限的
那么 对于这样的情况
我们应该怎么处理
事实上尽管整个状态空间
是无限的
但我们真正感兴趣的相关的状态
以及相关的现象
则是一个比较小的集合
总可以针对这个小集合
开展我们的研究工作
面对一个庞大的状态空间
我们只是选取其中
最有探究价值的部分
开展研究
比如我们可能会忽略掉那些
不太可能出现的状态
对于整数或者实数型的值属性
我们只是在一定范围内取值
我们只是关注对象在满足
特定的约束的条件下的行为
比如按年龄分的话
对象可以分为年龄小于18岁
年龄界于18岁和65岁之间
以及年龄大于65岁
三种状态
也就是青少年 成人和老人
三种状态
对于费用这个属性
我们按照数值
也可以把它划为费用小于预算
费用为零 费用超过预算
费用超过预算10%以上
这四种状态
由此我们可以看出
模型的建立过程
实际上就是对状态空间
进行分解的过程
也就是状态划分的过程
对于一个堆栈对象来说
我们也可以按照刚才
给出的状态机的方式
来划分它的状态空间
也就是说 按照栈中所存的
元素的个数来划分状态
当然 我们也可以建立
更为抽象的模型
就是将堆栈的状态
划分为空和非空两种状态
由此我们可以看出
抽象之后的模型
我们可以表达出
更多的状态序列
上述的模型并不能防止
毯栈的个数多于压栈的个数
但是 它仍然表达了
很多的信息
那么 对这两个模型来说
你觉得哪一种更为合理
实际上我们知道
它的合理性取决于
我们观者的视角
我们究竟关注的是
什么样的行为
对于每个模型来说
它都有针对某些问题的适用性
针对某些问题的不适用性
因此 我们应该围绕
我们所关注的 感兴趣的性质
来建立相应的模型
依赖我们建模的
是现实世界的现象
还是我们想要设计的
系统的现象
我们可以有不同的
状态机的定义
比如 左边对人对象的定义
就是一个对现实社会中
人的生命周期中的
三个阶段的描述
童年 成年和老年
我们为相应的真实世界中的
对象赋予了相应的属性
以及相应的操作
主要按照年龄属性
小于18岁 小于65岁来分
但是 右边我们想要用
信息系统中的对象
来表示人相关的信息和行为
这个时候我们就可以为他
添加原本不属于现实世界中
对象的状态
比如说空状态以及死亡状态
那么 对这两个新状态的定义
实际上它是归属与信息对象的
而不是现实社会中的
那个具体的人的状态
因此 在对信息对象的
状态定义不同的情况下
我们为其赋予的属性
也是不同的
相应的操作也是不同的
在建模的过程中
我们要区分两种模型
首先 当我们针对应用领域的
实体建模的时候
是采用的描述型的模型
我们建模的是应用领域实体
可观测到的状态
比如一个电话的状态
有空闲 响铃 接通等等
这类模型表达的是
实体所处的状态
以及用什么操作可能会导致
这些状态发生迁移
另一类模型 则是愿望型的状态
它包括当我们描述应用领域中
实体所需具有的行为
以及机器领域中
实体所需具有的行为的时候
这类模型它描述的是
我们通过什么样的动作
保证预期结果是可以达到的
比如 描述电话的程控交换机
它当且仅当
被呼人接受了电话的
请求的时候
我们才为他接通了的电话
这样的模型可以区分
一系列的状态序列
或者是操作路径
是否是我们想要的结果
对机器领域行为的描述
是表达了我们希望机器
如何响应预期的输入事件
因此 这两类模型
我们用于不同的目的
可能在形式上二者相同
但是 当我们放在不同对象的
建模的时候
它所表达的意义就是不同的
如果单单在我们眼前
给出这样一个状态机模型的话
我们并不知道这个模型
是描述型的还是愿望型的
只有在把它放在具体的
应用的上下文的时候
告诉我们这是当前的
程控交换机的行为
或者是说这是我们希望
代设计系统
要满足的状态机图的时候
我们才能够明确的区分
它究竟是描述型的
还是愿望型的
-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 软件演化与维护
--讲课视频
-测验题--作业
-第一部分:基础知识
-第二部分:编程与测试(选做)