实现
通常把编码和测试统称为实现。
程序的质量主要取决于软件设计的质量,但是,所选用的程序设计语言的特点及编码风格也将对程序的可靠性、可读性、可测试性和可维护性产生深远的影响。
测试的目的就是在软件投入生产性运行之前,尽可能多地发现软件中的错误。目前软件测试仍然是保证软件质量的关键步骤,它是对软件规格说明、设计和编码的最后复审。
7.1 编码
7.1.1 选择程序设计语言
程序设计语言的特点会影响人的思维和解题方式,会影响人和计算机通信的方式和质量,也会影响其他人阅读和理解程序的难易程度。
编码之前的选择一种适当的程序设计语言是一项重要工作。
高级语言明显优于汇编语言,在需要效率的某些场合,需要汇编语言,或者大型系统中执行时间非常关键的(或直接依赖于硬件的)一小部分代码需要用汇编语言书写之外,其他程序应该一律用高级语言书写。
有理想的模块化机制,以及可读性好的控制结构和数据结构;为了便于调试和提高软件可靠性,语言特点应该使编译程序能够尽可能多地发现程序中的错误;为了降低软件开发和维护的成本,选用的高级语言应该有良好的独立编译机制。
选择语言的主要实现标准:
(1) 系统用户的要求。如果所开发的系统由用户负责维护,用户通常要求用他们熟悉的语言书写程序。
(2) 可以使用的编译程序。运行目标系统的环境中可以提供的编译程序往往限制了可以选用的语言的范围。
(3) 可以得到的软件工具。如果某种语言有支持程序开发的软件工具可以利用,则目标系统的实现和验证都变得比较容易。
(4) 工程规模。如果工程规模很庞大,现有的语言又不完全适用,那么设计并实现一种供这个工程项目专用的程序设计语言,可能是一个正确的选择。
(5) 程序员的知识。虽然对于有经验的程序员来说,学习一种新语言并不困难,但是要完全掌握一种新语言却需要实践。如果和其他标准不矛盾,那么应该选择一种已经为程序员所熟悉的语言。
(6) 软件可移植性要求。如果目标系统将在几台不同的计算机上运行,或者预期的使用寿命很长,那么选择一种标准化程度高、程序可移植性好的语言就是很重要的。
(7) 软件的应用领域。所谓的通用程序设计语言实际上并不是对所有应用领域都同样适用。因此,选择语言时应该充分考虑目标系统的应用范围。
7.1.2 编码风格
源程序代码的逻辑简明清晰、易读易懂应该遵循下述规则:
1.程序内部的文档
包括恰当的标识符、适当的注解和程序的视觉组织等等。
选取含义鲜明的名字,使它能正确地提示程序对象所代表的实体,这对于帮助阅读者理解程序是很重要的。如果使用缩写,那么缩写规则应该一致,并且应该给每个名字加注解。
注解非常有助于对程序的理解。
每个模块开始处有序言性的注解:简要描述模块的功能、主要算法、接口特点、重要数据以及开发简史;
程序中间与一段程序代码有关的注解:主要解释包含这段代码的必要性。
不能滥用注释,应利用注解提供一些额外的信息。注解的内容一定要正确。
程序清单的布局对于程序的可读性也有很大影响,应该利用适当的阶梯形式使程序的层次结构清晰明显。
2.数据说明
数据说明的次序应该标准化。有次序就容易查阅,因此能够加速测试、调试和维护的过程。
当多个变量名在一个语句中说明时,应该按字母顺序排列这些变量。
如果设计时使用了一个复杂的数据结构,则应该用注解说明用程序设计语言实现这个数据结构的方法和特点。
3. 语句构造
构造语句时应该遵循的原则是,每个语句都应该简单而直接,不能为了提高效率而使程序变得过分复杂。下述规则有助于使语句简单明了:
- 不要为了节省空间而把多个语句写在同一行; - 尽量避免复杂的条件测试;
- 尽量减少对“非”条件的测试;
- 避免大量使用循环嵌套和条件嵌套;
- 利用括号使逻辑表达式或算术表达式的运算次序清晰直观。
4. 输入输出
在设计和编写程序时应该考虑下述有关输入输出风格的规则:
- 对所有输入数据都进行检验;
- 检查输入项重要组合的合法性;
- 保持输入格式简单;
- 使用数据结束标记,不要要求用户指定数据的数目;
- 明确提示交互式输入的请求,详细说明可用的选择或边界数值;
- 当程序设计语言对格式有严格要求时,应保持输入格式一致;
- 设计良好的输出报表;
- 给所有输出数据加标志。
5. 效率
效率主要指处理机时间和存储器容量两个方面。
应该清晰3条概念:
- 首先,效率是性能要求,因此应该在需求分析阶段确定效率方面的要求。软件应该像对它要求的那样有效,而不应该如同人类可能做到的那样有效(需求分析相关);
- 其次,效率是靠好设计来提高的(设计相关);
- 第三,程序的效率和程序的简单程度是一致的,不要牺牲程序的清晰性和可读性来不必要地提高效率(效率不是第一位的)。
下面从三个方面进一步讨论效率问题。
- (1)程序运行时间
- (2)存储器效率
- (3) 输入输出的效率