当前课程知识点:软件工程 > 第9章 面向对象分析与设计 > 9.4 类图建模 > 讲课视频-2
在面向对象的设计中
我们对继承关系寄予厚望
我们希望通过子类
继承父类的属性
关联和操作来实现重用
支持抽象
而子类在继承的过程中
当发现有特殊的情况
要处理的时候
它也可以覆盖继承得来的
那些属性和操作
比如在右图中
行政员工和专业设计人员
他的奖金的计算方式
可以是不同的
我们在员工类中
可以把相应的
无法具体化的这部分内容
定义为抽象的
甚至可以把整个类定义为抽象类
那么我们就不再会为它
直接创建实力对象
这种情况下
现有的子类将覆盖这个抽象类的
所有对象
形成一个全集 完全的覆盖
比如
在(00:01:12)
这个公司中除了行政员工
和专业设计人员以外
不会再存在
其它类型的员工类性
继承关系的定义
我们主要通过学习当前领域的
分类学知识
以及常识上事物的分类方法
来获得
继承关系建模的意义在于
当系统的环境发生变化的时候
我们可以为它增加新的子类
来处理新发生的特殊情况
继承或者泛化关系建模
可以有两种方式
既可以是自顶向下的
将某个类分割为属性和操作
具有特殊性的子类
也可以自底向上
为现有的多个
具有公共属性和方法的类
定义抽象的父类
这两者在现实中都会发生
因此
我们可以根据情况灵活掌握
最主要是要考察类的属性和操作
是否有特性或者共性
看两个类的对象之间
是否存在父子关系
这里我们又给出了一个自顶向下
定义继承关系的例子
这里我们要处理的是一个
广告公司的系统
那么它的主营业务就是
为媒体制作各种类型的广告
这些广告
天然的就有一个分类体系
包括报纸的广告 杂志的广告
街头的广告板
以及广告短片等等
这样按照这个天然的分类
我们就把广告类型
建立了一个分类框架
也就是继承的层次关系
广告分类为街头广告板
媒体广告和广告短片
媒体广告又分为报纸和杂志
这样我们就获得了一个
自顶向下的继承关系的定义
这里我们给出的是
自底向上定义继承关系的
过程实例
比如
如果在我们建模的领域里
书籍和唱片它们都有一些属性
和操作的定义
而对比二者的属性和操作
我们发现了公共的属性
以及公共的操作
好 那么对它进行抽象
我们就得到了一个公共的父类
就是可以出借的单元
我们将这二者它们的名字
杜威码和获取编号
以及外借和归还的操作进行抽象
定义它们的公共父类
再把二者不同的属性
放在各自的子类定义当中
完成了继承关系的重组
总结一下 在类图建模的过程中
我们要识别类
定义类的名字
定义属性的名字
定义这个类的操作
并建立类和类之间的继承关系
组合关系 聚合关系
并定义这些关联关系的多样性
方向和名字
这样我们就完成了一个
基本的类图建模的过程
需要注意的一点是
在软件开发的不同阶段
我们都会使用到类图
但是类图它的抽象层次
是不一样的
主要分为三个层次
早期的分析阶段的概念类
设计阶段的说明类
和最后实现阶段的实现类
这三种层次的类图
它内部包含的信息的丰富程度
以及变量定义的准确程度
是不一样的
我们可以看到
在早期的概念类
我们更多的是把类实体定义出来
在设计说明阶段
我们是要把类的属性
和它的相应的行为
代表它行为的这些操作定义出来
而在实现类中
类图是和我们的代码实现
基本对应
也就是这个时候
类型已经定义出来了
参数的具体的类型
也要和程序设计语言相对应
那我们可以看出
在这里头 我们可以用不同的版型
来声明我们当前的类
是属于哪一个层次的
建立类图的步骤包括
研究分析问题领域
确定系统的需求
发现对象和类
明确它们的含义和职责
确定类的属性和操作
发现类之间的关系
把类之间的关系用关联
泛化 聚集 组合
依赖等关系表达出来
并进一步细化
设计类和它们之间的关系
解决类似命名冲突
功能重复等问题
并最终用图形化的方式绘制出来
在类图建模的过程中
我们给出以下的
对类图建模风格的建议
首先 尽量保持类属性的名字
和类型的一致性
比如如果我们
声明的属性的名字是
Customer Number
那么它的值应该是数值型
而不应该是字符串
否则就存在了不一致的问题
另外我们不要对那些
有关联类的关联再去命名了
因为关联类本身的名字
就是用于描述该关联的
再额外增加修饰
指明它的名字就没必要了
其次 静态的操作和属性
要在实例操作属性之前列出
按照可见性的
降次的次序来列出操作和属性
因为那些对外可见的属性
可能外人对它的
感兴趣的可能性更强
我们要避免使用
那些已经在命名规范中
隐含了的版型
比如constructor
getter setter
在右上角中间的
这个类的声明中就是多余的
另外在类的关联关系
定义的过程中
总是要指明多样性
对于聚合和组合关系
如果多重性是一
我们可以标出来
这样我们知道
建模的人员考虑过多重性
而不是遗漏掉了
我们不要对每个依赖关系都建模
这样会让我们的类图非常的复杂
子类要放在父类的下边
另外我们还要注意
基于数据的这样的继承
如果两个类之间
存在继承关系的唯一原因是
它们有公共的数据的属性的话
那么我们一定是遗漏了
某些公共的行为
要么
我们就是应该使用关联关系
而不使用继承关系
建模的图例的排列
应该是把整体画在部分的左边
比如在右图中
Team和Airplane
分别是Employee
和Component的整体类
我们就按这样的布局
阅读起来比较方便
-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 软件演化与维护
--讲课视频
-测验题--作业
-第一部分:基础知识
-第二部分:编程与测试(选做)