程序设计
三.软件工程基础
1.软件工程概念
1)软件定义以及特点
定义:软件是与计算机系统操作有关的程序、规程、规则,以及可能有的文件、文档及数据。计算机软件有两部分组成:机器可执行的程序和数据,机器不可执行与软件开发运行维护使用等相关文档
2)软件特点:
1.软件是一种逻辑实体,具有抽象性
2.软件没有明显制作过程
3.软件在使用期间不存在磨损,老化等问题
4.对硬件和环境具有依赖性
5.软件复杂性高,成本昂贵
6.软件开发涉及诸多社会因素
3)软件分类
按功能分类:应用软件,系统软件,支撑软件(工具软件)
系统软件:管理主动向的资源,提高计算机的使用效率,为用户提供服务,是计算机系统中不可缺少一个组成部分,是最靠近计算机硬件的软件,如操作系统,数据库管理系统,编译系统,网络软件,驱动。
应用软件:为了应用于特定领域而开发的软件,如嵌入式软件,制造业(CAD),人工智能软件
支撑软件:介于系统软件和应用软件之间,协助用户开发软件的工具型软件,期中包括帮助程序员开发和维护软件的工具软件,也包括帮助管理人员控制开发进程和项目管理的工具软件,如VC++
软件危机
泛指在计算机软件开发和维护过程中所遇到一系列严重问题,几乎所有软件都有不同程度的存在这些问题,主要体现在:
1.不能满足软件需求的增长,常有用户对系统不满意
2.软件开发的成本和进度无法控制,成本过高,开发周期过长
3.软件质量难以保证
4.软件可维护程序低或者不可维护
5.软件成本不断提高
6.软件开发生产率的提高赶不上硬件的发展和应用需求增长
总结:软件危机归类为成本,质量,生存率问题
软件工程
软件工程概念出现于软件危机,通过研究解决软件危机的途径形成的一门工程学科
软件工程:应用于计算机软件的定义,开发和维护的一套方法,工具,文档,实践标准及工序
软件工程包含3个要求:方法,工具,过程
软件工程目标:在给定成本,进度的前提下,开发出具有效性,可靠性,可理解性,可维护性,可重用性,可适应性,可移植性,可追踪性和可交互操作性且满足用户需求的产品
软件工程研究内容;软件开发模型(瀑布模型,增量模型。迭代模型),开发方法(面向过程,面向数据方法,面向对象),支持过程,管理过程(ISO9000)
软件工程原则:抽象,模块化。信息隐蔽,局部化,确定性,一致性,完备性,可验证性
软件生命周期
指软件产品从提出,实现,使用,维护至停止使用退役的过程,也就是说,软件产品从其概念提出开始到该软件产品不能使用为止的整个时间段都属于软件生命周期,分为3个阶段:
软件定义阶段,软件开发阶段,软件维护阶段
软件开发工具与开发环境
软件开发工具
软件开发环境
软件开发环境:是全面支持软件开发全过程的软件工具集合,这些软件工具按照一定方法或者模式组成符合工人,支持软件生命周期的各个阶段和各项任务的完成。
结构化分析方法,数据流图,数据字典
结构化分析方法:
使用数据流图(DFD),数据字典(DD),结构化英语,判定表和判定树等工具来建立一种新的,成为结构话规格说明的目标文档
结构化分析步骤:1)通过对用户的调查,以软件需求为线索,建立当前系统的具体模型
2)去掉具体模型中非本质因素,抽象出当前系统的逻辑模型
3)根据计算机的特点分析当前系统和目标系统的差别,建立目标系统的逻辑模型
4)完善目标系统并补充细节,写出目标系统的软件需求规格说明
5)评审知道确认完全符合用户的软件需求
结构化分析常用工具:数据流图(Date Flow Diagram),数据字典(Date Dirctionary),判定树,判定表
数据流图:系统逻辑模型的图形表示,主要使用的图形元素:
名称 | 图形 | 说明 |
---|---|---|
数据流 | 箭头 | 沿箭头方向传送数据的通道,一般再旁边标注数据流名 |
加工 | 圆圈 | 又称转换,输入数据经加工,变换产生输出 |
存储文件 | 平行线 | 又称数据源,表示处理过程中存放各种数据的文件 |
源/潭 | 矩形 | 表示系统和环境的接口,属于系统之外的实体 |
数据字典:对数据流图中所有元素的定义的集合,是结构化分析的核心。
四类条目:数据流,数据项,数据存储,加工
符号 | 含义 |
---|---|
= | 等价于,定义为,有构成 |
+ | 和,与 |
[... ...] | 或 |
{} | 重复 |
() | 可选 |
** | 注释 |
.. | 连接符 |
判定树:又称决策树,是一种描述加工的图形工具,适合描述问题处理具有多个判断,而且每个决策与若干条件有关的事物。
判定表:与判定数类似,当数据流图中的加工要依赖于多个逻辑条件取值,即完成该加工的一组动作是由某一组条件取值的组合来引发的,使用判定表描述比较适宜。由四个部分组成:左上1,右上2,左下3,右下4
基本条件,列出各种可能的条件
条件项,列出各种可能的条件组合
基本动作项,列出所有的操作
动作项,列出对应的条件组合下所选的操作
需求分析:指用户对软件系统在功能,行为,性能,设计约束等方面的期望,需求分析的任务是发现需求,求精,建模和定义需求的过程。
需求分析阶段分为4个方面:需求获取,需求分析,编写需求规格说明书,需求评审
需求分析方法:分为结构化分析方法和面向对象的分析方法
软件需求规格说明书:是需求分析阶段的成功,是软件开发过程中的重要文档之一
软件需求规格说明书的作用:1)便于用户与开发人员进行理解和交流
2)反映出用户问题的结构,可以作为软件开发工作的基础和依据
3)作为确认测试和验收的依据
4)为成本估算和编制计划进度提供依据和基础
5)软件不断改进的基础
软件需求规格说明书标准:
标准 | 含义 |
---|---|
正确性 | 首先要正确的反映待开发系统,体现系统的真实要求 |
无歧义性 | 对每一个需求不能由两种解释 |
完整性 | 要涵盖用户对系统的所有需求,包括功能需求,性能需求,接口需求,设计约束等 |
可验证性 | 每一个需求都可在有限代价的有效过程中验证确认 |
一致性 | 各个需求的描述之间不能有逻辑上的冲突 |
可理解性 | 为了使用户看懂,应尽量减少计算机专业概念和专业术语 |
可修改性 | 结构与风格在有需要时不能改变 |
可追求性 | 每个需求的来源和流向是清晰的 |
软件需求规格说明书的内容:重点描述软件的目标,软件的功能需求,性能需求,外部接口,属性以及约束条件等。
结构化设计方法。总体设计,详细设计
软件设计分:
从工程管理角度分两步:概要设计,详细设计
从技术观点来看:软件结构设计,数据设计,接口设计,过程设计
名称 | 含义 |
---|---|
概要设计 | 将软件需求转化为软件体系结构,确定系统及借口,全局数据结构或数据库模式 |
详细设计 | 建立每个模块的实现算法和局部数据结构,用适当方法表示算法和数据结构的细节 |
结构设计 | 定义软件系统各个主要部件之间的关系 |
数据设计 | 将分析是创建的模型转化为数据结构的定义 |
接口设计 | 描述软件内部,软件和协作系统之间及软件与人之间如何通信 |
过程设计 | 把系统结构部件转换成软件的过程描述 |
软件设计的基本原则和原理:1)模块化 2)抽象 3)信息隐藏 4)模块独立
模块独立性:a)耦合性:软件系统结构中各个模块之间相互联系紧密程度的一种度量。耦合的高低取决于接口的复杂性,调用方式以及传递信息
b)内聚性:指模块的功能强度的试题,即一个模块内部各个元素彼此结合的紧密程度的度量
结构化设计方法的基本两年时间将软件设计成由相对独立,单一功能的模块组成的结构
概要设计:又称总体设计
基本任务:1)设计软件系统结构 2)数据结构以及数据库设计 3)编写概要设计文档 4)概要设计文档评审
常用的结构设计工具是结构图,也称程序结构图
![Y%}R4(HIC]@JA25HX(EVB](C:\Users\16668\Desktop\计算机二级\Y%}R4(HIC]@JA25HX(EVB.png)
结构图中有4中模块:
模块 | 含义 |
---|---|
传入模块 | 从下级模块取得数据,经过处理再将其传送给上级模块 |
传出模块 | 从上级模块取得数据,经处理后将其传送给下属模块 |
变化模块 | 从上级模块取得数据,进行特定处理,转换成其他格式,在传送给上级模块 |
协调模块 | 对所有下属模块进行协调和管理 |
![{3(YQIAGK1LVH6W22Q[CGID](C:\Users\16668\Desktop\计算机二级{3(YQIAGK1LVH6W22Q[CGID.png)
扇入打表示模块复用程度高,扇出大表示模块复杂度高
综上。结构化设计准则:1)提高模块独立性,尽量高内聚,低耦合
2)模块规模应适中
3)深度,宽度,扇出,扇入适当
4)模块作用域应在控制域内
5)降低模块间接口复杂程度
6)模块功能应该可以预测
详细设计:任务,为软件结构图中的每一个模块确定实现算法和局部数据结构,常用某种选定表达工具表示算法和数据结构的细节
常用工具:
图形工具:程序流程图,N-S图,PAD图,HIPO
表格工具:判定表
语言工具:PDL(伪码)
程序流程图(PFD):用于描述程序逻辑的工具,大多数与系统流程图相同,注释:箭头符号代表控制流不是数据流
![O8W}4LXG0591Q6OFQ{}]}3G](C:\Users\16668\Desktop\计算机二级\O8W}4LXG0591Q6OFQ{}]}3G.png)
N-S图
![)%}S~7HH]T9{%2U3A0$JZU
PAD图
![)%}S~7HH]T9{%2U3A0$JZU
PAL:一种用于秒速模块算法设计和处理细节语言,分为内外两层语言。
结构图术语
术语 | 含义 |
---|---|
上级模块 | 控制其他模块的模块 |
从属模块 | 被另一个模块调用的模块 |
原子模块 | 树中位于叶子结点的模块,也就是没有从属结点的模块 |
深度 | 表示控制层数 |
宽度 | 最大模块书的层的控制跨度 |
扇入 | 调用一个给定模块的模块个数 |
删除 | 由一个模块直接调用的其他模块数 |
软件测试
软件测试目的:1)为了发现程序错误而执行程序的过程
2)好的测试用例很可能发现迄今为止尚未发现的错误
软件测试的方法:
根据软件是否需要被执行:静态测试和动态测试
根据功能划分:白盒测试和黑盒测试
白盒测试:测试者完全了解程序结构和处理过程
黑盒测试:测试者完全不了解程序结构和处理过程,或不考虑程序结构和处理过程,根据规格说明书的功能来设计测试用例
白盒测试用例设计:白盒测试的主要技术有逻辑覆盖测试,基本路径测试
逻辑覆盖测试:1)语句覆盖2)路径覆盖 3)判定覆盖 4)条件覆盖 5)判断-条件图
黑盒测试的测试用例设计常用技术:1)等价类划分法 2)边界值分析法 3)错误推测法
软件测试的实施:1)单元测试 2)集成测试 3)确认测试(验收测试 )4)系统测试
程序调试
任务:诊断和改成程序的错误
步骤:1)错误定位 2)修改设计和代码,以排除错误 3)进行回归测试,防止引进新的错误
方法:1)强行排错法 2)回溯法 3)原因排除法(二分法,归纳法,演绎法)