软件工程复习笔记

绪论

软件危机

软件危机的产生与软件自身的特点有关,还与软件开发和维护的方法不正确有关

软件生命周期

  1. 软件定义
  2. 软件开发
  3. 运行维护

软件过程

软件过程是为了获得高质量软件所需要完成的一系列任务框架,它规定了完成各项任务的步骤工作。

可行性分析

系统流程图

数据在系统各部件之间流动情况,而不是对数据进行加工处理的控制过程。

符号

  • 矩形:处理
  • 平行四边形:输入输出
  • 圆形:连接
  • 矩形加三角形:换页符
  • 箭头:数据流

数据流图

一种图形化技术,它描绘信息流和数据冲输入移动到输出的过程中所经受的变换。

符号

  • 正方形:数据的源点或终点
  • 圆角矩形或圆形:变换数据的处理
  • 开口矩形或平行横线:代表数据储存
  • 箭头:代表数据流

数据字典

含义:关于数据的信息的集合,也就是对数据流图中包含的所有元素的定义的集合。

组成方式

  • 顺序 +
  • 选择 [ ]
  • 重复 { }
  • 可选 ( )

例子

某程序设计语言规定,用户说明的标识符是长度不超过8个字符的 字符串,其中第一个字符必须是字母字符,随后的字符既可以是字母字符 也可以是数字字符。

  • 标识符 = 字母字符 + 字母数字串
  • 字母数字串 = 0 {字母或数字} 7
  • 字母或数字 = [字母字符 | 数字字符]

需求分析

系统的综合要求

  • 功能需求
  • 性能需求
  • 可靠性和可用性的需求
  • 出错处理需求‘接口需求’约束
  • 逆向需求
  • 将来可能提出的要求

数据模型

  • 数据字典
  • 层次方框图和Warnier图
  • 数据结构规范化

与用户沟通获取需求的方法

  • 访谈
  • 焦点小组
  • 深入面谈
  • 卡片分类
  • 用户调查问卷
  • 用户日志研究
  • 人类学调查
  • 面向数据自顶向下求精
  • 简易的应用规格说明技术
  • 快速建立软件原型
  • 其他方法
  • NABCD
  • 四象图
  • 计划与估计
  • 分而治之

NABCD

Need需求、A需求、B好处、C竞争、D推广

具体建模方法

  • 功能模型:数据流图
  • 数据模型:实体关系
  • 行为模型:状态图、Petri网

实体联系图(ER图)

数据模型是一种面向问题的数据模型,是按照用户的观点

相关联的信息

  • 数据对象(实体)
  • 数据对象的属性
  • 数据对象彼此相互连接的关系
某校教学管理平台ER图

状态转换图

通过描绘系统的状态及引起系统状态转换的事件,来表示系统的行为。此外,状态图还指名了作为特定事件的结果系统将做那些动作。

  • 状态:状态时任何可以被观察到的系统行为模式
  • 事件:引起系统做动作或转换状态的控制信息

层次方框图

层次方框图用树形结构的一系列多层次的矩形框描绘数据的层次结构。

树形结果的顶层是一个单独的矩形框,它代表完整的数据结构,下面的各层矩形框代表这个数据的子集最底层的各个框代表组成这个数据的实际元素。(不能再分割的元素

形式化说明技术

常用的形式化方法

  • 较严格的形式化发展:有穷状态机、Petri网、Z语言
  • 半形式化方法:系统流程图、数据流图、数据词典、ER图等

非形式方法的缺点

  • 矛盾
  • 二义性
  • 含糊
  • 不完整
  • 抽象层次混乱

形式化方法能较号地解决需求地“二义性”、“含糊性”,但是不能接学“矛盾性”、“完整性”

有穷状态机

Petri网

Petri可以有效地描述并发活动

Petri网适合描述异步的、并发地自动化系统和计算机系统模型

总体设计

耦合

  • 无耦合
  • 数据耦合:交换数据
  • 标记耦合:应用同名标识符
  • 特征耦合:数据结构作为参数传递
  • 控制耦合:交换地信息有控制信息
  • 公共耦合:通过公共数据环境耦合
  • 内容耦合:一个模块访问另一个模块内部

尽量使用数据耦合,少用控制耦合,限制公共耦合的范围,避免使用内容耦合

内聚

偶然内聚

逻辑内聚

时间内聚

过程内聚

通信内聚

顺序内聚

功能内聚

设计准则

  1. 改进软件结构提高模块独立性
  2. 模块规模适中
  3. 深度(逻辑复杂程度)、宽度(功能复杂程度)、扇出(下级模块数,模块的复杂程度)和扇入(直接上级模块数,模块的共享程度)都应适当
  4. 模块的作用域应该再控制域之内
  • 控制域:该模块直接或间接从属于它的所有模块的集合
  • 作用域:受该模块内的一个判定影响的多有模块的集合
  • 深度和宽度适中,上层模块高扇出,下层模块高扇入;作用域在控制域内。
  1. 力争降低模块接口的复杂程度
  2. 设计单入口单出口的模块
  3. 模块功能应该可以预测

总体设计的图形描述工具

层次图

层次图表示功能模块的调用关系,上层模块调用下层模块所需的功能。

HIPO图

对层次图改进:

  • 每个方框有编号
  • 每个方框对应一张IPO图

结构图

对层次图的改进:

采用带有注释的箭头表示模块调用时参数的传递

实心圆 注释箭头表示传递控制信息,空心圆注释箭头表示传递数据;

菱形表示条件分支选择

箭头圆弧表示循环

数据流图类型

变换型数据流图

事务型数据流图

结构化设计方法7步

  1. 复查基本系统模型
  2. 复查并精化数据流图
  3. 确定数据流图的类型
  4. 确定输入流和输出流的边界,从而孤立出变换中心
  5. 进行“第一级分解”
  6. 进行“第二级分解”
  7. 对第一次分割得到的软件结构进一步精化

详细设计

4个人机问题

  1. 系统响应时间
  2. 用户帮助设施
  3. 出错信息(及警告信息)处理
  4. 命令交互

3类人机交互

一般交互界面:包括信息显示、数据输入、系统整体控制。这一部分指南具有全局性意义,对系统界面好坏影响极大

信息显示界面:

数据输入界面:主要从输入效率和减少出错率考虑。

过程设计工具

程序流程图

程序流程图作为算法表达工具是人们对解决问题的方法、思路或算法的一种描述。

优点

  • 采用简单规范的符号,句法简单;
  • 结构清晰,逻辑性强
  • 便于描述,容易理解

缺点

  • 本质上不是“自顶向下、逐步求精”的设计工具容易过早关注细节
  • 不是结构化设计工具

盒图(N-S图)

问题分析图(PAD图)

二维、树形结构表示程序的控制结构的结构化设计方法

垂直方向表明了结构的顺序,水平方向表明了结构嵌套的层次及深度

判定表

判定表由四部分组成:

  • 基本条件
  • 条件组合矩阵
  • 基本动作
  • 动作组合矩阵

判定树

PDL

外层语法确定,关键词一律大写

内层语法不确定

Jackson

结构化开发面向数据流,Jackson系统开发面向数据结构的开发方法,其基本思想实现建立输入输出的数据结构,再将其转换为软件结构。

三种结构

改进Jackson

表示选择或重复结构是,选择条件和循环条件不能直接在图上表示出来

框间连线为斜线,层次结构不严谨

与软件结构层次图不同

  1. 方框内容不同
  • 层次图中的一个方框通常代表一个模块
  • Jackson图的一个方框只代表几个语句
  1. 上下方框之间的关系不同
  • 层次图表现的是调用关系
  • Jackson图表现的是组成关系

例子

程序复杂程度的定量度量

定量度量的结果可以用来比较两个不同的设计或两个不同算法的优劣

McCabe方法

MacCabe根据图论定义了循环数来得到一种软件复杂性度量方法,即McCabe循环复杂度。

当程序中包含符合条件是,将其拆分成若干个简单条件

同一个符合条件中简单条件结合串联起来

环形复杂度计算

  1. 使用区域数:上图为$\mathrm{V}(\mathrm{G})=\mathrm{D}=4$($R_1$,$R_2$,$R_3$,$R_4$)
  2. 使用边与节点数计算:$\mathrm{V(G)=E-N+2}=11-9+2=4$
  3. 使用判定节点数计算:$\mathrm{V}(\mathrm{G})=\mathrm{P+1}$

Halstead方法

Halstead度是基于程序源码。Halstead指出估计工作量,或者程序员工作时间,可以用运算符,运算元或语法数的函数来表示。

根据程序中运算符和操作数的总数来度量程序的复杂程度

  • 程序长度N:
  • N1:程序中运算符出现的总次数
  • N2:程序中操作数出现的总次数
  • 程序的总长度N=N1+N2
  • 预测长度H
  • n1程序中不同运算符(包括关键字)出现的总次数
  • n2程序中不同操作数(包括变量和常量)出现的总次数
  • 预测总长度 $H=n_1\log_{2}n_1+n_2\log_2n_2$
  • 程序中错误数E的预测
  • $E=N\log_2(n_1+n_2)/3000$

实现

编码

编码是将设计结果翻译成程序

编码风格对软件的可读性、可维护性、可靠性、可用性很重要。

编码风格包括:良好的文档(注释)、数据说明、语句构造、输入输出和效率保障等。

白盒测试

逻辑覆盖

程序内部的逻辑结构为基础来测试用例

  • 语句覆盖:每个语句至少执行了一次
  • 判定覆盖:每个判定真假的分支都至少执行一次
  • 条件覆盖:每个判定的每个条件的可能值至少执行一次
  • 判定/条件覆盖:能够同时满足判定、条件两种覆盖标准的取值
  • 条件组合覆盖:所有可能的条件取值组合至少执行一次
  • 点覆盖:点覆盖标准和语句覆盖的标准是相同的
  • 边覆盖:边覆盖和判定覆盖是一致的
  • 路径覆盖:取足够多的测试数据,使程序的每条可能路径都至少执行一次。

控制结构测试

基本路径测试:画流图->求环形复杂度->求路径独立集(下一条路径应该至少包含前面路径中没有出现的一条新边)->设计测试用例

条件测试:可实现判定/条件覆盖条件组合覆盖,分支测试、域测试和BRO测试

  • 布尔算符错
  • 布尔变量错
  • 关系算符错
  • 算术表达式错
  • 括号错

循环测试:循环测试是专注于测试循环结构的有效性的一种白盒测试技术。测试的要点是发现循环次数控制中可能的错误。

黑盒测试

黑盒测试着重测试软件功能

错误类型

  • 功能不正确或遗漏了的功能
  • 界面错误
  • 数据结构错误或外部数据库访问错误
  • 性能错误
  • 初始化和终止错误

等价划分

  1. 构建等价类表:每个等价类规定一个唯一的编号
  2. 为有效等价类设计测试方案:设计一个新的测试用例,使其尽可能多地覆盖尚未覆盖地有效等价类,重复这一步骤,知道所有有效等价类均被测试用例所覆盖。
  3. 为无效等价类设计测试方案:设计一个新的测试用例,使其支付该一个无效等价类,重复这一步骤直到所有无效等价类均被覆盖。

边界值分析

等价类地每个边界都要作为测试条件

错误推断

根据经验、直觉和预感进行测试。

用例:缺省值、空白值、空值

调试

  • 蛮干法 单点跟踪
  • 回溯法 从出错处向上回溯
  • 原因排除法
  • 对分查找法
  • 归纳法:整理出出错规律
  • 演绎法

The cover is by ThisisEngineering RAEng on Unsplash

EricXia

EricXia

喜欢睡觉,热爱钻研各种问题。