面向对象分析与设计方法

面向对象方法与UML

软件工程 第三部分 第5章,主讲人:李欣

Created: 2024-03-05 Tue 16:42

0.1. 互动课堂

Click to host the seminar.

0.2. 签到

https://dash.memopixel.com/tool/attendance/

0.3. 本次课的目标

  • 第三部分:面向对象分析与设计方法
    • 第5章:面向对象方法与UML
      • 面向对象的概念与开发方法
      • UML简介
      • UML的事物
      • UML的关系
      • UML的图

1. 面向对象的概念与开发方法

面向对象 = 对象 + + 继承 + 消息通信

  • 如果一个系统是使用以上4个概念设计和实现的, 则可认为这个系统是 面向对象 的。
  • 面向对象程序的基本组成单位是

程序在运行时由 生成 对象 ,对象之间通过发送消息进行 通信 , 互相协作完成相应的 功能

对象 是面向对象程序的核心。

1.1. 对象

对象 = 数据 + 作用于这些数据上的 操作

1.1.1. 对象的表示

object-representation.png

Figure 1: 对象的图形表示

对象名的3种表示格式
对象名在前、类名在后的情况
对象名:类名
尚未给对象命名的情况
:类名
省略类名的情况
对象名

1.1.2. 对象的分类

两个层次的对象的概念
  • 现实生活中的对象 指的是客观世界的 实体
    • 可见的有形对象(人、学生、汽车、房屋)
    • 抽象的逻辑对象(银行账号、生日)等
  • 程序中的对象 指的是一组 变量 和相关 方法 的集合
    • 变量 ,表明对象的状态
    • 方法 ,表明对象所具有的行为
5类程序中的对象
  • 物理对象(physical object)
  • 角色(role)
  • 事件(event)
  • 交互(interaction)
  • 规格说明(specification)
每个应用系统可以拥有某几种或所有对象,但不必特意对每个对象进行分类。

1.2. 类与封装

1.2.1.

  • 可以将现实生活中的 对象 经过 抽象 而映射为程序中的 对象
    • 对象 在程序中是通过一种 抽象数据类型 来描述的,这种抽象数据类型称为 (class)。
      • 对象 的具体实例。
    • 是具有 相同操作功能相同数据格式 (属性)的对象的集合与抽象。
      • 一个 是对一类 对象 的描述,是构造 对象 的模板。

class-representation.png

Figure 2: 类的图形表示

1.2.2. 封装

封装的概念
  • 封装 是一种 信息隐蔽 技术,利用 抽象数据类型数据 和基于数据的 操作 封装在一起。
  • 用户只能看到对象的封装 接口 信息,看不到对象的 内部细节
封装的目的
  • 将对象的 设计者使用者 分开,
    • 设计者 完成行为 实现 的细节,
    • 使用者 不必知道细节,只需使用设计者提供的 操作 来访问对象。
封装的定义
  • 清楚的 边界 ,所有对象的内部信息被限定在这个边界内;
  • 接口 ,即对象向外界提供的方法,外界可以通过这些方法与对象进行交互;
  • 受保护的 内部实现 ,即软件对象功能的实现细节,实现细节不能从类外访问。

1.3. 继承

公共类
  • 超类(superclass)
  • 父类(parent class, father class
  • 祖先(ancestor)
  • 基类(base class)
扩展类(从公共类继承的类)
  • 子类(subclass, child class)
  • 后代(descendant)
  • 导出类(derived class)

superclass-subclass-definition.png

Figure 3: 教材中定义的公共类与扩展类

class-inheritance-relationship.png

Figure 4: 类的继承关系

1.4. 多态

%%{init: { 'theme': 'neutral', 'fontFamily': 'KaiTi' }}%%
graph TB
    S["启动"] --- A["汽车的启动"]
    S --- B["轮船的启动"]
    S --- C["气球飞艇的启动"]
    S --- D["......的启动"]    
@startuml
skinparam defaultFontName Times New Roman, KaiTi
left to right direction
title 交通工具的启动
node 启动
启动 -[#red]-> 汽车的启动
启动 -[#green]-> 轮船的启动
启动 -[#blue]-> 气球飞艇的启动
汽车的启动 -[#red]-> 发动机点火and启动引擎
轮船的启动 -[#green]-> 起锚
气球飞艇的启动 -[#blue]-> 充气and解缆
@enduml

start-up.svg

Figure 5: 交通工具的启动

多态 是指一个程序中 同名 的不同 方法 共存 的情况。 主要通过子类对父类方法的 覆盖 来实现多态。

https://memopixel.com/course/java/slides/lesson-6

1.5. 消息通信

消息 是一个对象向另一个对象传递的 信息

4类消息
  • 发送对象 请求 接收对象 提供服务;
  • 发送对象 激活 接收对象
  • 发送对象 询问 接收对象
  • 发送对象传送 信息给 接收对象

1.6. 面向对象的软件开发方法

  • 在进行 面向对象系统开发 时,是按照 OOA - OOD - OOP 的顺序进行的,
  • 面向对象方法 却是按照 OOP - OOD - OOA 的顺序逐渐发展成熟起来的。
%%{init: { 'theme': 'forest', 'fontFamily': 'Times New Roman, KaiTi' }}%%
graph LR
    OODM["面向对象开发方法"]
    OODM --- OOA["面向对象分析(Object-Oriented Analysis, OOA)"]
    OODM --- OOD["面向对象设计(Object-Oriented Design, OOD)"]
    OODM --- OOP["面向对象编程(Object-Oriented Programming, OOP)"]

object-oriented-development-method.svg

Figure 6: 面向对象开发方法

Booch方法
  • 微开发过程
  • 宏开发过程
    • 标识 对象
    • 标识 类和对象的 语义
    • 标识 类和对象间的 关系
    • 进行一系列 精化
    • 实现 对象
Rumbaugh方法
  • 对象模型 :描述对象、类、层次和关系;
  • 动态模型 :描述对象和系统的行为;
  • 功能模型 :类似于高层的DFD,描述穿越系统的信息流。
Coad和Yourdon方法
  • 使用 要找什么 准则 标识 对象
  • 定义 对象之间的 一般化 - 特殊化 结构(又称为继承结构);
  • 定义 对象之间的 整体 - 部分 结构(又称为组装结构);
  • 标识 主题 (系统构件的表示);
  • 定义 对象的 属性 及对象之间的 实例连接
  • 定义 服务 及对象之间的 消息连接
Jacobson方法
  • 标识 系统的 用户 和它们的整体 责任
  • 通过定义参与者及其职责、用例、对象和关系的初步视图, 建立
    需求模型
  • 通过标识界面对象、建立界面对象的结构视图、表示对象行为、分离出每个对象的子系统和模型, 建立 分析模型
Wirfs-Brock方法
  • 评估 客户 规格说明
  • 使用语法分析从规格说明中 提取 候选类
  • 将类分组以 标识 超类
  • 定义 每个类的 职责
  • 职责 赋予 每个类;
  • 标识 类之间的 关系
  • 基于职责 定义 类之间的 协作
  • 建立 类的 层次表示
  • 构造 系统的 协作图

2. UML简介

2.1. UML的产生和发展

uml.png

Figure 7: UML吸收了许多面向对象方法的优点

2.2. UML的特点

  • 统一标准
  • 面向对象
  • 可视化
  • 独立于过程
  • 容易掌握使用
  • 与编程语言的关系

2.3. UML的基本模型

uml-building-blocks.png

Figure 8: UML的基本模型

3. UML的事物

事物(Things) 是对模型中最具代表性成分的 抽象

UML中的事物的分类
  • 结构事物(Structural things)
  • 行为事物(Behavioral things)
  • 分组事物(Grouping things)
  • 注释事物(Annotational things)

uml-things-representation.png

Figure 9: UML基本事物的图形表示

3.1. 结构事物

结构事物 是UML模型的 静态部分 ,主要用来描述概念的或物理的 元素

结构事物
  • 类(class)
  • 主动类(active class)
  • 接口(interface)
  • 对象(object)
  • 用例(use case)
  • 参与者(actor)
  • 协作(collaboration)
  • 构件(component)
  • 节点(node)

3.2. 行为事物

行为事物 是UML模型的 动态部分

行为事物
  • 交互(interaction)

object-interaction.png

Figure 10: 对象之间的交互

  • 状态机(state machine)

3.3. 分组事物

分组事物 是UML模型的 组织部分 ,它的作用是为了降低模型的复杂性。 UML中的分组事物是包(package)。

3.4. 注释事物

注释事物 是UML模型的 解释部分 ,它们用来描述和标注模型的任何元素。 通常可以用注释修饰带有约束或者解释的图。

4. UML的关系

UML中常见的4种关系
  • 依赖
  • 关联
    • 普通关联
    • 限定关联
    • 关联类
    • 聚合、复合
  • 泛化
    • 普通泛化
    • 受限泛化
  • 实现

uml-relationships-representation.png

Figure 11: UML中的关系(Relationships)

4.1. 依赖关系

依赖(dependency) 是两个事物之间的语义关系,其中一个事物发生变化会影响到另一个事物的语义, 它用一个 虚线箭头 表示。

虚线箭头的方向从 源事物 指向 目标事物 ,表示 源事物 依赖于 目标事物

uml-relationships-dependency-example.png

Figure 12: 依赖关系示例

4.2. 关联关系

关联(association) 是一种结构关系,它描述了两个或多个类的实例之间的连接关系, 是一种特殊的依赖。

关联的实例称为 (link),每一条链连接一组 对象 (类的实例)。

  • 普通关联
  • 限定关联 (qualified association)
  • 关联类 (association class)
  • 聚合 (aggregation)
    • 共享聚合 (shared aggregation)
    • 复合聚合 (composition aggregation)

4.2.1. 普通关联

普通关联 是最常见的关联关系,只要类与类之间存在连接关系就可以用普通关联表示。 普通关联又分为 二元关联多元关联

binary-association.png

Figure 13: 二元关联

association-role.png

Figure 14: 关联中的角色

self-association.png

Figure 15: 自身关联

ternary-association.png

Figure 16: 三元关联及相应类实例连接的链

4.2.2. 限定关联

限定关联(qualified association) 通常用在一对多或多对多的关联关系中, 可以把模型中的多重性从一对多变成一对一,或将多对多简化成多对一。

qualified-association.png

Figure 17: 限定关联

4.2.3. 关联类

在关联关系比较简单的情况下,关联关系的语义用关联关系的名字来概括。 但在某些情况下,需要对关联关系的语义做详细的定义、存储和访问, 为此可以建立 关联类(association class) 来描述关联的属性。

association-class-example.png

Figure 18: 关联类的示例

4.2.4. 聚合

聚合(aggregation) 也称为聚集,是一种特殊的关联, 描述了整体和部分之间的结构关系。 在需求陈述中,若出现 包含组成分为……部分 等字句, 往往意味着存在聚合关系。

aggregation-example.png

Figure 19: 聚合

4.2.5. 导航

导航(navigability) 是关联关系的一种特性, 它通过在关联的一个端点上加箭头来表示导航的方向。

navigability.png

Figure 20: 导航

4.3. 泛化关系

泛化(generalization) 关系就是 一般(generalization)类特殊(specialization)类 之间的继承关系。

4.3.1. 普通泛化

abstract-class.png

Figure 21: 抽象类

multiple-inheritance.png

Figure 22: 多重继承

4.3.2. 受限泛化

受限泛化 关系是指泛化具有 约束条件

预定义的4种约束条件
  • 交叠 (overlapping)
  • 不相交 (disjoint)
  • 完全 (complete)
  • 不完全 (incomplete)

qualified-generalization.png

Figure 23: 受限泛化

4.4. 实现关系

实现(implement) 是泛化关系和依赖关系的结合,也是类之间的语义关系。 通常在以下两种情况出现实现关系:

  • 接口和实现它们的类或构件之间;
  • 用例和实现它们的协作之间。

implement-example.png

Figure 24: 实现关系

5. UML的图

结构图 用于系统的 静态建模行为图 用于系统的 动态建模

结构图
  • 类图(class diagram)
  • 组合结构图(composite structure diagram)
  • 构件图(component diagram)
  • 部署图(deployment diagram)
  • 对象图(object diagram)
  • 包图(package diagram)
  • 造型图(profile diagram)
行为图
  • 活动图(activity diagram)
  • 用例图(use case diagram)
  • 状态图(state diagram)
  • 顺序图(sequence diagram)
  • 交互概览图(interaction overview diagram)
  • 通信图(communication diagram)
  • 定时图(timing diagram)

uml-diagrams.png

Figure 25: 结构图和行为图的分类

5.1. 用例图

use-case-diagram-example.png

Figure 26: 用例图的建模元素

use-case-diagram-bank-system.png

Figure 27: 银行储蓄系统的用例图

5.2. 类图

class-diagram-bank-system.png

Figure 28: 银行储蓄系统的核心类图

class-diagram-teaching-management-system.png

Figure 29: 教学管理系统中的类图

association-class-student-course-score.png

Figure 30: 关联类

5.3. 顺序图与通信图

5.3.1. 顺序图

sequence-diagram-example.png

Figure 31: 顺序图中的符号

message-type.png

Figure 32: 消息的类型

sequence-diagram-withdraw.png

Figure 33: 取款用例的顺序图

5.3.2. 通信图

communication-diagram-withdraw.png

Figure 34: 取款用例的通信图

5.4. 状态图

state-diagram-elevator.png

Figure 35: 电梯对象的状态图

5.5. 活动图

activity-diagram-example.png

Figure 36: 活动图中的符号

activity-diagram-withdraw.png

Figure 37: 取款用例的活动图

5.6. 构件图与部署图

5.6.1. 构件图

component-diagram-paint-system.png

Figure 38: 画图系统的构件图

component-diagram-bank-system.png

Figure 39: 银行储蓄系统的构件图

5.6.2. 部署图

deployment-diagram-example.png

Figure 40: 部署图

6. 课后作业

  1. 习题5.1 UML中有哪些基本的事物,一般可分为哪几种类型?
  2. 习题5.2 UML中有哪些关系?解释类图中聚合和关联的相同点和不同点。
  3. 习题5.3 UML中有哪几种图?每种图的作用是什么?