Skip to content

软件工程学习笔记

教材:《软件工程实例教程》第10版
内容依据:课程教学大纲、课堂笔记、章节作业及考试题型

复习优先级速览

优先级模块分值占比
1UML 建模(用例图、类图、时序图、活动图、状态图)应用题主力
2软件过程模型选择应用题主力
3需求分析(功能/非功能、模糊需求量化、SRS)应用题主力
4软件设计原则、测试用例客观题 + 应用题
5软件危机、CMM、可行性研究客观题

期末分析应用题 + 高阶应用题合计约 70%,不能只背概念,必须会画图、会选模型、会改写需求。

第一章 软件工程概述

1. 软件的发展历程

阶段大致时期开发特点主要问题
程序设计时代20世纪40年代末至50年代末个人独立编写小程序缺少规范和文档
程序系统时代20世纪60年代至70年代初作坊式小团体合作软件规模扩大,软件危机集中暴露
软件工程时代20世纪70年代至今按工程化方法组织开发通过规范过程控制成本、进度和质量

软件规模和复杂度不断增长后,个人或作坊式开发方式无法有效控制项目,软件危机由此暴露,并推动了软件工程的产生。

软件危机推动了软件工程的形成。

2. 软件危机

软件危机是指软件开发和维护过程中出现的一系列严重问题。

典型表现具体含义
成本失控实际费用远高于原计划
进度失控项目延期,无法按时交付
需求偏差软件不能满足用户真实需要
质量较差错误多,可靠性不足
维护困难软件交付后难以修改和扩展
文档不足缺少完整的开发和维护资料

产生软件危机的主要原因:

  • 软件规模和内部关系越来越复杂
  • 缺少统一、规范的软件开发过程
  • 忽视前期需求分析
  • 缺少完善的质量保证和项目管理方法
  • 开发人员之间沟通和协作困难

单纯增加开发人员不一定能够提高效率,因为新成员会增加培训、沟通和管理成本。

软件工程能够缓解和控制软件危机,但软件危机并没有彻底消失。

3. 软件的概念与组成

软件是与计算机系统运行有关的程序、数据和文档的完整集合。

软件 = 程序 + 数据 + 文档

组成含义常见内容
程序描述计算机处理规则的指令集合源程序、可执行程序
数据程序输入、处理、存储和输出的信息用户数据、配置数据、业务数据
文档开发、使用和维护软件所需的资料需求说明书、设计说明书、用户手册

需要注意:

  • 软件不等于程序。
  • 开发软件不等于只编写程序。
  • “记录”不属于软件组成的三个基本类别。
  • 按课程题库口径,软件中的可执行部分是程序和数据。

4. 软件的特点

特点含义
无形性软件是逻辑实体,只能通过运行结果观察
无磨损性软件不会因使用发生物理磨损,但会因需求和环境变化而修改
开发性软件主要通过分析、设计和编码形成,不是传统流水线制造
智力密集性软件开发高度依赖人的分析、设计和逻辑思维
复杂性软件规模越大,模块和关系越复杂
易变性软件容易修改,但修改可能引起其他部分变化

软件维护阶段通常持续时间较长,所需费用也较高。

5. 软件的分类

按功能分类

类型作用例子
系统软件管理计算机资源,支持系统运行操作系统、数据库管理系统、编译器
支撑软件支持软件开发、测试和维护开发工具、建模工具、测试工具
应用软件解决用户的具体业务问题办公软件、工业控制软件、管理系统

常见判断:

  • 办公软件属于应用软件。
  • 操作系统属于系统软件。
  • 数据库管理系统通常属于系统软件。

其他分类方式

分类依据类型
按服务对象通用软件、定制软件
按处理方式实时处理、分时处理、交互式、批处理软件
按规模微型、小型、中型、大型软件

期末客观题最常考的是系统软件、支撑软件和应用软件的区分。

6. 软件工程

软件工程是应用计算机科学理论、工程管理原则和规范化方法,在规定的成本和进度内,开发、运行和维护满足用户需求的软件。

软件工程是一门工程性学科,其目标是:

  • 满足用户需求
  • 保证软件质量
  • 控制成本和进度
  • 提高开发效率
  • 提高软件的可维护性
  • 使软件生产规范化和工程化

软件工程过程不仅包括设计和编码,还包括需求分析、测试、交付、维护和项目管理。

7. 软件工程方法学

软件工程方法学由方法、工具和过程组成。

要素含义例子
方法规定软件开发各阶段怎样完成面向对象分析与设计
工具辅助执行软件工程活动UML建模工具、测试工具
过程规定开发活动的顺序和管理方式瀑布模型、增量模型

软件工程方法学 = 方法 + 工具 + 过程

8. 软件工程基本原则

原则含义
分阶段管理按软件生命周期安排任务和资源
阶段评审每个阶段完成后检查成果,再进入下一阶段
产品与变更控制对需求、文档和程序的修改进行统一管理
使用现代方法采用合适的分析、设计、建模和开发技术
结果可审查各阶段成果应清晰、完整、能够验证
团队小而精减少不必要的沟通和管理成本
持续改进根据实践不断改进软件过程

9. AI环境下的软件工程

AI可以辅助代码生成、原型构建、测试和文档编写,但不能自动解决需求不明确、系统复杂、架构设计、质量责任和软件维护等问题。

AI生成结果还可能存在错误代码、安全漏洞和难以维护等风险。

AI可以提高开发效率,但不能代替需求分析、软件设计和测试验证。

AI 时代软件危机的新表现

表现含义
代码质量不稳定AI 生成的代码可能存在隐藏缺陷、安全漏洞
责任归属模糊AI 协助产出的错误由谁负责难以界定
版权与合规风险AI 可能产出与训练数据相似的代码,引发版权问题
能力依赖过度依赖 AI 会削弱开发者的分析和设计能力
需求分析更难用户用 AI 生成原型后,反而更容易跳过真正的需求沟通
维护困难AI 生成的代码结构混乱,长期可维护性较差

本章重点速记

  • 三个时代:程序设计时代 → 程序系统时代 → 软件工程时代
  • 程序系统时代的特点:作坊式小团体合作
  • 软件危机表现为成本、进度、质量、需求和维护问题
  • 软件 = 程序 + 数据 + 文档
  • 软件是逻辑产品,具有无形性和无磨损性
  • 软件分为系统软件、支撑软件和应用软件
  • 软件工程是一门工程性学科
  • 软件工程方法学:方法、工具、过程
  • 软件工程缓解软件危机,但没有彻底消除软件危机
  • AI 时代新危机:代码质量不稳、责任模糊、版权风险、能力依赖

第二章 软件生命周期与软件过程模型

1. 软件生命周期

软件生命周期是软件从提出、开发、交付使用,到最终停止使用的完整过程。

软件生命周期可以分为三个时期:

时期包含阶段主要解决的问题
定义时期问题定义、可行性研究、需求分析做什么、是否值得做
开发时期软件设计、编码、测试怎样做、实现是否正确
使用和维护时期运行与维护交付后怎样修改和完善

完整过程:

问题定义 → 可行性研究 → 需求分析 → 概要设计 → 详细设计 → 编码 → 测试 → 运行维护

2. 生命周期各阶段及产物

阶段核心任务主要产物
问题定义明确需要解决的问题问题定义说明
可行性研究判断能不能做、值不值得做可行性研究报告
需求分析确定软件应当做什么软件需求规格说明书
概要设计确定系统总体结构概要设计说明书
详细设计确定模块内部实现详细设计说明书
编码将设计转化为程序源程序和可执行程序
测试发现错误并验证需求软件测试报告
维护交付后修改和完善软件维护记录和新版本

需求分析是软件开发中非常重要的阶段。需求一旦理解错误,后续设计、编码和测试都可能建立在错误基础上。

软件交付给用户并正式投入使用后,进入维护阶段,直到软件被淘汰。

软件维护通常占整个软件生命周期成本的 60% 以上,是生命周期最长的阶段。

软件维护的 4 种类型

类型含义例子
改正性维护修复测试阶段未发现的错误修复运行中暴露的 bug
适应性维护适应硬件、软件或数据环境变化升级操作系统后修改兼容性
完善性维护为满足新需求而增加功能增加报表导出 PDF 功能
预防性维护为减少未来故障而提前改进重构老代码以提高可维护性

4 种维护中,完善性维护占比最高,改正性维护其次。

3. 软件过程与过程模型

软件过程是:

为开发、交付和维护软件而进行的一组软件工程活动。

软件过程模型是:

对软件开发活动及其先后关系的抽象描述。

“功能模型”不是软件过程模型,而是描述系统功能的模型。

4. 瀑布模型

瀑布模型按阶段依次向下推进:

需求分析 → 软件设计 → 编码 → 测试 → 运行维护

瀑布模型本质上是一种线性顺序模型。

特点说明
阶段清楚每个阶段有明确任务和产物
文档完整便于计划、评审和管理
变更困难需求变化后返回修改成本较高

适用于需求明确、技术成熟、变化较少的项目。

带反馈的瀑布模型允许后续阶段发现问题后返回前一阶段修改,但仍以顺序为主,是"小幅度回退"。

瀑布 vs 带反馈瀑布 vs V 模型

模型是否允许回退核心特征
瀑布模型不允许严格线性,需求稳定
带反馈的瀑布模型仅返回前一阶段线性为主,允许小修改
V 模型强调开发与测试对应每个开发阶段都有对应测试

5. V模型

V模型强调开发阶段与测试阶段的对应关系。

开发阶段对应测试
用户需求验收测试
系统需求系统测试
概要设计集成测试
详细设计单元测试

V模型的重点是提前考虑测试,使每个开发阶段都有相应的验证活动。

6. 快速原型模型

原型是为了帮助用户理解和确认需求而建立的软件雏形,不一定是最终软件。

基本过程:

初步需求 → 快速设计 → 建立原型 → 用户评价 → 修改需求

适用于:

  • 用户无法准确描述需求
  • 用户不知道系统应该是什么样
  • 界面和交互方式不明确

原型可以分为:

类型处理方式
抛弃型原型需求明确后丢弃,重新开发正式系统
演化型原型不断修改,逐步发展为最终系统

提示

原型不是必然的最终可运行版本。

7. 增量模型与迭代模型

增量模型

增量模型将系统划分为多个功能部分,按照优先级逐步开发和交付。

例如:

第一增量:核心功能
第二增量:扩展功能
第三增量:完善功能

适用于时间紧、需要先交付高优先级功能的项目。

迭代模型

迭代模型通过多次循环,不断修改和完善已经存在的系统。

增量迭代
不断增加新功能不断改进已有功能

实际项目中,增量和迭代经常结合使用。

8. 螺旋模型

螺旋模型综合了瀑布模型和快速原型模型的特点,并增加风险分析。

每一轮主要包括:

  1. 制定计划
  2. 风险分析
  3. 工程开发
  4. 用户评审

螺旋模型的核心是:

风险驱动。

适用于规模大、技术新、没有类似产品、风险较高的项目。

9. RUP模型

RUP是一种面向对象的软件开发过程。

三个核心特点:

  • 用例驱动
  • 以体系结构为中心
  • 迭代和增量开发
阶段主要任务
初始阶段确定项目目标和范围
细化阶段分析需求、建立核心架构、处理主要风险
构建阶段完成系统主要功能
交付阶段部署系统并交付用户

RUP的每个阶段都可以包含多次迭代。

RUP 的"迭代"是指在限定时间内重复执行一组活动(需求、设计、编码、测试),每次迭代都产生一个可运行的系统版本。 这与传统的瀑布模型"一次性走完全部阶段"截然不同,更适合需求变化大、风险较高的项目。

10. 敏捷开发

敏捷开发强调:

  • 短周期迭代
  • 持续交付
  • 用户参与
  • 快速反馈
  • 响应需求变化

适用于需求变化较频繁、需要不断发布版本的项目。

11. 基于构件的过程模型

基于构件的过程模型通过复用已有软件构件组装系统。

核心是:

软件复用。

使用构件时需要考虑:

  • 构件是否满足需求
  • 构件接口是否兼容
  • 构件质量是否可靠

12. 过程模型的选择

项目特征适用模型
需求明确、变化较少瀑布模型
强调开发和测试对应V模型
用户说不清需求快速原型模型
需要先交付核心功能增量模型
需要持续改进已有功能迭代模型
规模大、技术新、风险高螺旋模型
需求频繁变化、持续发布敏捷开发
大型面向对象项目、强调架构RUP模型

模型选择题需要根据题目中的项目特征说明选择理由,不能只写模型名称。

13. CMM软件能力成熟度模型

CMM用于评价和改进软件组织的软件开发过程成熟度,不是直接评价某一个软件产品的质量。

等级名称核心特点
1初始级过程混乱,依赖个人能力
2可重复级建立基本项目管理
3已定义级过程标准化、文档化
4已管理级使用数据进行定量管理
5优化级持续改进过程

本章重点速记

  • 生命周期分为定义、开发、使用和维护三个时期
  • 需求分析是非常重要的阶段
  • 软件维护从软件交付使用后开始,维护成本占总成本 60% 以上
  • 维护 4 类:改正性、适应性、完善性、预防性(完善性占比最高)
  • 瀑布:需求稳定;带反馈瀑布:允许小回退;V 模型:开发与测试对应
  • 原型:需求不明确
  • 增量:先交付核心功能;迭代:不断完善已有功能
  • 螺旋:大型、高风险项目
  • RUP:用例驱动、架构中心、迭代增量;每个阶段都包含多次迭代
  • CMM评价软件过程成熟度

第三章 问题定义与可行性研究

1. 问题定义

问题定义用于明确项目真正需要解决的问题。

主要确定:

  • 当前存在什么问题
  • 问题影响哪些用户
  • 项目希望达到什么目标
  • 系统的范围和边界是什么

问题定义回答“为什么做、解决什么”,不直接研究程序怎样实现。

2. 可行性研究

可行性研究是:

用尽可能小的代价和尽可能短的时间,判断问题是否存在可行的解决方案。

主要回答:

  • 项目能不能做
  • 项目值不值得做
  • 是否应该继续投入

3. 可行性研究的内容

类型判断内容
技术可行性现有技术、人员和设备能否实现
经济可行性成本与收益是否合理
操作可行性用户和组织能否接受和使用
法律可行性是否违反法律、合同、版权和隐私要求
时间可行性能否在规定时间内完成

题目中“从经济方面考虑是否值得开发”属于经济可行性。

4. 投资回收期

投资回收期是收回项目初始投资所需要的时间。

一般情况下:

投资回收期越短,项目越有投资价值。

5. 可行性研究与需求分析的关系

正确顺序:

问题定义 → 可行性研究 → 需求分析 → 软件需求规格说明书

可行性研究判断项目是否值得继续,需求分析才详细确定系统应当做什么。

本章重点速记

  • 问题定义:明确问题、目标和范围
  • 可行性研究:判断能不能做、值不值得做
  • 可行性包括技术、经济、操作、法律和时间
  • 投资回收期越短通常越有利
  • 可行性研究在需求分析之前

第四章 需求分析与需求规格说明书

1. 软件需求

软件需求是用户对软件系统在功能、行为、性能、接口和约束等方面的期望。

需求分析主要回答:

软件应当做什么。

需求分析阶段不详细研究程序怎样编码、使用什么算法以及模块内部怎样实现。

2. 需求的分类

功能需求与非功能需求

类型回答的问题例子
功能需求系统做什么用户登录、选择课程、生成成绩单
非功能需求系统做得怎样响应时间、安全性、并发能力

如果系统提供了某项功能,但执行结果错误,仍属于功能需求没有正确实现。

例如:用户取款500元,ATM只吐出100元但账户扣除500元,说明取款和扣款功能执行错误。

其他分类方式

分类角度类型
描述层次用户需求、系统需求
需求对象产品需求、过程需求
表达方式定性需求、定量需求

软件需求可以从不同角度进行分类,功能需求与非功能需求是最重要的分类方式。

3. 合格需求的基本性质

性质含义
必要性确实是用户或系统需要的
正确性符合用户真实意图
完整性没有遗漏必要内容
一致性不同需求之间没有矛盾
无歧义性只有一种明确解释
可行性技术、成本和时间上能够实现
可验证性能通过测试判断是否满足
可追踪性能找到需求来源及对应设计和测试

“可扩展性”通常不属于需求本身的基本性质。

4. 需求分析的基本过程

需求获取 → 需求建模 → 形成需求规约 → 需求验证与确认 → 需求管理

活动主要内容
需求获取从用户和业务中收集需求
需求建模使用模型抽象描述需求
形成需求规约编写需求规格说明书
需求验证与确认检查需求是否正确、完整、可行
需求管理记录、跟踪和控制需求变化

需要区分:

  • 检查需求是否正确,属于需求验证与确认。
  • 对需求进行版本控制和变更审批,属于需求管理。

5. 需求获取

需求可以来自:

  • 用户和业务人员
  • 现有业务流程
  • 业务表单和文档
  • 现有软件系统
  • 法律和行业规范
  • 市场及竞争产品

需求获取需要用户、需求分析人员、开发人员和测试人员共同参与。

常见需求获取方法

方法适用情况主要特点
访谈法需要深入了解复杂业务可以追问,但较耗费时间
问卷法用户数量较多覆盖面广,但不便深入交流
观察法需要了解真实工作过程能发现用户未明确表达的需求
原型法用户不能准确描述需求直观,便于获得反馈
文档分析法已有制度、表单和资料较多系统性强,但文档可能过时

实际项目通常综合使用多种方法。

6. 模糊需求的修改

需求必须明确、可量化、可验证。

模糊描述修改后的需求
系统响应速度要快95%的用户请求应在2秒内返回结果
内存占用不能太高系统稳定运行时内存占用不得超过1GB
多用户使用时不能崩溃系统支持500名用户同时在线并稳定运行8小时

修改原则:

模糊形容词 → 具体指标 + 测试条件 + 可验证结果

7. 需求验证与评审

需求评审用于检查需求规格说明书能否作为设计、开发和测试的可靠依据。

主要检查:

  • 是否符合用户真实需要
  • 是否完整、一致和无歧义
  • 是否能够实现
  • 是否能够测试
  • 是否能够追踪

需求评审应有用户参与。软件工具可以辅助检查,但不能保证需求绝对正确。

8. 软件需求规格说明书

软件需求规格说明书简称SRS,是对系统功能需求、非功能需求、接口和约束的完整、准确和可验证描述。

主要作用:

  • 作为用户与开发者之间的约定
  • 作为软件设计的依据
  • 作为软件测试和验收的依据
  • 作为需求变更管理的基础
内容说明
引言编写目的、项目背景和术语
系统总体描述系统范围、用户特点和运行环境
功能需求系统应提供的功能
非功能需求性能、安全和可靠性要求
外部接口需求用户、软件、硬件和通信接口
数据需求主要数据及其约束
验收与追踪如何验证和追踪需求

SRS不应详细描述具体算法和程序内部实现过程。

合格 SRS 的评判标准

标准含义
正确真实反映用户需求
完整没有遗漏必要功能
一致各条需求之间没有矛盾
无歧义每条需求只有一种理解
可验证每条需求都能通过测试验证
可追踪每条需求都能追溯到来源、对应设计和测试
可修改结构清晰,易于增删修改
不含实现不描述具体算法、内部结构、编程语言

本章重点速记

  • 需求分析回答:软件应当做什么
  • 功能需求:做什么;非功能需求:做得怎样
  • 合格需求应完整、一致、无歧义、可验证
  • 需求过程:获取 → 建模 → 规约 → 验证 → 管理
  • 模糊需求必须量化
  • 需求分析最终形成SRS
  • SRS不写算法的详细实现
  • 合格 SRS 7 标准:正确、完整、一致、无歧义、可验证、可追踪、不含实现

第五章 面向对象基础与用例模型

1. 对象与类

对象由三部分组成:

标识 + 属性 + 操作

组成含义
标识区分不同对象的唯一身份
属性对象的数据和状态
操作对象可以执行的行为

类是具有相同属性和操作的一组对象的抽象描述。

类是对象的模板,对象是类的实例。

2. 面向对象的基本特征

特征含义判断关键词
封装将属性和操作结合,并隐藏内部实现隐藏内部信息
继承子类获得父类的属性和操作子类获得父类内容
多态同一操作在不同对象中有不同实现同名操作、不同实现
消息对象请求另一个对象执行操作对象之间交互

例如:

  • 经理和工人继承员工的共同属性和操作,体现继承。
  • 经理和工人的“计算工资”方法不同,体现多态。

3. 面向对象分析的三个模型

模型主要描述
对象模型对象、类及其静态关系
动态模型对象交互和状态变化
功能模型系统需要完成的功能和处理

其中,对象模型是核心模型。

4. UML

UML是统一建模语言,是一种标准化的图形建模语言。

需要区分:

  • UML是一种建模语言。
  • UML不是编程语言。
  • UML不是完整的软件开发方法。
  • UML与具体的软件开发过程相互独立。
UML图主要描述
用例图参与者和系统功能
类图类及其静态关系
时序图对象之间的消息顺序
活动图业务流程和分支
状态图一个对象的状态变化

类图和对象图主要描述静态结构;时序图、活动图和状态图描述动态行为。

5. 用例图

用例图描述:

哪些外部参与者使用系统提供的哪些功能。

可以概括为:

谁使用系统做什么。

基本元素

元素含义
参与者系统外部与系统交互的角色
用例系统向参与者提供的完整功能
系统边界表示系统范围
关系表示参与者和用例之间的联系

参与者可以是人、外部设备或其他软件系统,但必须位于系统外部。

用例名称一般使用动宾结构,如“查询成绩”“提交订单”。

6. 用例图中的关系

关联关系

参与者与用例之间使用关联关系,表示参与者使用该功能。

包含关系

使用 <<include>> 表示。

一个用例执行时,必须执行另一个公共用例。

例如:

提交订单 <<include>> 验证身份

箭头指向被包含用例。

扩展关系

使用 <<extend>> 表示。

在特定条件下,为基本用例增加一个可选行为。

例如:

到书通知 <<extend>> 还书

箭头由扩展用例指向基本用例。

泛化关系

表示一般参与者与特殊参与者,或者一般用例与特殊用例之间的继承关系。

情况关系
每次都必须执行包含
满足条件才执行扩展
一般与特殊泛化

7. 用例图的绘制

基本过程:

  1. 确定系统边界。
  2. 找出系统外部参与者。
  3. 根据参与者目标识别用例。
  4. 建立参与者与用例的关联。
  5. 判断用例之间是否存在包含、扩展或泛化。
  6. 检查是否遗漏角色和功能。

用例图只描述用户可见的系统功能,不描述程序内部实现。

绘制示例:在线选课系统

题目材料:

学生可以登录系统、浏览课程、选择课程和退选课程; 选课前必须先登录;学生在选课时若所选课程已满,系统提示"选课失败"。

分析:

步骤结果
参与者学生
用例登录、浏览课程、选择课程、退选课程
系统边界整个"在线选课系统"框
关系"选择课程" <<include>> "登录"
条件分支"选课失败"是"选择课程"的 <<extend>> 扩展点

关键:include 是每次都必须执行;extend 是特定条件下才触发

本章重点速记

  • 对象 = 标识 + 属性 + 操作
  • 类是对象的模板,对象是类的实例
  • 隐藏内部信息:封装
  • 子类获得父类内容:继承
  • 同名操作不同实现:多态
  • 面向对象分析包括对象、动态和功能模型
  • UML是建模语言,不是开发方法
  • 用例图描述“谁使用系统做什么”
  • 必须发生用include;条件发生用extend
  • 必考题型:给一段文字描述,要求识别参与者、用例和关系

第六章 对象模型与类图

1. 类图

类图描述系统中有哪些类,以及类之间的静态关系。

一个类通常由三部分组成:

类名
属性
操作

2. 类图中的关系

类图中常见五种关系:

  • 依赖
  • 关联
  • 聚合
  • 组合
  • 继承或泛化

依赖

一个类临时使用另一个类提供的功能。

例如:

类A调用数学函数库。

表示方式:

虚线箭头,由使用者指向被使用者。

关联

两个类之间存在较稳定的业务联系。

例如:

学生选择课程
教师教授课程

聚合

聚合是较弱的整体与部分关系,部分可以脱离整体独立存在。

例如:

公司与部门
班级与学生

表示方式:

空心菱形位于整体一端。

组合

组合是较强的整体与部分关系,部分的生命周期依赖整体。

例如:

订单与订单明细
房屋与房间

表示方式:

实心菱形位于整体一端。

继承或泛化

子类是一种父类,并继承父类的属性和操作。

例如:

经理是一种员工。

表示方式:

空心三角箭头指向父类。

3. 类关系的判断

题目表达关系
“是一种”继承
存在稳定业务联系关联
整体消失,部分仍可存在聚合
整体消失,部分也随之消失组合
临时调用另一个类依赖

4. 多重性

多重性表示一个对象可以与多少个另一类对象建立关系。

表示含义
1恰好一个
0..1零个或一个
*多个
0..*零个或多个
1..*至少一个

例如:

  • 一个部门生产多种产品,每种产品只由一个部门生产:一对多。
  • 一个工人参与多个项目,一个项目有多个工人:多对多。

5. 类图的构造

基本过程:

  1. 根据需求中的名词识别候选类。
  2. 删除重复、无关或只适合作为属性的名词。
  3. 确定类的职责、属性和操作。
  4. 分析类之间的关系。
  5. 标注关系的多重性。
  6. 检查类图是否与需求一致。

绘制示例:图书管理系统

题目材料:

一本书只属于一个图书类别,一个图书类别包含多本书; 一位读者可以借阅多本书,每本书可以被多位读者借阅(同一时间一本书只能借给一位读者); 借阅记录记录了哪本书借给了哪位读者以及借阅日期。

分析与结果:

关系关系类型多重性
图书类别 ↔ 图书整体与部分聚合1 ↔ 0..*
借阅记录 ↔ 图书业务联系关联* ↔ 1
借阅记录 ↔ 读者业务联系关联* ↔ 1

多重性要点:

  • 一本书属于一个类别(一对多)
  • 一本书同一时间只能借给一位读者(多条借阅记录 → 1 本书,但当前借阅记录唯一)
  • 多重性要标在靠近对方类的位置。

本章重点速记

  • 类图描述系统静态结构
  • 类由类名、属性和操作组成
  • 临时使用:依赖
  • 稳定联系:关联
  • 空心菱形:聚合
  • 实心菱形:组合
  • 空心三角箭头指向父类
  • 类图关系必须标注多重性
  • 必考题型:给一段文字描述,要求抽取类、关系和多重性

第七章 动态模型

1. 时序图

时序图描述参与者和对象之间按照时间先后发送消息的过程。

主要回答:

谁在什么时候调用了谁。

时间方向是从上到下。

时序图的组成

元素含义
参与者发起系统交互的外部角色
对象参与完成业务的系统对象
生命线对象在交互过程中的存在时间
激活条对象正在执行操作
消息对象之间的调用
返回消息操作完成后返回结果

常见消息

类型含义
同步消息发送者等待接收者处理完成
异步消息发送后可以继续执行其他操作
返回消息接收者返回处理结果

绘图时先确定参与者和对象,再按照实际业务顺序从上到下画出消息。

2. 活动图

活动图描述一个业务过程中的活动、判断、分支和并行流程。

适合描述:

  • 用户注册流程
  • 订单处理流程
  • 审批流程
  • 选课流程
元素作用
初始节点流程开始
活动节点执行一项活动
控制流表示活动顺序
判断节点根据条件选择分支
合并节点将多个分支重新合并
分叉与汇合表示并行任务的开始与结束
终止节点流程结束
泳道区分不同角色负责的活动

3. 状态图

状态图描述一个对象在不同事件作用下,状态如何发生变化。

例如订单:

待支付 → 已支付 → 已发货 → 已完成

也可能:

待支付 → 已取消

状态图包括:

  • 初始状态
  • 状态
  • 事件
  • 状态转移
  • 条件
  • 动作
  • 终止状态

状态转移的一般形式:

事件 [条件] / 动作

例如:

点击支付 [余额充足] / 扣除金额

状态内部的 3 种动作

动作含义写法
entry 动作进入该状态时自动执行entry / 发送邮件通知
do 动作处于该状态期间持续执行do / 处理订单
exit 动作离开该状态时自动执行exit / 保存日志

例:订单进入"已支付"状态时立即发送邮件通知。 写法:entry / 发送邮件通知,属于 entry 动作。

4. 三种动态图的区别

题目关注内容应使用的图
对象之间按时间发送消息时序图
完整业务步骤、判断和并行流程活动图
一个对象经历的状态变化状态图

本章重点速记

  • 时序图:谁在什么时候调用谁
  • 时序图时间方向:从上到下
  • 活动图:业务步骤、判断、分支和并行
  • 泳道区分不同角色负责的活动
  • 状态图:一个对象的状态变化
  • 状态转换:事件 [条件] / 动作
  • 状态内部动作:entry(进入)、do(持续)、exit(离开)
  • 流程题用活动图,状态变化题用状态图

第八章 软件设计与实现

1. 软件设计

软件设计是将软件需求转换为可以实现的软件结构和技术方案。

阶段回答的问题
需求分析软件做什么
软件设计软件怎样做
软件实现把设计转化为可运行系统

2. 概要设计与详细设计

类型主要内容
概要设计系统总体架构、模块划分、模块关系和主要接口
详细设计模块内部逻辑、数据结构、算法和接口细节

概要设计关注系统整体,详细设计关注模块内部。

3. 软件设计原则

模块化

将复杂系统划分为若干职责相对独立的模块。

抽象

保留事物的主要特征,忽略暂时不重要的实现细节。

信息隐藏

隐藏模块内部实现,只向外提供必要接口。

内聚

内聚表示一个模块内部各部分联系的紧密程度。

内聚越高,模块职责越集中。

耦合

耦合表示不同模块之间依赖的紧密程度。

耦合越低,模块之间相互影响越小。

软件设计的重要原则:

高内聚、低耦合。

4. 设计模型的质量要求

要求含义
正确性正确反映需求
完整性不遗漏必要功能和结构
一致性不同设计图和文档之间没有矛盾
清晰性表达明确,便于理解
可追踪性设计元素能够对应具体需求

5. 用户界面设计

用户界面应做到:

  • 界面和操作保持一致
  • 信息表达清楚
  • 操作后及时反馈
  • 减少用户记忆负担
  • 防止或提示用户错误
  • 符合用户使用习惯

6. 软件设计文档

软件设计文档主要包括:

  • 系统总体结构
  • 模块划分和职责
  • 类和对象设计
  • 数据设计
  • 接口设计
  • 用户界面设计
  • 异常处理

设计文档应与需求保持一致,并能够指导后续实现。

7. 软件实现

软件实现是将软件设计转化为可以运行的软件系统。

前期成果对实现的指导
需求规格说明书确定功能和质量要求
用例图确定参与者和功能入口
类图确定类、属性、操作和关系
时序图确定对象之间的调用顺序
活动图确定业务流程和分支
状态图确定对象状态及转换条件

一个完整功能通常按照以下过程运行:

用户界面接收操作 → 业务逻辑处理 → 读取或修改数据 → 返回处理结果

多人共同实现系统时,需要统一模块职责、接口参数和数据格式。

本章重点速记

  • 需求分析:做什么
  • 软件设计:怎样做
  • 软件实现:做出来
  • 概要设计关注整体,详细设计关注模块内部
  • 设计原则:模块化、抽象、信息隐藏
  • 核心要求:高内聚、低耦合
  • 设计模型应正确、完整、一致、清晰、可追踪
  • 软件实现必须以需求和设计模型为依据

第九章 软件测试

1. 软件测试

软件测试是为了发现软件中的错误和缺陷,并验证软件是否满足规定需求而执行软件的过程。

测试的主要目的:

尽可能发现软件中的错误。

经典结论:

软件测试可以发现软件中存在错误,但不能证明软件中不存在错误。

测试没有发现错误,也不能说明软件完全正确。

2. 测试与调试

软件测试程序调试
目的是发现错误目的是定位和修复错误
设计并执行测试用例分析错误产生的原因
比较实际结果与预期结果修改程序并重新验证

软件测试不等于程序调试。

3. 软件测试阶段

基本顺序:

单元测试 → 集成测试 → 系统测试 → 验收测试

阶段主要测试对象
单元测试单个函数、类或模块
集成测试模块之间的接口和协作
系统测试完整的软件系统
验收测试用户确认软件是否可以交付

4. 黑盒测试与白盒测试

黑盒测试

黑盒测试根据需求、输入和输出进行测试,不关心程序内部结构。

主要检查:

  • 功能是否正确
  • 输入能否得到正确输出
  • 边界输入能否正确处理
  • 错误输入是否得到合理提示

常见方法:

  • 等价类划分
  • 边界值分析
  • 决策表
  • 场景法

白盒测试

白盒测试根据程序内部结构和逻辑进行测试。

主要检查:

  • 语句是否执行
  • 分支是否覆盖
  • 条件是否覆盖
  • 程序路径是否正确

黑盒测试和白盒测试是测试方法,不是软件测试阶段。

5. 等价类与边界值

例如,年龄要求为18至60岁:

等价类数据
有效等价类18至60
无效等价类小于18
无效等价类大于60
无效等价类非数字

边界值可以选择:

17、18、19、59、60、61

6. 测试用例

测试用例是为验证某项需求或发现某类错误而设计的一组测试条件、输入、操作步骤和预期结果。

测试用例不等于一个功能。

内容说明
用例编号测试用例的唯一编号
测试目标需要验证的功能或需求
前置条件执行测试前需要满足的条件
输入数据测试使用的数据
操作步骤测试执行过程
预期结果正确情况下应出现的结果
实际结果实际执行得到的结果
测试结论通过或失败

编写过程:

  1. 明确对应的需求。
  2. 确定前置条件和输入。
  3. 写出清晰的操作步骤。
  4. 写出可以判断的预期结果。
  5. 执行后记录实际结果和结论。

7. 需求跟踪

需求跟踪用于建立以下对应关系:

需求 → 设计 → 代码 → 测试用例 → 测试结果

主要作用:

  • 检查每条需求是否被设计
  • 检查每条需求是否被实现
  • 检查每条需求是否有对应测试
  • 分析需求变更的影响

需求跟踪表不是用来查看项目目前进行到哪个阶段。

8. 软件测试报告

软件测试完成后,应形成软件测试报告。

主要记录:

  • 测试范围和环境
  • 测试用例
  • 测试执行结果
  • 发现的问题
  • 测试结论

软件测试最终形成的主要产物是软件测试报告。

本章重点速记

  • 测试目的:尽可能发现错误
  • 测试不能证明软件没有错误
  • 测试负责发现,调试负责定位和修复
  • 测试顺序:单元 → 集成 → 系统 → 验收
  • 黑盒看输入输出,白盒看内部结构
  • 黑盒和白盒是测试方法,不是测试阶段
  • 测试用例必须有输入、步骤和预期结果
  • 需求跟踪连接需求、设计、代码和测试
  • 软件测试最终形成测试报告