1. 课程定位:我们在哪里?
软件开发背景
- 软件开发三阶段:计划阶段 $\rightarrow$ 开发阶段(需求分析、系统设计、开发、测试) $\rightarrow$ 运行阶段。本章主要处于开发阶段。
- 软件危机:31.1%的项目因需求没做好而取消。
- 核心痛点:需求不完整、缺乏用户交流、需求不现实。
- 需求分析方法演变:
- 结构化分析:数据流图 (DFD)、实体关系图 (E-R)、数据字典 (DD)。
- 面向对象分析 (OOA):本章重点,使用 UML 进行建模。
2. 面向对象分析与设计 (OOAD)
核心概念
- OOAD (Object-Oriented Analysis and Design):
- OOA (分析):从需求角度,用面向对象思想分析业务,识别“对象”和“本质”。
- OOD (设计):中间过渡,对 OOA 结果进行规范化整理,为编程做准备。
- OOP (编程):用代码(如 Java/Python)实现设计,像搭积木一样开发。
- 公式:OOAD = OOA + OOD + OOP
为什么要画图 (UML)?
- 消除鸿沟:连接“需求分析”与“系统设计”,提供一致的表示法。
- 沟通工具:相比纯文字,图形化(如 UML)能更准确、直观地传达信息。
3. 用例图 (Use Case Diagram) —— ★ 考试重点
定义:从用户角度描述系统功能,展示“谁”使用了“什么功能”。
核心元素
- 参与者 (Actor):
- 系统外部的人、设备或其他系统。
- 注意:Actor 永远在系统边界之外。
- 系统边界 (System Scope):
- 界定系统范围的矩形框,用例在框内,Actor 在框外。
- 用例 (Use Case):
- 椭圆表示,代表系统提供的功能/服务(如“借书”、“取款”)。
- 助教补充:用例命名通常是“动宾结构”。
四大关系 (易混淆点)
- 关联 (Association):实线连接 Actor 和 Use Case。表示“谁启动了功能”。
- 包含 (Include)
<<include>>:- 必选动作。基础用例必须调用被包含用例才能完成。
- 例子:“取款”包含“验证密码”。(不验证密码就无法取款)
- 箭头方向:基础用例 $\rightarrow$ 被包含用例。
- 扩展 (Extend)
<<extend>>:- 可选动作。在特定条件下才执行的附加功能。
- 例子:“点菜”扩展出“VIP打折”。(不是所有人都是VIP)
- 箭头方向:扩展用例 $\rightarrow$ 基础用例。
- 泛化 (Generalization):
- 即继承关系。子用例继承父用例的行为。
- 例子:“转账”是父用例,“跨行转账”是子用例。
4. 类图 (Class Diagram) —— ★ 核心考点
定义:描述系统中类的静态结构及其相互关系。是面向对象的基石。
类的构成
- 类名:如果且斜体表示抽象类 (Abstract Class)。
- 属性 (Attributes):描述特征。
- 操作 (Operations):描述行为/方法。
可见性符号 (记忆口诀:加公减私井保)
+(Public):公开,所有类可访问。-(Private):私有,仅本类可访问。#(Protected):受保护,本类及子类可访问。
类之间的关系 (六大关系)
- 泛化 (Generalization/Inheritance):
- 实线 + 空心三角。
- 含义:is-a 关系 (文昌鸡 是 鸡)。
- 实现 (Realization):
- 虚线 + 空心三角。
- 含义:类实现接口 (Interface) (鸡 实现 了“打鸣”接口)。
- 关联 (Association):
- 实线。
- 含义:对象之间有连接 (文昌鸡 关联 气候)。
- 依赖 (Dependency):
- 虚线箭头。
- 含义:Uses-a 关系。一个类作为另一个类的方法参数或局部变量。
- 例子:动物新陈代谢依赖氧气和水。
- 聚合 (Aggregation):
- 空心菱形。
- 含义:弱拥有关系 (has-a)。整体和部分生命周期不同,部分可以独立存在。
- 例子:鸽群与鸽子。鸽群解散了,鸽子还活着。
- 合成/组合 (Composition):
- 实心菱形。
- 含义:强拥有关系。整体和部分生命周期一致,同生共死。
- 例子:鸟与翅膀。鸟死了,翅膀也就失去了意义。
5. 从模型到代码 (From Diagram to Code)
- 映射原理:
- 类 $\rightarrow$
class文件。 - 属性/方法 $\rightarrow$ 成员变量/函数。
- 继承 $\rightarrow$
extends关键字。 - 接口实现 $\rightarrow$
implements关键字。 - 关联/聚合/组合 $\rightarrow$ 成员变量(引用类型)。
- 类 $\rightarrow$
- 正向工程:使用工具(如 Rose, StarUML)直接从图生成 Java/C++ 代码框架。
6. 活动图 (Activity Diagram)
定义:描述业务流程或操作的执行顺序,类似流程图但支持并发。
关键元素
- 起始点/终止点:实心圆 / 实心圆加圈。
- 活动 (Activity):圆角矩形,表示一个步骤。
- 分支 (Decision):菱形,表示条件判断 (Yes/No)。
- 分叉与汇合 (Fork & Join):
- 粗黑线。
- 用于表示并发 (Concurrent) 行为。例如:小鸡一边“争抢啄米”一边“四处闲逛”。
- 泳道 (Swimlane):
- 将活动分组,明确谁负责做什么。例如:泳道分为“用户”、“系统”、“数据库”。
7. 时序图 (Sequence Diagram) —— ★ 动态建模核心
定义:强调消息时间顺序的交互图。
核心元素
- 对象 (Object):顶部的矩形。如果不位于顶部,表示在交互过程中被创建 (new)。
- 生命线 (Lifeline):垂直虚线,表示对象的存在时间。
- 销毁:生命线末端的 “X” 表示对象被销毁。
- 激活条 (Activation):生命线上的细长矩形,表示对象正在执行操作(被占用)。
- 消息 (Message):
- 实线箭头:调用/发送消息。
- 虚线箭头:返回结果。
8. 其他图表
- 协作图 (Collaboration Diagram):
- 与时序图语义等价,可以相互转换。
- 区别:时序图强调时间顺序;协作图强调对象间的空间/连接关系。
- 组件图 (Component Diagram):描述代码模块(物理结构)及其依赖关系。
- 包图 (Package Diagram):描述系统的分层结构(如 zoo 包包含 Animal 类)。
章节总结
本章的核心在于从“结构化思维”向面向对象思维的转变。
- 分析阶段 (OOA) 重点在于通过 用例图 明确“系统做什么”。
- 设计阶段 (OOD) 重点在于通过 类图 构建“系统的骨架”(静态结构),并通过 时序图 和 活动图 描述“系统的血液流动”(动态行为)。
- 考试时请务必分清 泛化、实现、聚合、组合 这四种关系在类图中的画法,以及 包含 (include) 和 扩展 (extend) 在用例图中的区别。