1
 软件工程
1.7.1.2 5.1.2 程序设计风格

5.1.2 程序设计风格

在软件生存期中,人们经常要阅读程序。特别是在软件测试阶段和维护阶段,编写程序的人员与参与测试、维护的人员要阅读程序。因此,阅读程序是软件开发和维护过程中的一个重要组成部分,而且读程序的时间比写程序的时间还要多。20世纪70年代初,有人提出在编写程序时,应使程序具有良好的风格。

程序设计风格包括4个方面:源程序文档化、数据说明、语句结构和输入/输出方法。应力图从编码原则的角度提高程序的可读性,改善程序的质量。

1.源程序文档化

1)符号名的命名

符号名即标识符,包括模块名、变量名、常量名、子程序名、数据区名、缓冲区名等。这些名字应能反映它所代表的实际东西,应有一定的实际意义。名字不是越长越好,过长的名字会使程序的逻辑流程变得模糊,给修改带来困难。所以,应当选择精炼的、意义明确的名字,改善对程序功能的理解。必要时可使用缩写名字,但缩写规则一致,并且要给每一个名字加注释。在一个程序中,一个变量只应用于一种用途。也就是说,在同一个程序中一个变量不能身兼几种工作。

2)程序的注释

夹在程序中的注释是程序员与日后的程序读者之间通信的重要手段。正确的注释能够帮助读者理解程序,可为后续阶段进行测试和维护提供明确的指导。因此,注释绝不是可有可无的,大多数程序设计语言允许使用自然语言来写注释,这就给阅读程序带来了很大的方便。在一些正规的程序文本中,注释行的数量占到整个源程序的1/3~1/2,甚至更多。

(1)序言性注释通常置于每个程序模块的开头部分,给出程序的整体说明,这对理解程序本身具有引导作用。有些软件开发部门对序言性注释做了明确而严格的规定,要求程序编写者逐项列出的有关项目包括程序标题、有关本模块功能和目的的说明、主要算法、接口说明、有关数据描述、模块位置、开发简历等。

(2)功能性注释嵌入源程序体中,用于描述其后的语句或程序段是在做什么工作,不要解释下面怎么做,因为解释怎么做常常是与程序本身重复的,并且对阅读者理解程序没有什么帮助。

(3)书写功能性注释要注意:功能性注释用于描述一段程序,而不是每一个语句;用缩进和空行,使程序与注释容易区别;注释要正确。

3)视觉组织

利用空格、空行和移行,提高程序的可视化程度。恰当地利用空格,可以突出运算的优先性,避免发生运算的错误。自然的程序段之间可用空行隔开。对于选择语句和循环语句,把其中的程序段语句向右做阶梯式移行,这样可使程序的逻辑结构更加清晰,层次更加分明。

2.数据说明

在编写程序时,需要注意数据说明的风格。为了使程序中的数据说明更易于理解和维护,必须注意以下几点:

(1)数据说明的次序应当规范化,使数据属性容易查找;

(2)当多个变量名用一个语句说明时,应当将这些变量按字母的顺序排列;

(3)当设计了一个复杂的数据结构时,应当使用注释来说明在程序实现时这个数据结构的固有特点。

3.语句结构

设计阶段确定了软件的逻辑流结构,但构造单个语句则是编码阶段的任务。语句构造力求简单、直接,不能为了片面追求效率而使语句复杂化。语句构造应遵循如下规则:

(1)在一行内只写一条语句,并且采取适当的移行格式,使程序的逻辑和功能变得更加明确;

(2)编写程序首先应当考虑清晰性,不要刻意追求技巧性,从而将程序编写得过于紧凑;

(3)首先要保证程序正确,然后才要求提高速度,反过来说,在使程序高速运行时,首先要保证它是正确的;

(4)尽量用公共过程或子程序去代替重复的功能代码段;

(5)使用括号来清晰地表达算术表达式和逻辑表达式的运算顺序;

(6)尽量只采用3种基本的控制结构来编写程序;

(7)避免采用过于复杂的条件判断;

(8)避免过多的循环嵌套和条件嵌套;

(9)避免循环的多个出口;

(10)数据结构要有利于程序的简化;

(11)要模块化,使模块功能尽可能单一化,模块间的耦合能够清晰可见;

(12)利用信息隐蔽,确保每一个模块的独立性;

(13)太大的程序要分块编写、测试,然后再集成;

(14)避免不恰当地追求程序效率,在改进效率前,要做出有关效率的定量估计;

(15)在程序中应有出错处理功能,一旦出现故障时不要让计算机进行干预,导致停工。

4.输入与输出(I/O)

输入/输出信息是与用户的使用是直接相关的。输入/输出的方式和格式应当尽可能方便用户的使用。因此,在软件需求分析阶段和设计阶段,应基本确定输入/输出的风格。系统能否被用户接受,有时就取决于输入/输出的风格。

不论是批处理的输入/输出方式,还是交互式的输入/输出方式,在设计和程序编码时都应考虑下列原则:

(1)对所有的输入数据都进行检验,识别错误的输入,以保证每个数据的有效性;

(2)检查输入数据的各种重要组合的合理性,必要时报告输入状态信息;

(3)使得输入的步骤和操作尽可能简单,并保持简单的输入格式;

(4)输入数据时,应允许使用自由格式输入;

(5)应允许缺省值;

(6)输入一批数据时,最好使用输入结束标志,而不要由用户指定输入数据数目;

(7)在以交互式输入/输出方式进行输入时,要在屏幕上使用提示符明确提示交互输入的请求,指明可使用选择项的种类和取值范围,同时,在数据输入的过程中和输入结束时,也要在屏幕上给出状态信息;

(8)当程序设计语言对输入/输出格式有严格要求时,应保持输入格式与输入语句要求的一致性;

(9)给所有的输出加注解,并设计输出报表格式;

(10)输入/输出风格还受到许多其他因素的影响,如输入/输出设备(如终端的类型、图形设备、数字化转换设备等)、用户的熟练程度及通信环境等;

(11)Wasserman为“用户软件工程及交互系统的设计”提供了一组指导性原则,可供软件设计和编程参考;

(12)把计算机系统的内部特性隐蔽起来不让用户看到;

(13)有完备的输入出错检查和出错恢复措施,在程序执行过程中尽量排除由于用户的原因而造成程序出错的可能性;

(14)如果用户的请求有了结果,应及时通知用户;

(15)充分利用联机帮助手段,为不熟练的用户提供对话式服务,为熟练的用户提供较高级的系统服务,改善输入/输出的能力;

(16)使输入格式和操作要求与用户的技术水平相适应,不熟练的用户可以充分利用菜单系统逐步引导用户操作;熟练的用户可以允许绕过菜单直接使用命令方式进行操作;

(17)按照输出设备的速度设计信息输出过程;

(18)区别不同类型的用户,分别进行设计和编码;

(19)保持始终如一的响应时间;

(20)在出现错误时应尽量减少用户的额外工作。

在交互式系统中,这些要求应成为软件需求的一部分,并通过设计和编码在用户和系统之间建立良好的通信接口。