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) —— ★ 考试重点

定义:从用户角度描述系统功能,展示“谁”使用了“什么功能”。

核心元素

  1. 参与者 (Actor)
    • 系统外部的人、设备或其他系统。
    • 注意:Actor 永远在系统边界之外。
  2. 系统边界 (System Scope)
    • 界定系统范围的矩形框,用例在框内,Actor 在框外。
  3. 用例 (Use Case)
    • 椭圆表示,代表系统提供的功能/服务(如“借书”、“取款”)。
    • 助教补充:用例命名通常是“动宾结构”。

四大关系 (易混淆点)

  • 关联 (Association):实线连接 Actor 和 Use Case。表示“谁启动了功能”。
  • 包含 (Include) <<include>>
    • 必选动作。基础用例必须调用被包含用例才能完成。
    • 例子:“取款”包含“验证密码”。(不验证密码就无法取款)
    • 箭头方向:基础用例 $\rightarrow$ 被包含用例。
  • 扩展 (Extend) <<extend>>
    • 可选动作。在特定条件下才执行的附加功能。
    • 例子:“点菜”扩展出“VIP打折”。(不是所有人都是VIP)
    • 箭头方向:扩展用例 $\rightarrow$ 基础用例。
  • 泛化 (Generalization)
    • 继承关系。子用例继承父用例的行为。
    • 例子:“转账”是父用例,“跨行转账”是子用例。

4. 类图 (Class Diagram) —— ★ 核心考点

定义:描述系统中类的静态结构及其相互关系。是面向对象的基石

类的构成

  1. 类名:如果且斜体表示抽象类 (Abstract Class)
  2. 属性 (Attributes):描述特征。
  3. 操作 (Operations):描述行为/方法。

可见性符号 (记忆口诀:加公减私井保)

  • + (Public):公开,所有类可访问。
  • - (Private):私有,仅本类可访问。
  • # (Protected):受保护,本类及子类可访问。

类之间的关系 (六大关系)

  1. 泛化 (Generalization/Inheritance)
    • 实线 + 空心三角
    • 含义:is-a 关系 (文昌鸡 鸡)。
  2. 实现 (Realization)
    • 虚线 + 空心三角
    • 含义:类实现接口 (Interface) (鸡 实现 了“打鸣”接口)。
  3. 关联 (Association)
    • 实线
    • 含义:对象之间有连接 (文昌鸡 关联 气候)。
  4. 依赖 (Dependency)
    • 虚线箭头
    • 含义:Uses-a 关系。一个类作为另一个类的方法参数或局部变量。
    • 例子:动物新陈代谢依赖氧气和水。
  5. 聚合 (Aggregation)
    • 空心菱形
    • 含义:弱拥有关系 (has-a)。整体和部分生命周期不同,部分可以独立存在。
    • 例子鸽群鸽子。鸽群解散了,鸽子还活着。
  6. 合成/组合 (Composition)
    • 实心菱形
    • 含义:强拥有关系。整体和部分生命周期一致,同生共死。
    • 例子翅膀。鸟死了,翅膀也就失去了意义。

5. 从模型到代码 (From Diagram to Code)

  • 映射原理
    • $\rightarrow$ class 文件。
    • 属性/方法 $\rightarrow$ 成员变量/函数。
    • 继承 $\rightarrow$ extends 关键字。
    • 接口实现 $\rightarrow$ implements 关键字。
    • 关联/聚合/组合 $\rightarrow$ 成员变量(引用类型)。
  • 正向工程:使用工具(如 Rose, StarUML)直接从图生成 Java/C++ 代码框架。

6. 活动图 (Activity Diagram)

定义:描述业务流程或操作的执行顺序,类似流程图但支持并发

关键元素

  • 起始点/终止点:实心圆 / 实心圆加圈。
  • 活动 (Activity):圆角矩形,表示一个步骤。
  • 分支 (Decision):菱形,表示条件判断 (Yes/No)。
  • 分叉与汇合 (Fork & Join)
    • 粗黑线。
    • 用于表示并发 (Concurrent) 行为。例如:小鸡一边“争抢啄米”一边“四处闲逛”。
  • 泳道 (Swimlane)
    • 将活动分组,明确谁负责做什么。例如:泳道分为“用户”、“系统”、“数据库”。

7. 时序图 (Sequence Diagram) —— ★ 动态建模核心

定义:强调消息时间顺序的交互图。

核心元素

  1. 对象 (Object):顶部的矩形。如果不位于顶部,表示在交互过程中被创建 (new)
  2. 生命线 (Lifeline):垂直虚线,表示对象的存在时间。
    • 销毁:生命线末端的 “X” 表示对象被销毁。
  3. 激活条 (Activation):生命线上的细长矩形,表示对象正在执行操作(被占用)。
  4. 消息 (Message)
    • 实线箭头:调用/发送消息。
    • 虚线箭头:返回结果。

8. 其他图表

  • 协作图 (Collaboration Diagram)
    • 与时序图语义等价,可以相互转换。
    • 区别:时序图强调时间顺序;协作图强调对象间的空间/连接关系
  • 组件图 (Component Diagram):描述代码模块(物理结构)及其依赖关系。
  • 包图 (Package Diagram):描述系统的分层结构(如 zoo 包包含 Animal 类)。

章节总结

本章的核心在于从“结构化思维”向面向对象思维的转变。

  1. 分析阶段 (OOA) 重点在于通过 用例图 明确“系统做什么”。
  2. 设计阶段 (OOD) 重点在于通过 类图 构建“系统的骨架”(静态结构),并通过 时序图活动图 描述“系统的血液流动”(动态行为)。
  3. 考试时请务必分清 泛化、实现、聚合、组合 这四种关系在类图中的画法,以及 包含 (include)扩展 (extend) 在用例图中的区别。