软件工程 复习

总体设计

总体设计(概要设计或初步设计):概括地说系统应该如何实现;设计软件地结构、确定软件中每个程序是由那些模块组成的;以及这些模块互相的关系
组成:**系统设计阶段/确定系统的具体实现方案;结构设计阶段/确定软件结构

设计原理

模块是数据说明、可执行等程序对象的集合,是构成程序的基本构件、可以单独命名
模块化和软件成本的关系:等在一定范围内、软件总成本随着模块数目增加而降低但超过一定范围后因为接口成本的不断上升软件总成本也在不断上升

耦合与内聚

耦合是对一个软件结构内不同模块之间互连程度的度量
在软件设计当中应该尽量追求松散耦合的系统
耦合强度
0. 最低,模块间没有任何连接

  1. 数据耦合:交换数据信息
  2. 特征耦合:将多余信息传入
  3. 控制耦合:传递的信息当中包括控制信息(控制耦合往往是多余的、可以进行适当的分解就可以用数据耦合代替)
  4. 公共耦合:两个模块通过一个公共数据换进相互作用
  5. 内容耦合
    • 一个模块访问能一个模块内部数据’
    • 一个模块不通过正常入口而转入另一个模块内部
    • 两个模块有一部分程序代码重叠(只可能出现汇编程序中)
    • 一个模块有多个入口(意味着一个模块有几种功能)

内聚标志着一个模块内各个元素彼此结合的紧密程度
模块内的高内聚往往意味着模块间的宋松耦合
内聚程度

低内聚

  1. 偶然内聚:一个模块完成一组任务、这些任务彼此之间只可能有松散的关系
  2. 逻辑内聚:一个模块完成的任务在逻辑上属于相同或相似的一类(例如一个模块产生各种类型的全部输出)
  3. 时间内聚:一个模块包含的任务必须同一时间内执行

中内聚

  1. 过程内聚:一个模块内处理元素是相关的、而且必须以特定次序执行
  2. 通信内聚:模块中所有元素都使用同一输入数据和(或)产生同一输出数据

高内聚

  1. 顺序内聚:一个模块内处理元素和一个功能密切相关,并且顺序执行
  2. 功能内聚:模块内所有处理元素属于同一整体,完成单一的功能】

启发规则

1.改进软件结构提高模块独立性
2.模块规模应适中
3.深度、宽度、扇出、扇入都应该适当
深度表示软件结构中控制发的层数
宽度是软件结构同一层次上模块总数的最大值
扇出为一个模块直接控制(调用)的模块数目,扇出大模块复杂。
扇入为一个模块有多少上级模块调用,扇入越大则共享该模块的上级数目越多

模块的域

模块的作用域定义为受该模块内一个判定影响的所有模块的集合。
模块的控制域是这个模块本身以及所有直接或间接从属它的模块的集合
由上面可以知道---> 最佳情况:作用域在控制域中

层次图和HIPO图
层次图是用来描绘软件的层次结构。上下层的关系为调用关系、即上层调用下层
HIPO图即“层次图加输入/处理/输出图

结构图
结构图和层次图相类似,也是描绘软件结构的图形工具,图中一个方框代表一个模块、方框间的箭头表示模块的调用关系。当箭头的尾部是空心圆表示传递的是数据、实心圆表述传递的是控制信息

面向数据流的设计方法

概念:面向数据流的设计方法把信息流映射成软件结构、信息流的类型决定了映射的方法
主要分为:变换流 和 事务流

详细设计

如果一个程序的代码块仅仅通过顺序、选择、和循环这3种基本控制结构进行连接,并且每个代码块只有一个入口和一个出口,则称这个程序是结构化的

过程设计的工具 --- 图

程序流程图

程序流程图又称为程序框图
优点:描绘直观、便于掌握
缺点:缺乏全局、没有很好的约束、不易表示数据结构

盒图

盒图有叫“N-S 图
盒图主要表现:顺序、if_then_else 、case 、循环、调用

PAD 图

PAD图(problem analysis diagram)用二维树形结构的图来表示程序的控制流,

主要优点

  • 使用表示结构化控制结构的PAD符号所设计出来的程序必然是结构化城程序
  • PAD图表达清晰、PAD图中竖立的总条数就是程序的层次数
  • PAD从最左边竖线上端的结点开始执行、从上而下、从左到右顺序执行,遍历所有结点
  • 容易将PAD图转换成高级语言、提高效率
  • 既可以用于程序逻辑、也可以用于描绘数据结构
  • PAD图支持自顶向下、逐步求精的使用

判定表和判定树

当算法中存在多重嵌套的条件选择是,判定表和树就是不错的选择
判定表的组成:
左上角列出所有条件、左下角是所有可能做的动作、右上部是表示各种条件组合的矩阵、右下部是和每种条件组合相对应的动作
*判定表右边部的每一列实质上是一条规则,规定了与特定的条件组合相对应的动作
判定树是判定表的变种

过程设计语言

过程设计语言(PDL)也被成为伪代码,它是用正文形式表示数据和处理过程的设计工具
特点:

  • 关键字的固定用法,比如if end if
  • 自然语言的自由语法
  • 数据说明的手段
  • 模块定义和调用的技术,应该提供各种接口描述模式

优点
1)可以作为注释直接插在源程序中间
2)可以使用普通的正文编辑程序或文字处理系统
3)可以有PDL生成程序代码

面向数据结构的设计方法

jackson图
因为程序中数据元素彼此之间的逻辑关系只有顺序、选择、重复 因此逻辑数据结构也只是只有这三类

程序复杂度的定量度量

流图(程序图)即程序流程图、它仅仅描绘程序的控制流程,完全不表现对数据的具体操作以及分支或循环的具体条件。
在流图中用表示结点,一个源代表一条或多条语句。程序流程图的一个顺序的处理框序列和一个菱形判定框,可以映射成流图的一个结点。流图的箭头线成为边,代表控制流。每一条边都终止于一个结点,即使这个结点没有任何语句

环形复杂度

计算方法

  1. 流图中线性无关的区域等于环形复杂度
  2. 流图G的环形复杂度V(G) = E - N + 2,其中,E是流图中边的条数、N是节点数
  3. 流图G的环形复杂度V(G) = P + 1,其中,P是流图中判定结点的数目

Halstead 方法

令 N1 为程序中运算符出现的总次数,N2为操作数出现的总次数,程序长度N定义为 :N = N1 + N2
,再令程序中使用的不同运算符(包括关键字)的个数n1,以及不同操作数(变量和常数)的个数n2,则Halstead 给出预测程序长度为:H = n1log2 n1 + n2log2 n2
包含的错误为 E = N log2(n1+n2)/3000

实现

实现包含着编码与测试
测试方法包含 黑盒测试(功能测试)和白盒测试(结构测试)

测试步骤
首先模块测试(单元测试),保证每个模块作为一个单元能正确的运行
接着子系统测试,将经过单元测试的模块放在一起组成一个子系统来测试,着重测试模块的接口
后面系统测试,将上一步的子系统装配成一个完整的系统来测试,因为子系统测试与系统测试都有测试组装,故又将两着叫为集成测试
接着验收测试,将软件系统作为单一的实体进行测试也被叫做确认测试
最后可能还有平行运行就是同时运行新开发出来的系统和被它取代的旧系统便于比较
平行测试的好处

  • 可以在准生产环境中运行新系统而又不冒险
  • 用户有熟悉产品时间
  • 可以验证用户指南和使用手册等文档
  • 能够以准生产模式对新系统进行全负荷测试

单元测试

单元测试的重点分别是:模块接口、局部数据结构、重要的执行通路、出错处理通路、边界条件

集成测试

集成测试是测试和组装软件的系统化技术
在模块组装成程序有两种方法,一种先分别测试每个模块、再组合测试(--非渐增测试方法)另一种是把下一个要测试的模块同测试好的模块结合起来进行测试(每次增加一个模块 --- 渐增式测试
前面两种方法,渐增测试相对来说测试效果好

渐增方式的策略

渐增方式有自顶向下自底向上两种集成策略
自顶向下集成
自顶向下集成方法从主控制模块开始,沿着程序的控制层次向下移动,逐渐将所有模块都结合,它采用深度优先或者宽度优先

自底向上集成
自底向上测试从”原子“模块开始组装和测试

比较
向下:1)不需要测试驱动程序,能够早期发现上层问题 2)需要存根程序,底层较晚发现问题
向上:1)不需要测试存根程序,能够早期发现底层问题 2)需要驱动程序,上层较晚发现问题

白盒测试

逻辑覆盖

逻辑覆盖是对一系列测试过程的总称
语句覆盖-->选择足够多的测试数据、使得被测程序中每一条语句都至少执行一次
判定覆盖-->又叫分支覆盖,不仅每一个语句要执行、每一判定的每种可能都至少执行一次,即判定的每个分支都至少执行一次
条件覆盖-->不仅每一条语句至少执行一次,并且使判定表达式中的每个条件都取得各种可能的结果

判定覆盖不一定包含条件覆盖,条件覆盖也不一定包含判定覆盖,判定/条件覆盖--->即满足判定覆盖也满足条件覆盖
条件组合覆盖-->选取足够多的测试数据,使得每个判定表达式中条件可能组合至少出现一次
路径覆盖-->使程序可能路径都至少执行一次(如果程序图中有环,则要求每个环至少经过一次)
基本路径

黑盒测试

等价划分
将程序的输入域划分成若干数据类
边界值分析

软件可靠性

软件可靠性是程序再给定时间间隔内,按照规格说明书的规定成功运行的概率
软件可用性软件可用性是程序再给定时间点,按照规格说明书的规定,成功运行的概率

posted @ 2025-05-14 16:38  海&贼  阅读(55)  评论(0)    收藏  举报