当前课程知识点:软件工程 >  第9章 面向对象分析与设计 >  9.4 类图建模 >  讲课视频-1

返回《软件工程》慕课在线视频课程列表

讲课视频-1在线视频

下一节:讲课视频-2

返回《软件工程》慕课在线视频列表

讲课视频-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 软件无处不在

--讲课视频

-1.2 软件的本质特性

--讲授视频

-1.3 软件工程的产生与发展

--讲授视频

-1.4 软件工程的基本概念

--讲授视频

-1.5 软件质量实现

--讲授视频

-1.6 业界人士谈软件工程

--海芯科技创始人施侃乐访谈

-测验题--作业

-讨论题

--讨论题

-作业题

--第一张 作业题

第2章 编写高质量代码

-2.1 编程过程与规范

--讲课视频

-2.2 良好的编程实践

--讲课视频

-2.3 Python集成开发环境

--讲课视频

-2.4 代码静态检查

--讲课视频

-2.5 代码性能分析

--讲课视频

-2.6 结对编程实践

--讲课视频

-2.7 刘贺谈软件工程

--讲课视频

--讨论

-测验题--作业

-作业题

--第二章 作业题

第3章 单元测试

-3.1 单元测试概述

--讲课视频

-3.2 黑盒测试方法

--黑盒测试方法

-3.3 白盒测试方法

--基本概念

--代码覆盖标准

--基本路径测试

-3.4 单元测试工具

--单元测试工具

--html

-测验题--作业

-作业题

--第三章 作业题

--作业题附件

第4章 软件开发过程

-4.1 软件过程

--讲课视频

-4.2 软件过程模型

--讲课视频

-4.3 敏捷开发过程

--讲课视频

-4.4 微软公司开发过程

--邹欣经理自我介绍

--微软开发过程之一

--微软开发过程之二

-测验题--作业

第5章 团队开发管理

-5.1 团队组织与管理

--讲课视频

-5.2 项目沟通管理

--讲课视频

-5.3 软件项目计划

--讲课视频

-5.4 软件项目估算

--讲课视频

-测验题--作业

-讨论题

--讨论

第6章 敏捷开发与配置管理

-6.1 敏捷开发之Scrum

-- 敏捷开发之Scrum

--html

-6.2 用户故事与估算

--讲课视频

-6.3 团队协作工具Tower

--Tower工具介绍(1)

--Tower工具介绍(2)

-6.4 配置管理

--讲课视频

-6.5 配置管理工具Git

--讲课视频

-测验题--作业

-作业题--作业

第7章 需求获取

-7.1 需求工程师

--讲课视频

-7.2 需求定义

--讲课视频

-7.3 需求的类型

--讲课视频

--讲课视频(2)

-7.4 需求工程过程

--讲课视频

-7.5 需求的主要来源

--讲课视频

-7.6 需求获取技术

--讲课视频

--讲课视频二

--讲课视频三

-7.7 撰写需求文档

--讲课视频

-测验题--作业

-讨论题

--讨论

第8章 用例建模

-8.1 用例建模概念

--讲课视频

-8.2 用例建模过程

--讲课视频

-8.3 用例建模精讲

--讲课视频

-8.4 建模工具介绍

--讲课视频

-8.5 微信抢票应用案例

--讲课视频

-测验题--作业

-讨论题

--讨论

第9章 面向对象分析与设计

-9.1 面向对象分析

--讲课视频

-9.2 CRC卡片分拣法

--讲课视频-1

--讲课视频-2

-9.3 面向对象设计

--讲课视频-1

--讲课视频-2

-9.4 类图建模

--讲课视频-1

--讲课视频-2

-第9章 面向对象分析与设计--测验题

-讨论题

--讨论

第10章 行为建模

-10.1 顺序图概念

--讲课视频

-10.2 顺序图建模

--讲课视频

-10.3 顺序图风格

--讲义视频

-10.4 状态建模

--讲课视频

-10.5 状态图

--讲课视频

-10.6 状态图精讲

--讲义视频

-测验题--作业

-讨论题

--讨论

第11章 软件系统设计

-11.1 软件体系结构概念

--讲授视频

-11.2 软件设计原则

--讲授视频

-11.3 软件体系结构风格(一)

--讲授视频

-11.4 软件体系结构风格(二)

--讲授视频

-11.5 软件体系结构风格(三)

--讲授视频

-11.6 软件设计过程

--讲授视频

-11.7 Web系统架构设计

--讲授视频

-11.8 数据库选择策略

--讲授视频

-测验题--作业

-作业题

--html

--html

--html

-作业题--作业

第12章 软件交互设计

-12.1 交互设计概述

--讲授视频

-12.2 交互设计目标

--讲授视频

-12.3 GUI设计原则

--讲课视频

-12.4 KLM效率模型

--Video

-12.5 Fitts定律

--讲授视频

-12.6 交互设计过程

--讲授视频

-测验题--作业

第13章 软件系统测试

-13.1 软件测试概念

--讲课视频

-13.2 软件测试类型

--讲课视频

-13.3 软件功能测试

--讲课视频

-13.4 软件性能测试

--讲课视频

-测验题--作业

第14章 软件交付与维护

-14.1 软件部署与交付

--讲课视频

-14.2 软件演化与维护

--讲课视频

-测验题--作业

第15章 期末考试与总结

-第一部分:基础知识

-第二部分:编程与测试(选做)

--编程与测试(选做)

讲课视频-1笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。