当前课程知识点:软件工程 > 第9章 面向对象分析与设计 > 9.4 类图建模 > 讲课视频-1
下面我们介绍
UML类图有关的内容
类 对象和它们之间的关系
是面向对象技术中最基本的元素
类图技术是OO方法的核心
类 图标和它们之间的关系
就组成了一个类图
那么 类究竟是什么
类是以下特征的对象的集合
换句话说
我们可以把类看成是一个大口袋
在每一个类中
这个口袋中装的都是
从属于这一个类的
所有对象元素的一个集合
那么这些对象有什么相同点
首先 它们具有相同的性质
也就是属性
其次 它们具有相同的行为
也就是操作
还有这些对象
它们和外界的其它对象
以及彼此之间都有着同样的关系
还有这些对象
它具有相同的建模的语义
也就是说
它在含义上也是相同的
类图描述的是类和类之间的
静态的关系
它和数据模型不同的是
它不仅显示了信息的结构
其实也包含了系统的行为
例如
在下面的这个图中
建模的就是雇员
这样一个类的对象的行为
每一个雇员我们都关注
他的姓名
他的员工号
他所属的部门
而关于雇员
我们相关的服务包括
他的受雇 他的解雇
以及他的项目任务的分配
所以通过这个模型
我们就知道
在当前的这个问题上下文下
我们关注的是这个类对象的
哪些方面的性质和行为
它将和其它的外部对象
发生什么样的交互关系
另外一个核心的概念就是对象
对象是类的实例
它的表示方法和类 图标差不多
但是对象名的定义
是要包括具体这个实例的名字
而它的属性的定义
是要包括属性的具体取值
两个不同的对象
它可以有相同的属性取值
正如我们在现实生活中
会碰到相同名字的人
住在相同地址的人
这些都是它们属性取值相同
但是 它的身份是不同的
对象和其它的对象在现实世界中
有着各种各样的关联关系
比如说
这一个叫Fred Bloggs的雇员
他和KillerApp这个项目对象之间
有着关联
也就是说
他被分配到完成这个
KillerApp这个项目
但是我们在定义
这些对象之间的关系的时候
是要在类的层次上定义
为什么
因为我们是要定义
可以重用的对象之间的关系
而不仅仅是考虑一个
具体的问题
在对象的定义过程中
我们要注意的一点是
对象的属性
要把它划归到合适的类层次中去
而且 我们要注意在属性的定义中
最主要的一点是封装
也就是说 属性应该是这个对象
私有的一个信息的部分 信息单元
外部的对象要访问这个属性的话
是需要访问这个对象
对外提供的服务来进行的
因此 我们就不能把
比如说类似
经理姓名和员工编号同时定义在
Project类的属性里
而应该把这两者定义到
经理或者是员工这个对象中
然后在Project中
只用唯一的一个ID
去引用这个经理
这样我们才能够保证
数据的封装的完整性
属性的定义
是类定义的主要方面之一
在为类选取属性的时候
我们要考虑的是
通过这些定义的属性
我们能够描述并区分该类对象
我们只把系统感兴趣的那些特征
放在类的属性定义中
根据图的详细程度
每条属性可以包括
可见性 名称 类型 多样性
初值和约束
其中
属性的可见性主要分为四类
一是公有属性
那么公有属性就是
所有都可以访问的属性
在建模过程中
我们应该尽量避免使用公有属性
因为它破坏了数据封装的原则
而应该尽量多用私有属性
私有属性
是那些只能自己访问的信息对象
受保护的属性
是指只有它的直接的子类对象
可以访问的那些属性
右边给出了一些属性声明的例子
我们可以看到公有属性
是用加号来标志的
私有属性是用减号来标志的
我们用#号来表示
这个属性是受保护的属性
而用飘线来表示
它的可见性是对同包的对象
同一个Package内的对象
可见的这样的属性
当我们在一个属性定义的最后
加上0..1
这样的标志的时候
就表示这个属性有可能取空值
在应用系统中的对象
并非遗世独立的
对象之间存在着千丝万缕的联系
我们就用类关系
来建模对象之间的关系
在UML中
我们关注以下几种类型的关系
关联关系 聚合和组合关系
泛化关系也就是继承关系
依赖关系和实现关系
这里聚合和组合
是关联关系的特例
继承关系是类与类之间的
一种层次关系
依赖关系是彼此使用服务的
这样的关系
实现关系则是指具体类
对抽象的接口的实现
在后两者的建模
它是比较直观
而且运用的场景也比较特殊
我们主要要考虑的
就是关联关系和泛化关系
以及关联关系的特例
表达整体部分关联的
聚合和组合关系
在这页片子中的下面
我们给出了一个类图
以及描述了图中三个类彼此之间
关联关系的实例
按照关联关系所连接的类的数量
我们将类之间的关联分为三类
一是自返关联
一是二元关联
一是N元关联
二元关联是我们最常见的
类与类之间的关联关系
它表达的是在两个类之间
发生的关联
自返关联它的特殊性在于
它是一个类与本身发生的
关联关系
它虽然只有一个被关联的类
但是却有两个关联端
每个关联端在这个关系中
所扮演的角色是不同的
N元关联则指的是
在三个或三个以上的类之间
发生的关联关系
在N元关联中
它的多样性的定义也是不同的
我们下面就来看看
多样性是什么概念
在关联关系中
多样性有时候也叫做维度
它实际上是在试图约束
在关联关系中对象的数量
比如 在上一页的类图中
关联关系
是在试图回答以下的问题
在一个市场活动类对象
存在的时候
是不是一定要有一个员工类对象
同时存在
如果是这种情况的话
那么员工对象是必选的
它的多样性或者维度的定义
就应该是一或者多个
如果市场活动对象
能够在没有员工类对象
存在的时候独立存在的话
那么员工对象类的一端
就是可选的
因此它的多样性或者维度的定义
就可以是零到N
如果二者之间的关系是
市场活动类对象
只能由一个员工对象管理
而且必须有一个员工对象
来管理的话
那么它的多样性和维度的定义
就是一
我们对另一端关联
也问同样的问题
是不是每位员工都必须要管理
而且管理一项市场活动
如果不是的话
市场活动一端的多样性定义
就为零到N
由此可以看出
我们可以用多样性
来约束应用领域中定义的
这些对象彼此之间的对应关系
是一种定义业务逻辑的方法
多样性的定义
我们可以看更多的例子
当类的存在
类对象的存在是可选择的时候
我们可以把它定义为
零或者一开始
有且仅有一个的时候
那么它只能是一
当可以是多个的时候
而且是可以没有的时候
就是零到多个
这是最灵活的一种方式
当必须有
而且也可以有多个的时候
就是一到N
我们也可以把它定义为一个
取值范围
不是从零一开始的取值范围
所以多样性
它实际上定义的是一个类对象
在关系中发生的必要 可选
以及最多的数量
回到我们刚刚提到的N元关联
那么N元关联中
类的多样性的定义的意义是
在其它N-1个实例的值
确定的情况下
关联实例它的允许的元素个数
关联是模型元素间的
一种语义关系
它是对具有共同的结构特征
行为特征 关系和语义的
链的描述
在类图中关联用一条
把类连接在一起的实线来表示
关联至少有两个关联端
每个关联端连接到一个类
关联可以有方向
有方向的关联类称为单向关联
没方向的类成为双向关联
通过给关联加上关联名
我们可以描述关联的作用是什么
关联的名字
通常是用动词来表示的
关联的命名原则是
要看这个命名是否有助于
我们理解该模型
除了上述的这些基本的元素
我们知道
还有关联的多样性的定义
以及类在这个关联关系中
所处的角色的定义
我们需要注意的一点是
在通过模型驱动的
软件 设计 工具 完成
从模型到源代码的转换过程中
对源代码有影响的部分
是角色的定义和关联的方向
也就是说
当是一个单向关联
并且有角色的定义的时候
我们会在生成的代码中
声明相应的类的属性
关联本身也有一些性质
我们通过关联类
来进一步描述关联的属性
操作以及其它的信息
关联类通过一条虚线
和关联的实线相联系
保存关联关系本身的这些信息
比如 在这个图中
title类对象它就是存储的是
在车主和车辆之间的
所属关系有关的信息
包括是哪一年购买
购买的时候的里程数
当时所付的钱数
以及新注册的号牌
当我们采用工具
基于模型生成代码的时候
关联类也生成对应的源代码
我们可以看到代码生成的过程中
我们把类的声明
以及相应的属性声明
和关联带有角色的
这样的关联端
都生成了类属性的
相应的变量声明
这里要提醒同学们注意的一点是
在进行关联建模的时候
一个良构的关联的定义
是要一对多的这样的关联多样性
那么为了确保把多样性
从N降为一
我们就引入了一个
特殊的建模元素叫做限定符
通过引入限定符
我们可以把原本是
N对N的这样的关联关系
降为一对N
这样的话 如果做查询操作的话
返回的对象会是一个
而不是一个对象集合
通过多样性 我们可以判断
对象设计的好坏
如果一个应用系统
需要根据关键字
对一个数据集做查询操作的话
我们会往往会用到
限定关联来降解多样性
在这个片子中
图上的就是一个限定符的例子
在没有加入限定符之前
银行帐户和用户之间
是一个多对多的关系
但我们通过加入了
帐户这个限定符的时候
每一个帐户
它一定是对应零或者一个用户的
限定符是关联的一个属性
它的作用就是给关联的一端
的一个对象加了一个限定值
确保另一端的对象
是一个对象
那这里
我给大家提一个问题就是
我们需不需要给限定符来
指定初始值
您简单思考一下
对 答案是不需要的
因为限定符并不是一个自由变量
每当一个新的关联链
被创建的时候
它的限定的变量值
都是已经预先定义好的
表达整体与部分关系的
是聚合和组合关系
它是关联关系的一个特例
聚合关系表达的是一个整体对象
和它的成员对象之间的关系
聚合关系的
那个代表部分事务的对象
是可以属于多个聚合对象的
也就是说
它可以在多个整体对象之间共享
它还可以随时改变
它所从属的那个整体对象
部分对象
它和整体对象的生存期是无关的
一旦删除了它的一个聚合对象
这个部分对象
还仍然是能够独立存在的
而组合对象
它是聚合的一个特例
它所代表的
是一个整体对象和部分
组成之间的关系
二者之间的所属关系更强
当整体对象不存在的时候
部分类的对象也不存在
反之亦然
整体类对象撤销的之前
要负责将它全部的
部分类对象撤销
也就是说
代表整体事物的组合对象
要负责创建和删除
代表部分对象的那个成员
代表部分对象的这个事物
它只能从属于一个整体对象
一旦删除了整体
部分也随之消亡
在确定了类的行为和属性以后
我们其实是很容易
对这两种情况进行区分的
比如 一个窗口和它附属的按纽
应该定义为组合关系
因为二者具有相同的生命周期
一个的破坏会导致另一个的消亡
反之
一个由同类元素组成的集合
和其个体元素之间
应该是聚合关系
因为元素的创建和消亡
并不完全同步
在生成代码的时候
我们需要为组合关系类
考虑同步问题
而聚合关系则不需要
聚合关系它的实力之间
是有传递关系是一个偏序关系
那么聚合和关联关系的区别在于
聚合关系的实例
是不能形成环的
运用聚合和组合
简化了对象的定义
更好的支持软件重用
在后边的介绍中
我们会知道
其实 这种组合关系
要比继承关系
应用起来更加灵活方便
在这一页片子中 图中
我们可以看到
我们将汽车和它的引擎
定义为组合关系
因为这二者的生存周期
有很强的绑定
而车和它的乘客之间
则是一种聚合关系
乘客上下车
它们的关系是临时性的
可以动态的变化的
-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 软件演化与维护
--讲课视频
-测验题--作业
-第一部分:基础知识
-第二部分:编程与测试(选做)