第四章 软件工程基础
4.1 软件工程基本概念
4.1.1 软件定义与软件特点
计算机软件(software) :
是计算机系统中与硬件相互依存的另一部分,
是包括程序、数据、相关文档的集合
官方定义:
软件:计算机系统的操作有关的计算机程序、规程及可能的相关文档的完整集合。
程序: 计算机程序和数据定义的组合
规程: 执行给定任务应采取的一系列描述
文档: 程序开发、维护和使用有关的图文资料
软件的特点:
(1)一种逻辑实体,不是物理实体,具有抽象性
(2)软件的生产与硬件不同,它没有明显的制作过程
(3)软件在运行、使用期间不存在磨损、老化问题
(4)软件的开发、运行对计算机系统具有依赖性,受计算机系统的限制,导致软件移植问题
(5)软件复杂性高,成本昂贵
(6)软件开发涉及诸多社会因素
4.1.2 软件危机与软件工程
软件危机 泛指计算机软件的开发和维护过程中所遇到的一系列严重问题
软件危机的主要表现:
(1)软件需求的增长得不到满足
(2)软件不可维护或维护程度非常低
(3)软件的质量难以保证
(4)软件的开发成本与进度无法控制
(5)软件的成本不断提高
(6)软件开发生产率的提高赶不上硬件发展和应用需求的增长
可归结为 成本、质量、生产率 等问题
软件工程 :
试图用工程、科学和数学的原理与方法研制、维护计算机软件的有关技术及管理方法
软件工程学:
应用计算机科学理论和技术以及工程管理原则和方法,按预算和进度,实现满足用户要求的软件产品的定义、开发、发布和维护的工程或进行研究的学科
都是在强调软件开发过程中需要应用工程化的原则
软件工程的三要素:方法、工具、过程
方法:完成软件工程项目的手段
工具:支持软件的开发、管理、文档生成
过程: 支持软件开发的各个环节的控制、管理
目的: 研究软件的开发技术
核心思想: 把软件产品当做一个工程产品来处理
4.1.3 软件过程与生命周期
1.软件过程
软件过程 是把输入转化为输出的一组彼此相关的资源和活动
四种基本活动PDCA:
(1)plan:软件规格说明。规定软件的功能及其运行中的限制
(2)do : 软件开发与软件设计与实现。生产满足规格说明的软件
(3)check:软件确认。确认软件能够满足用户的需求
(4)action: 软件演进。为满足客户的需求,软件必须在使用的过程中演进
事实上,软件过程是一个软件开发机构根据某类软件产品为自己规定的工作步骤,它应当是科学的、合理的,否则必将影响软件产品的质量。
软件开发过程: 把客户要求转化为软件产品的过程
2. 软件开发生命周期(softeware life circle)
三个阶段:
(1)定义阶段
- 可行性研究、初步项目计划
- 需求分析
(2)开发阶段
- 总体设计
- 详细设计
- 编码
- 测试
(3)维护阶段
- 使用
- 维护
- 退役
4.1.4 软件工程的目标与原则
1.软件工程的目标
目标
在给定成本、进度的前提下、开发出具有有效性、可靠性、可维护性、可重用性、可适应性、可移植性、可追踪性和可操作性且满足用户需求的产品。
内容
(1)软件开发技术
包括:
- 软件开发学(主体)
- 开发过程
- 开发工具
- 软件工程环境
(2)软件工程管理
包括: - 软件管理学
软件按照工程化生产的重要环节,要求按照预先指定的计划、进度和预算执行,以实现预期的经济效益和社会效益。 - 软件工程经济学
研究软件开发中的成本的估算、成本效益分析的方法和技术 - 软件工程心理学
从个体心理、人类行为和企业文化等角度来有那就管理软件和软件工程的全新视角
2.软件工程的原则
(1)抽象
抽取事物最基本的特征和行为,忽略非本质细节
(2)信息隐蔽
(3)模块化
(4)局部化
(5)确定化
(6)一致性
程序内外接口保持一致,系统规格说明与系统行为保持一致
(7)完备性
(8)可验证性
自顶向下,逐层分解
4.1.5 软件开发工具与软件开发环境
1.软件开发工具
从单项的开发逐步向集成工具发展
为软件开发方法的有效应用提供了自动的或半自动的软件支撑环境
2.软件开发环境
软件开发环境是全面支持软件开发全过程的软件工具集合
计算机辅助软件工程(computer aided software engineering)CASE将各种软件工具、开发机器和存放开发过程信息的中心数据库组合起来,形成软件工程环境
4.2 结构化分析方法
包括:分析方法、设计方法、程序设计方法
4.2.1 需求分析与需求分析方法
1.需求分析
软件需求: 是指用户对软件系统在功能、行为、设计约束等方面的期望
需求分析的任务 发现需求、求精、建模和定义需求的过程
需求分析将床还能所需的数据模型、功能模型和控制模型
(1)需求的定义
-
用户解决问题或达到目标所需的条件或权能
-
系统或系统部件要满足合同、标准、规范或其他正式规定文档中所需具有的条件或权能
-
一种反映以上任意一中所描述的条件或权能的文档说明
该定义从 外部行为、内部特性 阐明需求的定义
(2)需求分析阶段的工作
概括为四个方面:
- 需求获取
- 需求分析
- 编写需求规格书
- 需求评审
2.需求分析方法
常见的需求分析方法有:
- 结构化分析方法
a.面向数据流的结构化分析方法
b.面向数据结构的结构化数据系统开发方法
c.面向数据结构的Jackson方法 - 面向对象的分析方法
a. 静态分析方法
b.动态分析方法
4.2.2 结构化分析方法
1.关于结构化分析方法
结构化分析方法 是结构化程序设计理论在软件需求分析阶段的运用
是使用数据流图(DFD)、数据字典(DD)、结构化英语、判定表和判定树等工具,来简历一种新的、成为结构化规格说明目标的文档
目的 帮助弄清用户对软件的需求
步骤
(1)通过对用户的调查,以软件的需求为线索,获得当前系统的具体模型
(2)去掉具体模型中非本质因素,抽象出当前系统的逻辑模型
(3)根据计算机的特点分析当前系统与目标系统的差别,建立目标系统的逻辑模型
(4)完善目标系统缤纷补充细节,写出目标系统的软件需求规格说明
(5)评审直到确认完全符合对软件的需求
2.结构化分析的常用工具
(1)数据流图(data flow diagram,DFD)
步骤:
由里向外,自顶而下,逐层分解
图形:
圆圈:加工转换
箭头:数据流
双横线:存储文件(数据源)
方框:数据的源点和终点
(2)数据字典(data dictionary,DD)
结构化分析方法的核心
(3)判定树
(4)判定表
4.2.3 软件需求说明书
1.软件需求规格说明书的作用
(1)便于用户、开发人员进行理解和交流
(2)反映出用户问题的结构,可以作为软件开发工作的基础和依据
(3)作为确认和验收的依据
(4)为成本估算和编制计划进度提供基础
(5)软件不断改进的基础
2.软件需求规格说明书的内容
应重点描述:
软件的功能需求、性能需求、外部接口、属性及约束条件等
3.软件需求规格说明的特点
正确性、无歧义性、完整性、可验证性、一致性、可理解性、可追踪性、可修改性
4.3 结构化设计方法
4.3.1 软件设计的基本概念
1.软件设计的基础
软件设计的重要性 :
(1)软件开发阶段占据软件项目开发总成本的绝大部分,是软件开发中形成质量的关键环节
(2)软件设计是开发阶段的最重要的步骤,是将需求转化成完整的软件产品或系统的唯一途径
(3)软件设计做出的决策,最终影响软件实现的成败
(4)设计是软件工程和软件维护的基础
技术观点看,~包括:
(1)软件结构设计:定义软件系统与各主要部件的关系
(2)数据设计:将分析时创建的模型转化为数据结构的定义
(3)接口设计:描述软件内部、软件和协作系统之间以及软件与人之间如何通信
(4)过程设计:系统结构部件转换成软件的过程性描述
工程管理角度看,~包括
- 概要设计:
将软件需求转化为软件体系结构、确定系统级接口、全局数据结构或数据库模式 - 详细设计:
确立每个模块的实现算法和局部数据结构,用适当方法表示算法和数据结构的细节
2. 软件设计的基本原理
(1)抽象
(2)逐步求精和模块化
(3)信息隐蔽和局部化
(4)信息独立性
3. 结构化设计方法
采用最佳的可能方法设计系统的各个组成部分以及各组成部分之间的内部联系的技术
4.3.2 概要设计
1.概要设计的任务
(1)设计软件系统结构
(2)数据结构及数据库设计
(3)编写概要设计文档
(4)概要设计文档评审
常用的软件结构设计工具:结构图(structure chart),也称程序结构图
图形说明:
矩形:一般模块
带圈箭头:数据信息
实圈箭头:控制信息
用于描述软件系统的层次和分块结构关系
模块类型:
- 传入模块
- 传出模块
- 变换模块
- 协调模块
深度:表示控制的层数
上级模块、从属模块
宽度:整体控制跨度
扇入:调用一个给定模块的模块个数
扇出:一个模块直接调用其他模块数
原子模块:树中位于叶子结点的模块
2.面向数据流的结构化设计方法
(1)数据流类型
-
变换型
信息沿输入通路进入系统,同时由外部形式变换成内部形式,进入系统的信息通过变换中心没精加工处理以后再沿输出桐庐变换成外部形式离开软件系统。
工作过程:取得数据、变换数据、输出数据 -
事务型
存在某种作业数据流,可以引发一个或多个处理,这些处理可以完成该作业要求的功能的数据流称为事务
工作过程:事务中心接收数据,分析每个事务一确定它的类型,根据事务类型选择一条活动通路。
(2)面向数据流设计方法的实施要点
步骤:
- 分析类型
- 说明数据流的边界
- 把数据流图映射成结构图
- 根据设计准则产生的结构进行细化和求精
3.设计的准则
(1)提高模块独立性
(2)模块规模适中
(3)深度、宽度、扇出、扇入适当
(4)使模块的作用域在模块的控制域内
(5)应减少模块的接口和界面的复杂性
(6)设计成单入口、单出口的模块
(7)设计功能可预测的模块
4.3.3 详细设计
详细设计的任务是:为软件结构图的每一个模块确定实现算法和局部数据结构,用某种选定的表达工具表示算法和数据结构的细节
常见的过程设计工具有:
图形工具:程序流程图,N-S图。PAD图,HIPO图
表格工具:判定表
语言工具:PDL(伪码)
1.流程图
箭头:控制流
矩形:加工步骤
菱形:逻辑条件
2. N-S图
方框图
3. PAD图
问题分析图(problem analysis diagram)
五种基本控制结构:
- 顺序型
- 选择型
- WHILE重复型
- UNTIL重复型
- 多分支选择型
4.PDL(procedure decision language)
过程设计语言 也称 结构化英语和伪码
常用词汇:
顺序
条件 IF/THEN/ELSE/ENDIF
循环 DO WHILE/ENDDO
重复 REPEAT UNTIL / ENDREPEAT
分支 CASE_OF/WHEN/SELECT/ENDCASE
4.4 软件测试
4.4.1 软件测试的目的和定义
(1)在规定条件下运行系统或构件的过程
(2)软件项目的过程:检测bug,评估软件项目的特性
软件测试是一项验证评估活动,目的是基于满足规定的需求来保证软件的质量
4.4.2 软件测试的准则
基本准则:
1.所有测试都应追溯到需求
2.严格执行测试计划,排除测试的随意性
3.充分注意测试中的群集现象
4.程序员应避免检查自己的程序
5.穷举测试不可能
6.妥善保存相关资料
4.4.3 软件测试方法与技术综述
1.静态测试与动态测试
(1)静态测试
包括:代码检查、静态结构分析、代码质量度量
(2)动态测试
2.白盒测试方法与测试用例设计
白盒测试:也称结构测试或逻辑驱动测试,根据软件产品内部工作过程,检查内部成分,以确认每种内部操作符合设计规格要求
在程序内部进行,主要用于完成软件内部操作的验证
(1)逻辑覆盖测试
语句覆盖、基本路径覆盖 、判定覆盖、条件覆盖、判断-条件覆盖
每个~至少经历一次
(2)基本路径测试
根据软件过程性描述中的控制流程确定程序的环路复杂性度量,用此度量定义基本路径集合,并由此到处一组测试用例对每一条独立执行的路径进行测试
3. 黑盒测试方法与测试用例设计
黑盒测试方法也称功能测试或数据驱动测试。
黑盒测试是对软件已经实现功能是否满足需求进行测试和验证。
完全不考虑程序内部逻辑结构和内部特性,只依据程序的需求和功能规格说明,检查是否符合功能说明。
方法 :
(1)等价类划分法
(2)边界值分析法
(3)错误推断法
4.4.4 软件测试的策略
步骤:
1.单元测试
主要针对模块的五个基本特性:
- 模块接口测试
- 局部数据结构测试
- 重要的执行路径的检查
- 出错处理测试
- 影响以上个点及其他相关点的边界测试
模拟环境:在单元测试中,为被测模块设计和搭建驱动(driver)模块和桩(stub)模块
驱动模块:相当于被测模块的主程序,接收数据,并传给被测模块,输出实际测试结果
桩模块:代替被测模块调用的其他模块,是一个模拟子程序
2.集成测试
是测试和组装软件的过程,是在把模块按照设计要求组装起来的同时进行测试,主要目的是发现与接口有关的错误。
涉及内容:软件单元的接口测试、全局结构测试、边界条件和非法输入的测试等
将模块组装成程序的方式: 非增量方式组装(一次性组装,即组装好再测试)、增量方式组装(边测试边组装)
增量组装的方式:
(1)自顶而下的增量方式
(2)自底向上的增量方式
(3)混合增量方式
3.确认测试
确认测试的任务是验证软件的功能和性能及其他特性是否满足了需求规格说明中的确定的各种需求,以及软件的配置是否完全、正确
4. 系统测试
系统测试是将通过测试确认的软件,作为整个基于计算机系统的一个元素,与计算机硬件、外设、支持硬件、数据和人员等其他系统元素组合在一起,在实际运行环境才对计算机系统进行一系列集成测试和确认测试
一般包括:功能测试、性能测试、操作测试、配置测试、外部接口测试、安全性测试等
4.5 程序的调试
4.5.1 基本概念
1. 程序调试的基本步骤
(1)错误定位
(2)修改设计和代码,以排除错误
(3)进行回归测试,防止引入新的错误
2.程序调试的原则
4.5.2 软件调试方法
1.强行排错法
2.回溯法
3.原因排除法
整理不易,点个赞呗~