当前课程知识点:面向对象分析与设计 > 用例分析概述 > 控制类 > 控制类
同学们 今天我们继续讲授面向对象分析与设计的第十四讲——用例分析(二)
在上节课里边 我们介绍了用例分析 它的活动的目的
用例分析的步骤 第一步 补充用例规约
第二步 识别分析类 在识别分析类里边 我们介绍了分析类主要有三种
分别是边界类 实体类和控制类
上节课 我们已经介绍了如何来识别边界类以及实体类
那么这节课 我们接着来讲如何来识别控制类
什么是控制类呢
控制类描述了用例的行为是如何组织起来的
也就是说 控制类描述了用例行为里边的这些活动
是如何把它组织和管理的
一般来讲 对于一个用例来讲 我们可以把它识别定义一个控制类
比如说 通过一个控制类我们来组织协调我们之前的边界类实体类
来共同完成用例的行为
所以 对于普通的用例来讲 一个用例我们需要识别对应的一个控制类
当然也有意外情况 如果这个用例太复杂
也就是说它需要管理协调的边界类和实体类很多
它的控制逻辑很复杂
那么也有可能我们一个用例会定义两个或者更多的控制类
当然 我们后边也要讲 也有特殊情况
比如说这个用例的控制结构可能很简单
他只是简单地把实体类的数据提交或者转交给边界类
然后提交给最终的角色
如果这种情况下 我们的控制类可能不需要存在
那么我们可能不需要定义他的控制类
直接让边界类从实体类里获取数据就可以了
但是 多数情况下是从一个用例里边 我们定义一个控制类
当然 这个控制类的描述方式
我们可以看见是一个圆圈上面呢加了一个箭头
这当然是Rational rose独有的或者它自己定义的一种表示方式
那么从这张图中 我们可以看到
控制类在整个类图里边 它处于最核心的
比如说用流行话讲 在C位
我们可以看到边界类和它有关系 实体类和他有关系
它处于整个类图的中心位置
它来组合协调其它的这些类 共同来实现用例的行为
如何来找到这些控制类呢
我们可以从用例图里边来找
对于一个用例 我们来定义对应的一个控制类
那么刚才我们也讲了 如果是复杂的用例
我们需要定义两个或者更多的控制类
一般定义一个 这样的话我们可以总结一下
我们可以从一个用例图里边分别识别出它的分析类
那么分析类里边主要就包括有三类
边界类 实体类和控制类
对于边界类来讲 根据它所交互的角色的不同
又可以把它分为用户接口的边界类
设备的边界类和外部系统或者系统接口的边界类
在我们这个例子里边 我们是一个课程教学系统里边
我们识别出来的边界类分别有
跟用户交互的课程注册表单这样一个边界类
另外呢 需要访问课程目录遗留数据库
所以有一个边界类叫课程目录系统这样的一个边界类
第二个呢 就是实体类 我们说 实体类是用来储存信息的
在我们这个例子里边 实体类有学生 有课程计划还有开设课程
第三个呢 是控制类 用来组织协调管理其它类的
对于每个用例 我们可以定义一个控制类
所以这个例子里边 我们对于课程注册这个用例
我们定义了他的控制类就叫注册控制器这样一个控制类
在识别完分析类以后
我们还要进一步的把用例的行为分配给每一个分析类
比如说我们要定义每一个分析类的职责
如何来把用例的行为分配给每一个分析类呢
我们同样 还要从用例的事件流里边
在事件流里边 描述了这个用例的执行过程
所以我们从事件流里边要去识别对应的分析类
然后我们把用例的职责
也就是事件流里的定义的用例需要做的活动分配给对应的分析类
然后我们通过建模这个分析类的对象之间是如何相互协作的
我们一般采用时序图或者通讯图的方式来描述这些类和对象之间的协作模式
通过这样一种协作 我们就可以描述
整个用例的行为是如何通过这些分析类的对象
他们之间的交互来实现的
也就是说 我们把用例的行为来分配给对应的分析类
在分配职责的时候 我们有一些基本的原则或者叫指南
基本的指南来讲呢 对于边界类
我们把需要和角色通信的这些职责分配给边界类
也就是说 接触角色的输入的 数据的 或者说命令的这些
和像角色输出的命令和数据的都放在边界类里边
第二个 实体类 当然了
它的职责就是对数据的存储 管理和封装
都放在实体类里边
最后一个就是组织业务流程的
负责管理协调其它类之间的行为的
把这样一个职责分配给控制类
也就是说我们根据类的职责 分析类的类型
给它分配对应的职责
在分配的时候 我们说在面向对象的情况下
我们通常把数据和对数据的操作分配在同一个类里边
也就是说在一个类里边
有它所需要的的数据和对数据执行的职责或者操作
但是有时候也有特殊情况 比如说
多个类需要使用到相同的数据
在这种情况下 我们的设计方式 策略可以有以下几种
第一种 我们把这个数据分配给某个类
然后其它类需要和它共享
或者说使用到相同数据的其它类和这个类之间建立一种关联关系
通过关联关系 它去请求 运用到这个数据类里边去获取数据
第二种方式 我们可以去创建一个新的类
把数据交给这个新的类进行存储或者管理
那么所有需要访问这个数据的类都和新建的这个类之间建立关联关系
然后通过新建的这个类对数据进行访问和操作
那么最后一种方式呢 是把职责分配给控制类
然后增加控制类对这个数据的相应的操作职责
对于这个类的对象
我们需要采用时序图或者通信图来描述对象之间的协作关系
我们在这个时序图或者通信图里边 我们描述了它们是相互协作的
在通信图里边 我们会定义两个类的对象以及它们之间的消息方向
以及它所接收到的消息
我们注意到这个消息是有方向的
它从客户端到这个供应者之间进行请求
这里边是它的请求消息
根据这样一个请求消息 我们可以判断
供应者这个类的对象 它是需要负责接收到这个消息的
所以在供应者这个类的对象里边 它就有这样一个职责
来对它所接收到的消息进行处理
也就是说在供应者这个类里边
需要提供一个处理所接收到的消息
执行响应所接收到的消息的操作
这是我们教学管理系统里边的一个例子
我们描述了我们前边所识别出来的对应的一些分析类
以及以通信图的方式描述了这些类与对象之间的消息协作关系
在用例分析过程中 不是一次迭代完成的
对于复杂用例来讲 可能一次迭代并不能实现对这个用例的完整分析
我们可能需要有多次迭代
同样的 对于一个复杂的用例来讲
我们说事件流里边 它除了基本流
可能还有若干个可选流
而且这些可选流可能是交织在一起的
就像我们PPT里 最左边所绘制的
所以我们需要对基本流里边 在分析的时候
我们可能对每一个流 除基本流以外的每一个可选流
都要进行分析 然后绘制它的通信图或者时序图
来描述它的事件流是如何通过对象之间的交互来完成的
这个通信图呢
我们可以看见这个通信图和时序图它二者是等价的
但是它各自表现形式不一样
他各自又有自己的侧重点
对于通信图来讲 它重点描述一个对象会和哪些对象之间有关系
也就是说 在通信图上 我们可以清楚地看见
一个对象 它和其它哪些对象之间有关系
他们的关系模式是怎样的
所以在通信图里边 他可以描述
如果一个对象被修改了 那么和我相关的其它对象可能或者说有可能都会受到影响
所以通信图呢适合我们在设计阶段采用头脑风暴的方式
我们采用通信图的方式更容易进行用例的分析
而时序图是以时间为主轴 描述了用例对象之间它的相互传输的消息序列
时序图更好地帮助我们理解整个对象之间的交互流程
它是如何一步步发生的
时序图可以描述实时系统的一些实时约束
也可以描述复杂对象之间的一些交互流程
好了 我们今天呢 我们介绍了用例分析里的第三类分析类——控制类
然后我们描述了时序图和通信图来描述这些对象之间的协作来实现用例的行为
也就是说我们如何把用例行为分配给我们所识别的这些分析类
最后我们对比了通信图和时序图它二者之间的区别
谢谢大家
-软件开发过程中的主要问题和好的解决方法
--软件开发过程中的主要问题和好的解决方法
-RUP软件开发模型的特点
--RUP软件开发模型的特点
-四个基本原则
--四个基本原则
--四个基本原则
-对象和类
--对象和类
--对象和类
-类之间的关系
--类之间的关系
--类之间的关系
-用例模型
--用例模型
--用例模型
-用例之间的关系
--用例之间的关系
--用例之间的关系
-用例建模
--用例建模
--用例建模
-分析与设计概述
--分析与设计概述
--分析与设计概述
-架构分析基本概念
--架构分析基本概念
--架构分析基本概念
-定义模型的高层组织结构
--定义模型的高层组织结构
-确定分析机制、确定关键概念、创建用例实现
--确定分析机制、确定关键概念、创建用例实现
-用例分析概述
--用例分析概述
--用例分析概述作业
-控制类
--控制类
--控制类
-用例行为和类的关系
--用例行为与类的关系
-识别设计元素概述
--识别设计元素概述
--识别设计元素概述
-识别子系统及接口
--识别子系统和接口
--识别子系统及接口
-描述运行态软件体系架构
--描述运行态软件体系架构
-描述分布式系统架构概述
--描述分布式系统架构概述
-用例设计描述
--用例设计描述
--用例设计描述
-子系统设计概述
--子系统设计概述
--子系统设计概述
-创建初始设计类、定义类操作方法
--创建初始设计类、定义类操作方法
-定义类状态
--定义类状态
--定义类状态
-定义类之间的依赖关系、关联关系以及多重性设计
--定义类之间的依赖关系、关联关系以及多重性设计
-定义类的泛化关系、解决用例冲突、非功能性需求
--定义类的泛化关系、解决用例冲突、非功能性需求