软件工程导论
第一章 软件工程学概述
1.软件危机:软件危机是指在见算计软件的开发与维护过程中遇到的一系列严重问题。
2.软件危机的主要表现:
- 对软件开发成本和研制进度的估计不准确
- 用户对“已完成”的软件不满意
- 软件产品的质量差,不够可靠
- 软件的可维护性差
- 软件缺少文档资料
- 软件成本在计算机系统总成本中所占比例逐年上升
- 软件开发生产率的提高跟不上计算机应用迅速普及深入的趋势
3.产生软件危机的原因:
- 软件日益复杂和庞大
- 软件开发管理困难
- 软件开发技术落后
- 生产方式落后
- 开发工具落后
- 软件开发费用不断增加
4.IEEE定义软件:计算机程序、方法、规则、相关的文档资料以及在计算机上运行程序时所必须的数据。
- 狭义定义:软件=程序+数据+文档
- 程序:能够完成预定功能和性能的可执行的指令序列
- 数据:使程序能够适当地处理信息的数据结构
- 文档:开发、使用和维护程序所需要的图文资料
5.软件工程:软件工程是指导计算机软件开发和维护的一门工程学科。
6.软件的特性:复杂性、不可见性、经常变化、质量难以稳定。
7.软件工程的七条基本原理
- 用分阶段的生命周期计划严格管理
- 坚持进行阶段评审
- 实行严格的产品控制
- 采用现在程序设计技术
- 结果要能够清楚地审查
- 开发人员少而精
- 承认不断改进软件工程实践的必要性
8.软件工程方法学:软件生命周期全过程中使用的一整套技术方法的集合称为方法学(也叫"泛型")。
软件工程方法学的三要素:方法、工具、过程。
目前使用的最广泛的是 传统方法学 和 面向对象方法学。
- 传统方法学(也叫生命周期方法学或结构化泛型):把软件的生命周期划分为若干个阶段,顺序完成每个阶段,前一阶段结束的标准是后一阶段开始的标准,每个阶段结束前都要进行严格技术审查和管理复审,没有通过审查则进行返工,文档资料是审查的重点。特点:保证软件质量,提高可维护性。
- 面向对象方法学:把数据和行为堪称是同等重要的。四个要点:1.用对象分解取代传统方法的功能分解。2.把所有对象都划分成类。3.类间有继承关系。4.对象仅能通过发送消息相互联系。特点:提高重用性。
9.软件的生命周期
- 问题定义:确定要解决的问题
- 可行性研究:探索问题是否值得去解,是否有可行的解决办法
- 需求分析:完整地体现用户的要求。提供规格说明书
- 总体设计:设计程序的体系结构,确定由哪些模块组成以及模块间的关系
- 详细设计:实现模块功能所需要的算法和数据结构
- 编码和单元测试:写出正确的容易理解、容易维护的程序模块
- 综合测试:分为集成测试和验收测试。通过各种类型的测试使软件达到预定的要求
- 软件维护:通过维护时系统持久地满足用户的需要。分为:改正性维护、适应性维护、完善性维护、适应性维护
10.软件过程:为了获得高质量软件所需要完成的一系列任务的框架,规定了完成各项任务的工作步骤。
模型名称 | 判断标准 | 优点 | 缺点 |
---|---|---|---|
瀑布模型 | 前一阶段的输出作为后一阶段的输入,每个阶段必须完成规定的文档,每个阶段结束前必须对完成的文档进行评审 | 规范的开发方法、完整的文档、高质量的程序 | 由文档驱动,可能不能真正满足用户的需要 |
快速原型模型 | 用户提意见、修改、用户提意见、修改…直到满足用户需要 | 保证用户的真实需求得到满足、快速 | 耗时、需不断与用户沟通 |
增量模型 | 先提供核心功能,再逐步完善 | 在较短的时间内向用户提交可完成部分工作的产品、逐步增加产品功能使用户有足够时间适应 | 软件体系结构必须是开放的 |
螺旋模型 | 使用原型模型及其他方法来降低风险、适用于大规模软件项目 | “风险”驱动、提高质量、降低风险 | 需要有经验的开发人员来评估风险 |
喷泉模型 | 软件实现无缝开发和迭代、把线性过程作为总目标、适用于面向对象的软件开发过程 | 开发迭代无缝衔接、维护时间缩短 | 由于开发阶段重叠,所以需要大量开发人员、要求严格管理文档且可能随时加入信息使得审核难度加大 |
第二章 可行性研究
1.可行性研究的目的:可行性研究的目的不是解决问题,而是确定问题是否值得去解决。
2.可行性研究的实质:惊醒一次大大压缩简化了系统分析和设计的过程,在较高层次上以抽象方式进行的系统分析和设计的过程。
3.可行性:技术可行性、经济可行性、操作可行性、运行可行性、法律可行性。
4.一般来说可行性研究成本占工程总成本的5%-10%
5.可行性研究过程
- 复查系统规模和目标
- 研究目前正在使用的系统
- 导出新系统的高层逻辑模型
- 进一步定义问题
- 导出和评价供选择的解法
- 推荐行动方针
- 草拟开发计划
- 书写文档提交审核
6.系统流程图:系统流程图(见书)和程序流程图(菱形→判断、长方形→执行)不同。系统流程图表示系统的操作控制和数据流。程序流程图表示程序中的操作顺序。
7.数据流图的基本符号:正方形(立方体)代表数据源点或终点,圆角矩形(圆形)代表变换数据的处理,开口矩形(平行横线)代表数据存储,箭头代表数据流方向。
8.数据字典:
- 数据字典时关于数据的信息的集合,是对数据流图中包含的所有元素的定义的集合
- 数据流图和数据字典共同构成系统的逻辑模型
符号 | 含义 |
---|---|
= | 等价于 |
+ | 和 |
[ ] | 或 (表示从括号中若干份量选择一个) |
{ } | 重复 (重复选择括号中的分量) |
( ) | 可选 (括号中的分量可有可无) |
9.成本估计方法:
- 代码行技术 : 成本 = 每行代码的平均成本 * 估计的源代码总行数
- 任务分解技术: 单本任务成本 = 任务所需人力估值 * 每人每月平均工资;总成本 = 每个单独任务的成本总和
- 自动估计成本技术:用软件自动估计成本
第三章 需求分析
1.需求分析的任务:准确地回答“系统必须做什么?”并完成软件需求规格说明书。
2.ER图(实体-联系图):用来定义数据存储需求的模型,数据模型包括数据对象、数据对象的属性和联系
3.层次方框图:用树形结构的一系列多层次的矩形框描绘数据的层次结构。树形结构的顶层是一个单独的矩形框,它代表完整的数据结构。下面各层矩形框代表这个数据的子集。最底层的各个框代表组成这个数据的实际元素(该元素不能再分割)
4.Warnier图:花括号的层次方图,花括号内信息构成顺序关系,花括号间构成树型层次关系
5.IPO图:输入、处理、输出
6.验证软件需求的正确性:一致性、完整性、现实性、有效性
第五章 总体设计
1.设计过程:共9个阶段
- 系统设计阶段:设想供选择的方案、选取合理的方案、推荐最佳方案(3)
- 结构设计阶段:功能分解、设计软件结构、设计数据库、制定测试计划、书写文档、审查和复审 (6)
2.设计原理:
- 模块化:把程序划分成独立命名且可独立访问的模块,每个模块完成一个子功能,这些模块集成起来构成一个整体,可以完成指定的功能满足用户的需求。可以使软件结构清晰,容易设计也容易阅读理解。
- 抽象:抽象出十五的本质特性而暂时不考虑细节
- 逐步求精:为了能集中精力解决主要问题而尽量推迟对问题细节的考虑(说人话就是先做个大概,然后逐渐完善)
- 信息隐藏:在设计和确定模块时,使得一个模块内包含的信息(过程或数据)不允许其他不需要这些信息的模块访问,独立的模块间仅仅交换为完成系统功能而必须交换的信息。
- 局部化:将一些关系密切的软件元素物理地放的彼此靠近
- 模块独立:时模块化、抽象化、信息隐藏和局部化的直接结果。两个基本准则:耦合性、内聚性
- 耦合:对一个软件结构内不同模块之间互联程度的度量。耦合强弱取决于模块间接口的复杂程度,进入或访问一个模块的点以及通过接口的数据。耦合程度强烈影响着系统的可理解性、可测试性、可靠性和可维护性。设计原则:尽量使用数据耦合,少用控制耦合和特征耦合,限制公共环境的耦合的范围,完全不用内容耦合。
- 数据耦合:两个模块彼此通过参数交换信息么热切交换的信息仅仅是数据。数据耦合是低耦合。系统中至少必须存在数据耦合。
- 控制耦合:传递的信息中有控制信息。中等耦合。一般来说控制耦合是多余的,可以把模块分解后用数据耦合代替。
- 特征耦合:当整个数据结构作为参数传递而被调用的模块只需要使用其中一部分数据元素。低耦合。会导致数据的访问失去控制
- 公共环境耦合:两个或多个模块通过一个公共数据环境相互作用。公共环境可以是全程变量、共享通信区、内存的公共覆盖区、任何存储介质的文件、物理设备等。较强耦合。
- 内容耦合:高耦合
1.一个模块访问另一个模块的内部数据
2.一个模块不通过正常入口而转移到另一个模块的内部
3.两个模块有一部分程序代码重叠
4.一个模块有多个入口 - 内聚:标志着一个模块内各个元素彼此之间结合的紧密程度,它是信息隐藏和局部化概念的扩展。设计原则:力求高内聚,通过提高模块间的内聚降低耦合从而使模块获得较高的独立性。
- 低内聚:
1.偶然内聚:一个模块完成一组任务,这些任务之间即使有关系也只是松散关系。如一个语句出现两次或多词,则将其作为一个模块以节省内存。
2.逻辑内聚:一个模块完成的任务在逻辑上属于相同或相似的一类。如一个模块产生各种类型的全部输出。
3.时间内聚:一个模块包含的任务必须在同一时间内执行。如模块的初始化。 - 中内聚
1.过程内聚:一个模块内处理元素使相关的,而且必须以特定次序执行。如了流程图确定模块的划分。
2.通信内聚:模块中所有元素都使用同一个输入数据,或产生同一个输出数据。 - 高内聚
1.顺序内聚:一个模块内的处理元素和同一个功能密切相关,且这些处理必须顺序执行。如一个处理元素的输出作为下一个处理元素的输入。
2.功能内聚:模块内的所有处理元素属于一个整体,完成单一的功能。 - 各种内聚优劣评分
名称 | 得分 |
---|---|
功能内聚 | 10 |
顺序内聚 | 9 |
通信内聚 | 7 |
过程内聚 | 5 |
时间内聚 | 3 |
逻辑内聚 | 1 |
偶然内聚 | 0 |
3.启发规则
-
改进软件结构提高模块独立性
-
模块规模应该适中
-
深度、宽度、扇出和扇入都应适当
-
模块的作用域应该在控制域内
-
力争降低模块接口的复杂程度
-
设计单入口单出口的模块
-
模块的功能应该可预测
-
顶层扇出较高,中间层扇出较少,底层模块高扇入
4.描绘软件结构的图形工具 -
层次图:描绘软件的层次结构。一个矩形框代表一个模块,方框间的连线表示调用关系
-
HIPO图:“层次图加输入/处理/输出图”,就是在层次图的每个方框加编号
-
结构图:每个方框代表一个模块,框内注明模块的名字或主要功能,方框间的箭头(或直线)代表模块的调用关系,注释表示来回传递的信息【尾部空心圆表示传递数据,实心圆代表传递控制信息】
5.面向数据流的设计方法:把信息流映射成软件结构,信息流的类型决定了映射的方法,信息流可以分为两种类型:变换流和事务流
- 变换流:信息延输入通路进入系统,同时由外部形势变换成内部形式,进入系统的信息通过变换中心,经过加工处理以后再沿输出通路变换成外部形势离开软件系统(传入→变换→传出)
- 数据沿输入通路到达一个处理T,T根据输入数据的类型在若干动作序列中选一个执行。T成为事务中心。(接收数据→分析类型→选取通路)
6.变换分析过程:(不是重点)
- 复查基本系统模型
- 复查并精化数据流图
- 确定数据流图具有变换特性还是事务特性
- 确定输入流和输出流的边界,从而孤立出变换中心
- 完成一级分解
- 完成二级分解
- 使用设计度量和启发式规则对第一次分割得到的软件结构进一步精化
第六章 详细设计
1.程序流程图:描述过程设计的方法,使用混乱在尽量减少使用。
- 优点:直观、容易掌握
- 缺点:1.不是逐步求精的好工具,使程序员过早考虑控制流程,而不考虑全局结构。2.箭头代表控制流,不受约束随意转移。3.不易表示数据结构
2.盒图(N-S图)
- 功能域明确
- 不能随意转移控制
- 容易确定局部和全局数据的作用域
- 容易表示嵌套关系,可以表示模块的层次结构
3.问题分析图(PAD图):使用二维树形结构来表示程序的控制流。优点:
- PAD设计出的必然是结构化程序
- PAD图描绘的程序结构清晰
- PAD图表现程序的逻辑易读、易懂、易记
- PAD图转换成高级语言容易
- 可表示程序逻辑,也可表示数据结构
- PAD符号支持自动向下,逐步求精
4.判定表:当算法中含有多重嵌套的条件选择时
- 优点:能够清晰表示复杂的条件组合与应做动作之间的关系
- 缺点:不能一眼看出判定表的含义,当数据元素多余两个时,判定表的简洁程度下降
5.判定树:判定表的变种,清晰表示复杂的条件组合与操作之间的关系
- 优点:形式简单,一眼看出含义
- 缺点:简洁性不如判定表,判定树分支次序对画出判定树的简洁程度有较大影响
6.过程设计语言(PDL):也称伪码,用于描述功能模块的算法设计和处理细节的语言
- 优点:
1.可作为注释放在源程序中间
2.可使用普通正文编辑器或文字处理系统完成PDL的书写
3.已有自动处理PDL的程序,可以自动生成源代码 - 缺点:不如图形直观,不如判定表清晰
7.Jackson图:
- 顺序结构:顺序结构的数据由一个或多个数据元素组成,每个元素按确定次序出现一次
- 选择结构:选择结构的数据包含两个或多个数据元素,每次使用这个数据按一定条件从这些数据元素中选择一个
- 重复结构:重复结构的数据,根据使用条件由一个数据元素出现零次或多次构成
- 改进的Jackson图:用i来表示循环的编号
- Jackson图中,模块之间若有直线连接表示之间存在组成关系
8.McCabe:根据程序控制流的复杂程度定义程序的复杂程度,这样度量出的结果称为程序的环形复杂度
- 流图的表示:
1.节点:圆,一个圆代表一条或多条语句
2.边:箭头表示边,代表控制流
3.区域:由边和节点围成的面积,计算区域数时包括图外未被围起来的区域
4.判定节点:包含条件的节点 - 计算环形复杂度的方法:
1.流图中线性无关区域等于环形复杂度
2.流图G的环形复杂度等于V(G) = E - N + 2,其中E时六途中的边数,N是节点数
3.流图G的环形复杂度V(G) = P + 1,其中P是流图中判定节点的数目
第七章 实现
1.测试用例:通常指测试数据和预期的输出结果,测试用例是执行测试的最小实体。
2.测试不能表名软件中不存在错误,它只能说明软件中存在错误
3.测试的目标和目的:
- 测试是为了发现程序中的错误而执行程序的过程
- 好的测试方案是极有可能发现目前尚未发现的错误的测试方案
- 成功的测试是为了发现目前尚未发现的错误的测试
4.测试方法:黑盒测试和白盒测试
- 黑盒测试(功能测试):已知产品应该具有的功能,通过黑盒测试来检验每个功能是否符合设计要求
- 白盒测试(结构测试):已知内部工作过程,哦那个白盒测试检验每种内部操作是否按要求规定正常进行
5.测试步骤:
- 单元(模块)测试:保证每个模块作为一个单元能够正常运行,发现编码错误和详细设计错误
- 集成测试(子系统测试和系统测试):把模块测试的模块放在一起形成系统来测试,发现结构和软件设计错误
- 确认(验收)测试:把系统作为实体测试,验证系统是否满足用户需求,发现系统需求说明说的问题
- 平行运行:新开发的系统和即将被取代的旧系统进行比较运行结果
6.单元测试:
- 测试重点:
1.模块接口测试
2.局部数据结构测试
3.重要的执行通路测试
4.错误处理测试
5.边界测试 - 代码审查:发现大部分逻辑设计错误和编码错误
- 计算机测试
7.集成测试:
- 渐增式组装方式
1.自顶向下渐增:分为深度优先和宽度优先。不需要驱动模块,需要存根模块。优点:能在早期发现上层模块的接口错误。
2.自底向上渐增:不需要存根程序,需要驱动模块
3.混合渐增 - 非渐增式组装方式:发现问题难以定位,需所有单元就绪才可测试,适合于小规模应用。
8.确认测试:黑盒测试模式
- Alpha测试:由用户再开发者场所进行,开发者对用户进行"指导"
- Beta测试:用户再实际环境下进行测试
9.白盒测试:
- 逻辑覆盖
1.语句覆盖:被测程序中每个语句至少执行1次
2.判定覆盖:每条语句至少执行1次,每个判定的每种可能的结果也至少执行1次
3.条件覆盖:每个语句至少执行1次,判定条件每个条件都取到各种结果
4.判定/条件覆盖:判定表达式中每个条件都取到,每个判定表达式也都取到各种可能的结果
5.条件组合覆盖:每个判定表达式中的条件的各种组合至少出现1次
6.点覆盖:每个节点执行1次
7.边覆盖:每个边执行1次
8.路径覆盖:每条路径执行1次 - 控制结构测试
1.基本路径测试:根据过程设计结果画出相应的流图、计算流图的环形复杂度、确定线性独立路径的基本集合、设计可强制执行基本集合中每条路径的测试用例
2.条件测试
3.循环测试
10.黑盒测试:
- 等价划分(用的最多):把程序的输入域划分成若干个数据类,据此导出测试用例
- 边界值分析:选取刚好等于、稍大于和稍小于等价类边界的数据作为测试数据
- 错误推测:列举可能有的错误和容易发生错误的特殊情况
第八章 维护
1.软件维护定义:软件已经交付使用之后,为了改正错误或满足新的需要而修改软件的过程
2.结构化维护和非结构化维护:
- 结构化维护:有一个完整的软件配置存在,维护从评价设计文档开始就很规范,减少经历的浪费,提高维护的总质量
- 非结构化维护:软件配置的唯一成分是程序代码,维护活动从评价代码开始由于文档不足而造成困难增加成本
3.决定软件可维护的因素:
- 可理解性
- 可测试性
- 可修改性
- 可移植性
- 可重用性
第九章 面向对象方法学索引
1.面向对象方法学概述:
- 基本原则:尽可能模拟人类习惯的思维方式,是开发软件的方法和过程尽可能接近人类认识的世界解决问题的方法和过程
- 4个要点
1.软件由对象组成,任何事务都是对象,复杂软件对象由比较简单的软件对象组成
2.所有对象都划分成对象类,类都定义了一组数据和一组方法
3.若干对象类组成一个层次系统
4.对象间仅能通过传递消息相互联系 - 优点
1.与人类习惯的思维方式一致
2.稳定性好
3.可重用性好
4.较易开发大型软件产品
5.可维护性好
2.面向对象的概念
- 对象定义:
1.具有相同状态的一组操作的集合。
2.对象是对问题与中某个东西的抽象。
3.对象::=<ID,MS,DS,MI>。ID是对象的标识或名字,MS操作集合,DS数据结构,MI对象受理的消息名集合 - 对象的特点:
1.以数据为中心
2.对象是主动的
3.实现了数据封装
4.本质上具有并行性
5.模块独立性好 - 其他概念(默认会了,跟Java差不多):
1.类
2.实例
3.消息
4.方法
5.属性
6.封装
7.继承
8.多态性
9.重载
4.对象模型:使用统一建模语言UML提供的类图来建立对象模型
- 类图:描述类及类间的静态关系。类图是一种静态模型,它是创建其他UML图的基础。一个系统可以由多张类图来描述,一个类也可以出现在几张类图中。
类图的基本符号
- 类图描述类及类间的静态关系,类图是一种静态模型
- 定义类:由长方形表示,上中下分别放类的名字、属性和服务。如下所示:
- 定义属性:可见性 属性名:类型名=初值
可见性:(+)public、(-)private、(#)protected
例:-管理员:String=“增删改查” - 定义服务:可见性 操作名(参数表):返回类型{性质串},参数表是用逗号分割的形式参数序列语法 “参数名:类型名=默认值”
表示关系的符号:
- 关联:
1.普通关联:通常关联是双向的,可以给关联取名字,直线两端可以写上关联重数,"*"代表多重,未标注重数默认为1
2.关联的角色:??这书上它不说人话,我也没看懂??(先放着)
3.限定关联:对关联的含义做某种约束,可以把模型的重数从1对多变成1对1,或从多对多变成多对1
4.关联类:进一步说明对象间关联的性质。引入一个关联类来记录这些附加信息。关联类通过虚线与关联连接。(说人话就是牵跟虚线对该关联进行解释说明) - 聚集:聚集是关联的特例,表示整体——部分的关系
1.共享聚集:处于部分方的对象可同时参与多个处于整体方对象的构成。(相当于多对多关系,一个学生可以是同一个高数教学班,也可以是同一个英语教学班)表示方法:在整体类的地方画一个空心菱形
2.组合聚集:部分类完全隶属于整体类,部分与整体共存,整体不存在了部分也会随之消失。(简单来说就是大类没了,其中包含的小类也随之消失),用实心菱形表示。 - 泛化:一般来说是继承关系
1.普通泛化:普通继承关系
2.受限泛化:加一些约束条件如:多重(多次继承同一个上层基类)、不相交、完全(父类中所有子类都在类图中穷举)、不完全 - 依赖和细化
1.依赖:就是你想象中的依赖,一个类的模型元素改变会影响依赖于它的模型元素
2.细化:同一个事物在不同抽象层次上描述时,描述间具有细化关系。(说人话就是解释的更清楚了叫细化)
5.动态模型
好像不考,不是很确定
6.功能模型
- 用例图
1.系统:系统被看作一个测试用例的黑盒子
2.用例:可以被行为者感受到的、系统的一个完整的功能。特征:用例代表某些用户可见的功能,实现一个具体的用户目标;用例总是被行为者启动的,并向行为者提供可识别的值;用例必须是完整的。
3.行为者:与系统交互的人或其他系统,它代表外部实体。用例总是由行为者启动的。
4.用例间的关系:泛化关系(分为扩展关系和使用关系)、包含关系 - 用例建模:一个用例模型由若干用例图组成。创建用例模型的步骤为:1.定义系统 2.寻找行为者和用例 3.描述用例 4.定义用例之间的关系 5.确认模型,其中寻找行为者和用例是关键
7.三种模型之间的关系
对象模型 | 动态模型 | 功能模型 |
---|---|---|
对象的静态结构及相互关系 | 与实践和顺序有关的系统性质 | 与值的变化有关的系统性质 |
描述系统的数据结构 | 控制结构 | 系统的功能 |
干事的实体(主体) | 什么时候干 | 干什么 |
第十、十一、十二章 面向对象分析、设计和实现
- 复杂问题的对象模型的5个层次分别为:主题层、类与对象层、结构层、属性层、服务层
其他的自己看吧,我也不知道重点在哪里…
第十三章 软件项目管理
1.软件配置项:软件过程的输出信息可以分为3类:程序、文档、数据
2.基线:已经通过了正式复审的规格说明或中间产品,它可以作为进一步开发的基础,并且只有通过正式的变化控制过程才能改变它。(说人话:基线建立之前随便改,建立之后也可以改但是很麻烦)
面向考试复习:
- 先拿大题分:(排名越前面越重要)
1.测试用例
2.数据流图
3.类图(见第9章)
4.系统结构图
1)从新系统数据流程图出发导出初始结构图。即首先把整个系统看作一个模块,然对其逐层分解。分解时,要遵守划分模块的基本原则和完成数据流程图所规定的各项任务及其处理顺序。每分解出一层模块,都要标明信息传递情况并考虑每一模块的实现方法,同时还要考虑系统结构的层数。
(2)对系统结构图进行改进。即从提高模块的独立性目标出发,检査每一个模块,是否还可以降低关联度,提高聚合度,如果可以,就要对其改进,直到理想为止。
划分模块的规则:
1.做到高内聚、低耦合
2.模块大小适中
3.深度、宽度、扇入、扇出适当
4.模块的作用域在控制域之内
5.降低接口复杂度
6.单入口单出口
7.模块功能可预测
5.实体联系图(E-R图)
6.用例图
方框代表系统,椭圆代表用例,线条人代表行为者,直线连接行为者和用例,表示两者间交换关系,用例间的关系分为扩展(extend)和使用(include)关系。画用例图的关键是定义系统、寻找行为者和用例、描述用例、定义用例间的关系
7.流程图
8.控制流图
9.状态转移图
10.顺序图(这篇文章讲得详细)
https://blog.csdn.net/litianxiang_kaola/article/details/53957312.
11.Jackson图
12.对象模型
13.等价类测试法
- 其他重点慢慢更…