文档介绍:第四章程序开发和软件工程
程序开发是软件开发的核心,程序开发过程是:建立计算模型、设计程序、编写代码、测试程序、交付使用,前四个步骤统称程序设计,简称编程
硬件快速发展使计算机的计算能力成倍增长,手工开发的软件无论是在生产率方面还是在质量方面都不能满足用户需求和市场要求,这就是所谓的“软件危机”。
60年代末提出软件工程思想,以系统工程的方法全面规划和管理软件的开发和使用,以大量辅助工具加速开发进程,以求高效、快速地生产大量合格的软件
程序设计过程
需求分析
程序的内容就是对需要解决的问题的描述。它首先要建立计算机可以实现的计算模型
建模仅仅是程序设计的基础。程序在此模型上做什么事,即程序的规格说明(specification)
问题的提出只是用户的需要(need),把需要变为需求(requirement)是需求分析的工作,即有没有可能用软件来满足用户需要(可行性)。如果可行,这个程序应是什么样的(需求定义),这就是程序的规格说明
一个程序(软件)经过分析可以分解为若干个子部分,除了总的规格说明之外,各子部分也要写规格说明。它们也是这些子部分开发、测试、验收的依据
程序设计
除了功能、性能要求而外,程序设计还应该保证软件的质量,如:
可靠性:交付时规格说明均满足,但时好时坏。
安全性:由于使用不当导致所在系统崩溃。
可维护性:修改一个小错;引发一串大错。
可移植性:不同平台上不能用
适应性:软、硬件平台中某部件升级或版本就不适应了。
可测试性:除了使用现场其它环境不能作有意义的测试
1. 设计准则
模块化:一个大的程序按功能或数据原则分解成为较小的模块,可以极大地降低程序的复杂性,有利于阅读、测试、修改
结构化:每个模块内程序控制应是结构化的,以便于测试、查错和修改。要采用结构化程序设计语言,不用或少用GoTo语句
数据隐藏:模块化实质也是局部化,凡与其它模块无关的数据尽可能作为局部量放在自己的模块内
可测试性:程序的可测试性在设计程序结构时就得考虑,以免最后变得不可追踪,不可测试
一致性:指程序编码完成后,行文风格一致(排列对齐,空行、边框、关键字都出现在同样位置)、表达方法尽量一致
2. 设计方法
需求分析定义的规格说明是建立在核心的、大致的计算解题模型之上的,设计时要具体刻画出来,具体到能一一对应编码为宜
(1) 自顶向下逐步求精
例:地图上有若干城镇及相互连接的道路,各城镇间最大运输能力标注在路线上。要求设计一程序,计算任意指定两城镇间的最大流通能力。
进一步细化为:
地图用邻接表矩阵(7×7),对应权矩阵(7×6)
进一步细化为:
对“找最大化”细化。逐一查找所有路径的算法是一株搜索树
(2) 面向对象设计面向对象编程是典型的由底向上设计
对象建模的关键是找出对象。按Booch的方法:
先用自然语言陈述它的解
然后将集合名词、概括(抽象)名词作为对象候选具体名词和形容词作为属性,动词作为操作的候选,副词可作属性或操作。
编码
即把以类_xxx语言描述的设计变成xxx语言的源程序,还应完成如下工作
:将功能相差不多或不够规范的模块以规范的库模块取代,模块大小在不甚影响其功能、性能前题下调整(合并、切分),增强一致性使程序简单。
2. 一致性完善:程序和输出结果表达风格的一致
:尽可能用符号常量、减少重复计算、循环内的重复、不必要的计算,将循环次数多的作内循环
测试与排错
程序是由人设计(构造)的,如何保证程序的正确性,如何证明和验证程序的正确性就是一个极大的同时也是极为困难的问题。比较实用的验证程序的方法就是测试。
测试只能证明程序有错,而不能确保程序的正确性。一个通过了某一测试的程序,也许还包含尚未发现的错误
1. 测试技术:
测试是将可能的输入值)输入运行后看程序是否满足预期结果
测试数据称为测试用例(testing case)。测试用例的选取和采用的测试技术有关。测试时,为了各个击破,一般编一段测一段
(1) 黑箱测试:只看输入和程序结果,不管程序内部执行过程
等价类划分: 程序的输入至少有两大类,分为有效输入(可得出正确值)等价类,一为无效输出等价类
边值分析:在等价类的基础上用边界值进行测试
(2) 白箱测试:也叫路径测试。所有的语句必须执行一次以上,这是最起码的要求。彻底些,每条路径都要走到
2. 测试的经济性
测试是为了找出程序错误而执行程序的过程,应达到以下目标:
没有语法错误,·运行应当有结果
典型用例结果正确
典型有效数据结果正确,无效数据有预防措施
对一切可能想得出的数据不出错
排错(Debugging)也叫调试,排错是消除程序中缺陷(bug)的过程:
通过测试