当前课程知识点:软件工程 > 第10章 行为建模 > 10.2 顺序图建模 > 讲课视频
交互是指对象为实现某个目标
而在彼此之间传递消息的行为
交互行为建模
目标就是为了描述对象之间
如何进行协作
在UML中定义了多种交互图
其中应用最广的就是顺序图
有时我们也将其称为
时序图 序列图
由此我们可以看到
位置顺序图的过程
就是在顺序图的顶端
绘制矩形框
定义参与交互的类对象名字
在每个对象下面
位置数值的虚线
表示该对象的生命线
在对象间添加箭头
来表示对象间发生的
各种类型的消息
跟踪对象间控制流的转换
生命线上可以添加竖直的矩形
定义该对象的激活期
表明该对象在哪一个时间段
正在执行某一项操作
根据需要我们再可以添加
框的组合和关联
表示复杂的控制结构
这里我们给出了一个针对刚刚
介绍的绘制顺序图过程的
一个实例
首先我们画出参与这次交互的
所有的参与者的对象
包括来自外部的参与者Customer
来自系统内部的订单Order
和菜单管理员Menu Manager
画出这三个对象的生命线
然后标出参与这些对象
之间交互的消息 用箭头表示
顺序图的起始
是一个没有发起对象的消息
hunger
这里每个消息代表的操作
都是属于操作的接收方的
也就是说
相当于发起消息的这一方
要调用消息接收那一方的
对象的一个操作
沿横轴方向表示的是
参与这次操作的对象
沿纵轴方向表示的是一个时间轴
自上而下发生的次序
由早到晚
我们还可以看到
这里我们添加了一个
循环控制结构Loop
它的循环的条件
是直到用户点菜完毕
我们还有一些嵌套发生的
在订单上的交互消息
包括检查某一个菜
是不是还有
及它要给自己添加一个
新的菜单项
这样的操作是指向自身的一个
自返的一个消息
在最下边我们还有一个
添加了外部引用的
完成订单 付款 这样的一个框
很明显这个框的内部的
内容的定义来自另外一个顺序图
这就是一个简单的顺序图
建模过程的实例
UML2.0中引入了组合框的概念
来表达更为复杂的控制结构
通过把顺序图中的
一部分交互内容放入框中
并在左上角注明
该控制结构的类型
在方括号中加上控制条件的定义
我们就能够表达选择 循环
并发等更为复杂的控制逻辑
比如下边左图中
当左上角标明是opt结构的时候
表明这是一个单条件的
选择结构
当条件满足的时候
执行框中的交互活动
中间 当左上角标签为alt的时候
表示选择执行线上或者线下的
交互活动
线上线下都有各自的控制条件
只有当控制条件满足的时候
才能够执行相应部分的内容
当把标签alt换成par的时候
表示这是一个
并发执行的控制逻辑
也就是虚线上下的部分将并发完成
右边的图中
表示的是一个循环控制结构
当条件满足的时候
框中的内容将循环执行
从这里我们可以看出
框是一种表达能力很强的
建模机制
通过引入框
我们能够更好的去表达
某一个控制单元的反复执行
选择执行和并发执行
这里我们给出了一个简化的
控制结构建模的例子
在这个例子中
我们主要涉及两个参与者
一个是person
一个是银行ATM机
在整个的顺序图
我们把它放入了一个框中
用左上角的sd withdrawal
来表明这是一个顺序图
SD表示
withdrawal表示取款过程
在这个例子中
包括一些控制操作符
首先由用户启动这个序列
第一个操作符Loop(1,3)
是一个循环操作符
1和3分别表示循环执行的
最少次数和最多次数
因为是最少一次
所以在检测条件之前
这部分内容至少要执行一次
在循环内
用户输入密码 系统验证
密码不正确的话
该循环将会持续
但是 如果超过3次
无论怎样该循环都会结束
下边的操作符
是一个可选的操作符
表示如果密码正确
那么执行这个操作符的内容
否则 将跳过这一段内容
执行后面的部分
在这个操作的结构内部
还包括了一个并行的操作符
如图表示
操作符是可以嵌套的
在并行操作符部分有两个分区
一个是让用户输入帐号
另一个是让用户输入数额
由于这两个分区是并行的
所以 我们并没有规定
按什么次序
输入这两部分的内容
并发并不意味着
物理上的同时执行
其实就是这两者之间
没有一个严格的次序关系
如果它们确实是独立的动作
那么 就可以交叉执行
如果是顺序的动作
也可以按照任意的次序发生
一旦并行操作符的两个动作
都被执行完成
那么 并行操作也就执行完毕
我们进行继续下一部分的内容
通过这样的控制结构
我们可以看到
原本只能由单层的一个顺序图的
控制顺序
就变成了可以交叠的
多层次的顺序
对我们未来建模更为复杂的
控制逻辑
有很强的表达能力
这里我们给出的是一个
对控制逻辑定义的新的例子
在这个例子中
我们根据订单的
每一个订单项的额度
来确定是由谁来送货
对于那些价值
大于1万美元的货物
我们选择
careful:Distributor
对于普通的货物
我们选择常规的Distributor
这样 我们就可以通过
对额度的控制
来选择送货人员
当一个顺序图的交互过程
过于复杂 步骤繁多的时候
或者当我们需要引用其它的
外部图报的时候
可以采用用ref, reference
来标注的框图的外部引用
比如 在这个图中
取款项我们将刚刚的介绍的
验证帐户密码和取款流程
单独定义为一个外部的顺序图
然后 在整个的取款顺序图中
引用这两个片断
从而简化我们的取款过程的
顺序图的定义
当我们要引用其它的
外部图表的时候
也可以采用这种机制
在定义框这一种建模机制之前
我们是采用不完整的箭头
和加标注的方式
来表达类似的场景
大多数情况下
对象的生命周期是
贯穿一个场景执行的始终的
但是 也有两种情况
我们需要对对象的创建和撤销
进行特殊的处理
比如在图中我们看到
new标明的一个新建对象的
一个消息
在它的末端
我们添加了一个新的
表示对象的方框
这种情况下 表示这个对象
是在场景中建立出来的
它出现的位置
要比其它的对象相对较低
而对象的撤销
是指在对象的生命线底部
用一个X表示
这个对象在场景
还没有执行完的时候就要被撤销
在java中
我们没有明确的撤销对象的操作
是要通过垃圾回收机制来处理
因此 在图中表示的
只是一个对象生命周期
结束的一个逻辑
这里我们给出的是一个
银行系统交易验证的交互流程
在这个过程中
我们首先创建一个交易对象
交易对象创建之后
它又将创建一个
交易的协调器
然后 交易协调器负责
创建一个信用交易检查器
以及担保交易检查器
两个新的对象
完成本次交易的验证之后
这两个新创建的
交易检查器对象将被撤销
验证成功之后
我们再对交易的协调器
进行循环的处理
是不是所有的交易都已经做完
当和本次交易的
相关的所有检查
都做完之后
返回验证的结果
然后交易的协调器也将被撤销
在返回之后本次交易结束
交易也将被撤销
所以
这就是一个在交互过程中
动态创建和撤销相应对象的过程
这里我们给出了一个
电话通信的简单的
交互过程的顺序图
大家可以看一下
在这个顺序图的描述中
是否存在什么问题
主要从文法以及场景的
可行性方面来考虑
对之前的建模
我们可以进行进一步的细化
这是我们给出的一个可能的
修改方案之一
由于在一个交换机上
存在着多个线程
因此我们在创建一次会话之后
是需要等待相应的会话结束的
而不能再发出一个
异步消息之后
就转移了控制的线索
这样我们很难找出上这个交互
是和其中哪一个对象完成的
当然 就算是我们作出
这个修改以后
也还是存在很多问题
比如说我们这里只定义了
拨号时间少于30秒的时候
就得到应答的情况
而没有给出时间超过30秒之后
应该怎么处理
而且 会话对象中
并没有明确说明计费功能
如何实现等问题
因此 在现实生活中
对顺序图进行建模
要考虑的方面
是根据我们当时的上下文
要进行比较多的细化
以及相应控制流程的考虑
由于顺序图它是在
对系统的控制流程进行建模
因此 通过分析顺序图的
控制流的布局
我们就可以推断出
这个系统采用的是集中控制
还是分布控制
比如左图
它最左边的对象发出很多的命令
给其它的对象
所有的对象的返回结果
也交由左边的这个对象
来响应和处理
因此我们可以看出
这种布局的顺序图
它是采用集中控制的方式
而右面的图可以看出
左边的对象它将消息分布给
下发给后边的对象来完成
对象之间层层嵌套
因此 它的控制流
是分布到各个后续的
对象身上完成的
是一种典型的分布式
控制流程的布局
这是一个典型的
集中控制的计价系统的顺序图
从中我们可以看出
几乎所有的控制命令
都是从订单这一对象发出的
它一直属于活动期
而且它要等待与所有的对象
交互的命令返回结果
再进行下一步的交互流程
每一个订单项Order Line
以及每一种
所购的商品aProduct
以及相应的aCustomer
都是直接和这个
Order对象相交互
同一个控制流程
我们可以采用完全不同的
控制策略
比如在这里分布控制的
计价系统的顺序图的表现
是说由订单把计算价格的命令
发给每一个订单条Order Line
由Order Line自行
和每一个产品
以及相应的Customer发生交互
这样 每一条目的价格
是分开计算的
最后只是汇总一下
因此 它是采用分布控制的
机架系统
也就是说Order Line
承担了一部分控制功能
减轻了Order的控制职责
是我们建议的分布式的
顺序控制的一个布局
-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 软件演化与维护
--讲课视频
-测验题--作业
-第一部分:基础知识
-第二部分:编程与测试(选做)