6.2 程序设计风格
程序不只是给机器执行的,也是供人阅读的。在软件生存期中,人们经常要阅读程序。特别是在软件测试阶段和维护阶段,编写程序的人和参与测试、维护的人都要阅读程序。人们认识到,阅读程序是软件开发和维护过程中的一个重要组成部分,而且读程序的时间比写程序的时间还要多。因此,程序实际上也是一种供人阅读的文章,既然如此,就有一个文章的风格问题。20世纪70年代初,有人提出应该使程序具有良好的编写风格。这个想法很快就为人们所接受。人们认识到,程序员在编写程序时,应当意识到今后会有人反复地阅读这个程序,并沿着你的思路去理解程序功能,因此,应当在编写程序时多花些功夫,讲求程序的编写风格,这将节省人们读程序的时间。
本节对程序设计风格的四个方面,即源程序文档化、数据说明的方法、语句结构和输入/输出方法中值得注意的问题进行概要的讨论,力图从编码原则的角度探讨提高程序的可读性、改善程序质量的方法和途径。
(1)源程序文档化。源程序文档化包括标识符的命名、安排注释以及程序的视觉组织等。
1)标识符的命名。标识符包括模块名、变量名、常量名、标号名、子程序名以及数据区名、缓冲区名等,这些名字应能反映它所代表的实际东西,使其能够见名知意,有助于对程序功能的理解。例如,用times表示次数,用total表示总量,用average表示平均值,用sum表示和,等等。
名字不是越长越好,过长的名字会增加工作量,给程序员或操作员造成不稳定的情绪,会使程序的逻辑流程变得模糊,给修改带来困难。所以应当选择精练的、意义明确的名字,才能简化程序语句,改善对程序功能的理解。必要时可使用缩写名字,但这时要注意缩写规则要一致,并且要给每个名字加注释。同时,在一个程序中,一个变量只应用于一种用途,例如在某程序中定义了变量temp,它在程序的前半段代表“温度”(temperature),在程序的后半段却代表“临时变量”(temporary),这样就会给读者阅读程序造成混乱。
2)程序的注释。正确的注释能够帮助读者理解程序,为测试和维护提供明确的指导,注释绝不是可有可无的。大多数程序设计语言允许使用自然语言来写注释,这就给阅读程序带来很大的方便。一些正规的程序文本中,注释行的数量占到整个源程序的1/3到1/2。
注释分为序言性注释和功能性注释。序言性注释通常置于每个程序模块的开头部分,它应当给出程序的整体说明,对于理解程序本身具有引导作用。有些软件开发部门对序言性注释做了明确而严格的规定,要求程序编制者逐项列出。有关项目包括7个方面的内容。
①程序(模块)标题;
②有关本模块功能和目的的说明;
③主要算法;
④接口说明,包括调用形式、参数描述、子程序清单;
⑤有关数据描述,包括重要的变量及其用途、约束或限制条件,以及其他有关信息;
⑥模块位置,说明在哪一个源文件中,或隶属于哪一个软件包;
⑦开发简历,包括模块设计者、复审者、复审日期、修改日期及有关说明等。
功能性注释嵌入在源程序体中,用以描述其后的语句或程序段,也就是解释下面要“做什么”或是执行了下面的语句会怎么样,而不要解释下面怎么做,因为解释怎么做与程序本身常是重复的,并且对于阅读者理解程序没有什么帮助。
书写功能性注释,要注意以下三点。
①用于描述一段程序,而不是每一个语句;
②用缩进和空行,使程序与注释容易区别;
③注释要正确。
有合适的、有助于记忆的标识符和恰当的注释,有关设计的说明也可作为注释嵌入到源程序体内。
3)视觉组织——空格、空行和移行。一个程序如果写得密密麻麻分不出层次来,常常是很难看懂的。应该利用空格、空行和移行组织程序的视觉结构。
①空格:恰当地利用空格,可以突出运算的优先性,避免发生运算错误;
②空行:自然的程序段之间可用空行隔开;
③移行:移行也叫作向右缩格。它是指程序中的各行不必都左端对齐,都从第一格起排列。因为这样做使程序完全分不清层次关系。因此,对于选择语句和循环语句,把其中的程序段语句向右做阶梯式移行,这样可使程序的逻辑结构更加清晰,层次更加分明。
(2)数据说明标准化。为了使程序中数据说明更易于理解和维护,在编写程序时,需要注意数据说明的风格。具体需要注意以下几点。
①数据说明的次序应当规范化,使数据属性容易查找,也有利于测试、排错和维护。原则上,数据说明的次序与语法无关,其次序是任意的。但出于阅读、理解和维护的需要,最好使其规范化,使说明的先后次序固定。例如,可以按照以下次序对变量进行说明,依次是常量说明、简单变量类型说明、数组说明、公用数据块说明、所有的文件说明。
②在类型说明中还可进一步要求,例如,可按如下顺序排列:整型量说明、实型量说明、字符量说明和逻辑量说明。
③当多个变量名用一个语句说明时,应当对这些变量按字母顺序排列。(https://www.daowen.com)
④对于复杂的数据结构,应当使用注释对其进行说明。
(3)语句结构简单化。在编码阶段,语句结构要力求简单、直接,不能为了片面追求效率而使语句复杂化。具体需要注意以下12个方面。
①在一行内只写一条语句,并且采取适当的移行格式,使程序的逻辑和功能变得更加明确,许多程序设计语言允许在一行内写多个语句,但这种方式会使程序可读性变差,因而不可取。例如,下面是一段排序程序,由于一行中包括了多个语句,掩盖了程序的循环结构和条件结构,使其可读性变得很差。
②程序编写首先应当考虑清晰性,不要刻意追求技巧性,使程序编写得过于紧凑。
③程序编写要简单、清楚,直截了当地说明程序员的用意。
④除非对效率有特殊的要求,否则程序编写的原则是清晰第一,效率第二,不要为了追求效率而丧失了清晰性。
⑤避免使用临时变量而使可读性下降。
⑥让编译程序做简单的优化。
⑦尽可能使用库函数。
⑧避免不必要的转移,如果能保持程序的可读性,则不必用GOTO语句。
⑨尽量只采用3种基本的控制结构来编写程序,除顺序结构外,使用if else来实现选择结构,使用do-until或do-while来实现循环结构。
⑩避免使用空的else语句和if then if语句。
⑪避免采用过于复杂的条件测试。
⑫尽量减少使用“否定”条件的条件语句。
(4)输入/输出规范化。输入/输出信息是与用户的使用直接相关的。输入/输出的方式和格式应当尽可能方便用户使用,避免因设计不当给用户带来麻烦。因此,在软件需求分析阶段和设计阶段,就应基本确定输入/输出的风格。系统能否被用户接受,有时就取决于输入/输出的风格。
输入/输出的风格随着人工干预程度的不同而有所不同。例如,对于批处理的输入和输出,总是希望它能按逻辑顺序要求组织输入数据,具有有效的输入/输出出错检查和出错恢复功能,并有合理的输出报告格式。而对于交互式的输入/输出来说,更需要的是简单而带提示的输入方式、完备的出错检查和出错恢复功能,以及通过人机对话指定输出格式和输入/输出格式的一致性。
此外,不论是批处理的输入/输出方式,还是交互式的输入/输出方式,在设计和程序编码时都应考虑下列原则。
①对所有的输入数据都进行检验,从而识别错误输入,以保证每个数据的有效性。
②检查输入项的各种重要组合的合理性,必要时报告输入状态信息。
③使得输入的步骤和操作尽可能简单,并保持简单的输入格式。
④输入数据时,应允许使用自由格式输入。
⑤应允许缺省值。
⑥输入一批数据时,最好使用输入结束标志,而不要由用户指定输入数据数目。
⑦在以交互式输入/输出方式进行输入时,要在屏幕上使用提示符明确提示交互输入的请求,指明可使用选择项的种类和取值范围,同时,在数据输入的过程中和输入结束时,也要在屏幕上给出状态信息。
⑧当程序设计语言对输入/输出格式有严格要求时,应保持输入格式与输入语句的要求一致。
⑨给所有的输出加注解,并设计输出报表格式。
输入/输出风格还受到许多其他因素的影响。如输入/输出设备(例如终端的类型、图形设备、数字化转换设备等),用户的熟练程度以及通信环境等。