软件危机
概念
在计算机软件开发和维护过程中所遇到的一系列严重问题,包括:
- 如何开发软件,以满足对软件日益增长的需求
- 如何维护数量不断膨胀的已有软件
表现
- 对软件开发成本和进度估算不准确
- 用户对已完成软件不满意
- 软件质量不可靠
- 软件不可维护
- 没有适当文档资料
- 软件成本在计算机系统中所占比例逐年上升
- 软件开发生产率低
原因
1、主观原因:
忽视需求分析
轻视软件维护
没有认识到程序只是软件的一部分
没有认识到软件开发只是漫长的软件生命周期中一个比较次要阶段
越到后期引入变动付出代价越高昂
2、客观原因:
软件是逻辑实体、缺乏可见性,管理和控制困难
软件不会磨损,维护意味着修改原来设计,维护困难
软件规模庞大,程序复杂性随规模增加指数上升
解决
消除软件危机的途径:
1、对计算机软件应该有正确认识
2、吸取借鉴人类长期从事各种工程项目积累的原理、概念、技术和方法
3、积极开发和使用计算机辅助开发工具
4、探索更好更有效的管理措施和手段对开发过程进行控制和管理
管理+技术
生命周期
软件过程模型
瀑布模型
1、瀑布模型的优点(强迫开发人员使用规范的方法,严格规定了每个阶段必须提交的文档,要求每个阶段)
可以强迫开发人员采用规范的方法;
严格规定了每个阶段必须提交的文档;
要求每个阶段交出的所有产品都必须经过质量保证小组的仔细验证。
2、瀑布模型的缺点
在软件开发的初期阶段就要求做出正确、全面、完整的需求分析对许多应用软件来说是极其困难的。
在需求分析阶段,当需求确定后,无法及时验证需求是否正确、完整。
作为整体开发的瀑布模型,由于不支持产品的演化,缺乏灵活性,对开发过程中很难发现的错误,只有在最终产品运行时才能暴露出来, 从而使软件产品难以维护
快速原型模型
喷泉模型
增量模型
螺旋模型
可行性分析
组织分析
需求分析
各种图
ER图(实体、关系、属性)
软件需求规格说明书
数据流图和数据字典
数据流图父图与子图要平衡一致,命名要规范
软件设计准则
- 模块化
- 抽象
- 逐步求精
- 信息隐藏和局部化
- 模块独立
耦合
公共耦合、控制耦合、特征耦合、数据耦合
类型 | 定义 |
---|---|
无直接耦合 | 没有直接的数据联系 |
数据耦合 | 简单变量之类的联系 |
标记耦合 | (类、数组)的联系 |
控制耦合 | 控制信息相关 |
外部耦合 | 多模块访问全局变量 |
公共耦合 | 多模块访问全局类 |
内容耦合 | 一个模块控制零一个模块的数据 |
内聚
类型 | 定义 |
---|---|
偶然内聚 | 一个模块的各成分之间毫无关系 |
逻辑内聚 | 几个逻辑上相关的功能被放进一个模块里 |
时间内聚 | 只是因为时间因素被放在一起 |
过程内聚 | |
通信内聚 | 所有成分都操作同一数据集 |
信息内聚 | 所有功能都基于同一数据结构 |
功能内聚 | 所有成分对于完成单一功能都是必需的 |
Jackson方法
面向数据结构的设计方法(顺序结构、选择结构、重复结构)
(1)分析并确定输入数据和输出数据的逻辑结构,并用Jackson结构图来表示这些数据结构。
(2)找出输入数据结构和输出数据结构中有对应关系的数据单元。
(3)按以下的规则由输入、输出的数据结构导出程序结构。
1)为每一对在输入数据结构和输出数据结构中有对应关系的单元画一个处理框。
2)为输入和输出数据结构中剩余的数据单元画一个处理框。
3)所有处理框在程序结构图上的位置,应与由它处理的数据单元在数据结构Jackson图上的位置一致。
4)必要时,可以对映射导出的程序结构图进行进一步的细化。
(4)列出基本操作与条件,并把它们分配到程序结构图的适当位置。
(5)用伪码写出程序
面向数据流设计方法
数据流图映射成软件结构图,区分变换流和事务流
测试覆盖
由弱到强:语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖,并设计测试用例(最少的测试用例满足覆盖标准),测试用例要包括输入数据和预期输出数据以及测试用例覆盖的标准
软件测试的阶段
单元测试、集成测试、系统测试、验收测试、确认测试的含义
黑盒测试与白盒测试
黑盒测试法:
将软件看作一个黑盒子,不考虑其内部结构和处理过程,只按照规格说明书的规定,测试软件是否能够正确接收输入数据,产生正确的输出数据。即测试程序是否正确的实现了其功能。又称为“功能测试”。
白盒测试法:完全知道程序的内部结构和处理算法,因此可以将程序看作一个透明的白盒子,根据程序内部的逻辑结构测试程序内部的主要执行通路是否能够按照预定的要求正确工作。又称“结构测试”。
软件工程工具
软件建模工具、软件编码工具、软件测试工具,分别有哪些具体软件
判定树和判定表
(条件、动作、条件组合、动作结果)
基本路径测试法
环形复杂度
所有的独立路径集合
设计测试用例覆盖所有路径
等价类法设计测试用例
划分有效等价类、无效等价类,每一个测试用例尽肯能多的覆盖有效等价类,每一个测试用例只能覆盖一个无效等价类