# 期中考试复习

> **考试**：2022-2023学年第1学期《软件需求分析与设计》期中考试  
> **满分**：100分 | 选择题30分 + 系统分析题70分  
> **系统场景**：在线酒店订房系统

---

## 📋 试卷结构一览

| 题型 | 题量 | 分值 | 考点 |
|------|------|------|------|
| 选择题 | 15题 | 30分（2分/题） | UML基本概念、关系类型、面向对象特性 |
| 系统分析题 | 7题 | 70分（10分/题） | 7种UML图的实际绘制 |

---

## 🎯 七道大题逐题详解

### 第1题：用例图（10分）

> 画出在线订房系统的用例图。

**答案要点**：

**参与者（3个）**：客户、管理员、身份信息平台

**用例（10个）**：
- 客户相关：找回密码、注册、身份认证、登录、查询房间、下订单、在线支付
- 管理员相关：登录、房间上线、修改房间信息、房间下线

**关键关系**：
- **包含 `<<include>>`**：注册 → 身份认证；下订单 → 查询房间；在线支付 → 下订单
- **关联**：客户↔找回密码、注册、登录、查询房间、下订单；管理员↔登录、房间上线、修改、下线
- **身份认证 → 身份信息平台**（外部系统交互）

⚠️ **易错**：包含关系箭头从基本用例指向包含用例！

---

### 第2题："找回密码"用例描述（10分）

> 写出"找回密码"的完整用例描述。

**参考答案**：

| 项目 | 内容 |
|------|------|
| **用例名** | 找回密码 |
| **参与者** | 客户 |
| **前置条件** | 客户已注册 |
| **基本流程** | ①输入手机号 → ②获取短信验证码 → ③输入验证码 → ④输入新密码(两次) → ⑤两次一致则密码修改成功 |
| **备选流程** | 若两次新密码不一致，提示重新输入 |
| **后置条件** | 密码修改成功，用户可用新密码登录 |

---

### 第3题：实体类类图（10分）

> 画出系统的实体类类图，标注多重性。

**答案要点**：

**实体类**：客户(Customer)、房间(Room)、订单(Order)、管理员(Admin)

**关系及多重性**：
```
客户 1 ────── 0..* 订单   （一个客户可以有多个订单）
房间 1 ────── 0..* 订单   （一个房间可以被多次预订）
管理员 0..2 ── 0..* 订单   （管理员处理订单）
```

---

### 第4题："找回密码"的基于协作的类图（10分）

> 使用边界类、控制类、实体类画出协作类图。

**答案要点**：

| 版型 | 类名 | 职责 |
|------|------|------|
| <<boundary>> | RetrievePasswordBoundary | 找回密码界面，与用户交互 |
| <<control>> | RetrievePasswordControl | 协调找回密码的业务逻辑 |
| <<interface>> | SMSInterface | 短信接口（外部） |
| <<entity>> | UserInfo | 用户信息（持久化） |

**依赖关系**：
```
Boundary → Control → SMSInterface
                   → UserInfo
```

---

### 第5题："找回密码"的顺序图（10分）

> 画出"找回密码"的顺序图，标注消息编号。

**答案要点**：

**对象**：用户、:RetrievePasswordBoundary、:RetrievePasswordControl、:UserInfo、:SMSInterface

**消息序列（核心流程）**：
```
1: 用户 → 边界类 : 找回密码()
  1.1: 用户 → 边界类 : 输入手机号
    1.1.1: 边界 → 控制 : 获取短信(手机号)
      1.1.1.1: 控制 → SMS : 获取短信(手机号)
2: 用户 → 边界类 : 输入验证码
  2.1: 边界 → 控制 : 验证(验证码)
    2.1.1: 控制 → UserInfo : 验证(验证码)
3: 用户 → 边界类 : 输入(新密码1, 新密码2)
  3.1: 边界 → 控制 : 验证一致性(p1, p2)
    3.1.1: [一致] 控制 → UserInfo : 写入新密码
```

🔑 **编号规则**：`1` → `1.1` → `1.1.1` 表示嵌套调用，`1.1.1` 必须在 `1.1` 完成之前完成。

---

### 第6题："订单"的状态图（10分）

> 画出实体类"订单"的状态图。

**答案要点**：

```
初始 → 待支付 → 已支付 → 已入住 → 完成
          ↓        ↓
         取消     失效
```

| 转移 | 触发事件 |
|------|----------|
| 初始 → 待支付 | 下单 |
| 待支付 → 取消 | 未支付 |
| 待支付 → 已支付 | 成功支付 |
| 已支付 → 失效 | 超时 |
| 已支付 → 已入住 | 入住 |
| 已入住 → 完成 | 退房 |

---

### 第7题："找回密码"的带泳道活动图（10分）

> 画出"找回密码"的带泳道活动图。

**答案要点**：

**泳道（5条）**：用户 | 找回密码边界类 | 找回密码控制类 | 短信接口 | 用户信息

**活动流程**：
```
用户：开始 → 找回密码 → 输入手机号
  ↓
控制类 → 短信接口：获取短信验证码 → 返回验证码
  ↓
用户：输入验证码 → 输入2次新密码
  ↓
控制类：验证两次密码
  ├─ [不一致] → 结束
  └─ [一致] → 用户信息：写入新密码 → 结束
```

---

## 📊 七道题的分值分布与重点

| 题号 | 考什么 | 难度 | 必会程度 |
|------|--------|------|----------|
| 1 | 用例图 | ⭐⭐ | ★★★★★ |
| 2 | 用例描述 | ⭐ | ★★★★★ |
| 3 | 类图（实体类） | ⭐⭐ | ★★★★★ |
| 4 | 协作类图（MVC） | ⭐⭐⭐ | ★★★★ |
| 5 | 顺序图（消息编号） | ⭐⭐⭐ | ★★★★ |
| 6 | 状态图 | ⭐⭐ | ★★★★★ |
| 7 | 活动图（带泳道） | ⭐⭐⭐ | ★★★★ |

---

## 🔑 考前必记要点

1. **包含关系 vs 扩展关系**：包含=必然，扩展=条件。箭头方向不同！
2. **多重性**：`1` `0..1` `0..*` `1..*` 的含义和标注位置
3. **边界类/控制类/实体类**：View/Controller/Model 对应关系
4. **消息编号层级**：`1.1.1` 表示嵌套调用深度
5. **状态图**：别忘了初始状态（实心圆）和终态（圆圈+实心圆）
6. **活动图泳道**：根据参与者来划分，每道一个责任区
