软件工程导论课件第6章编码.ppt
第6章 编码2,编码 编码就是把软件设计结果翻译成用某种程序设计语言书写的程序。 1、选择程序设计语言 程序设计语言是人和计算机通信的最基本的工具,它的特点必然会影响人的思维和解题方式,会影响人和计算机通信的方式和质量,也会影响其他人阅读和理解程序的难易程度。因此,编码之前的一项重要工作就是选择一种适当的程序设计语言。,3,选择程序设计语言的主要实用标准 1 系统用户的要求。 2 可以使用的编译程序。 3 可以得到的软件工具。 4 工程规模。 5 程序员的知识。 6 软件可移植性要求。 7 软件的应用领域。,4,2 程序设计风格,程序实际上也是一种供人阅读的文章,有一个文章的风格问题。应该使程序具有良好的风格。 源程序文档化 数据说明 语句结构 输入输出方法,5,(1)源程序文档化,标识符的命名 安排注释 程序的视觉组织,6, 符号名的命名,符号名即标识符,包括模块名、变量名、常量名、标号名、子程序名、 、数据区名以及缓冲区名等。 这些名字应能反映它所代表的实际东西,应有一定实际意义。例如,表示次数的量用Times,表示总量的用Total,表示平均值的用Average,表示和的量用Sum等。 名字不是越长越好,应当选择精炼的意义明确的名字。必要时可使用缩写名字,但这时要注意缩写规则要一致,并且要给每一个名字加注释。同时,在一个程序中,一个变量只应用于一种用途。,7, 程序的注释,夹在程序中的注释是程序员与日后的程序读者之间通信的重要手段。 注释决不是可有可无的。 一些正规的程序文本中,注释行的数量占到整个源程序的1/3到1/2,甚至更多。 注释分为序言性注释和功能性注释。,8,序言性注释,通常置于每个程序模块的开头部分,它应当给出程序的整体说明,对于理解程序本身具有引导作用。 序言性注释包括 程序标题; 有关本模块功能和目的的说明; 主要算法; 接口说明包括调用形式,参数描述,子程序清单; 有关数据描述重要的变量及其用途,约束或限制条件,以及其它有关信息; 模块位置在哪一个源文件中,或隶属于哪一个软件包; 开发简历模块设计者,复审者,复审日期,修改日期及有关说明等。,9,功能性注释,功能性注释嵌在源程序体中,用以描述其后的语句或程序段是在做什么工作,或是执行了下面的语句会怎么样,而不要解释下面怎么做。 例如, /* ADD AMOUNT TO TOTAL */ TOTAL AMOUNTTOTAL 上面注视不清楚,如果注明把月销售额计入年度总额,便使读者理解了下面语句的意图 /* ADD MONTHLY-SALES TO ANNUAL-TOTAL */ TOTAL AMOUNTTOTAL 要点 描述一段程序,而不是每一个语句; 用缩进和空行,使程序与注释容易区别; 注释要正确。,10, 视觉组织 空格、空行和移行,恰当地利用空格,可以突出运算的优先性,避免发生运算的错误。例如 ,将表达式 A17ANDNOTB49ORC 写成 A17 AND NOT B49 OR C 自然的程序段之间可用空行隔开; 移行也叫做向右缩格。它是指程序中的各行不必都在左端对齐,都从第一格起排列。这样做使程序完全分不清层次关系。 对于选择语句和循环语句,把其中的程序段语句向右做阶梯式移行。使程序的逻辑结构更加清晰。,例如,两重选择结构嵌套,写成下面的移行形式,层次就清楚得多。 IF() THEN IF() THEN ELSE ENDIF ELSE ENDIF,11,2 数据说明,在设计阶段已经确定了数据结构的组织及其复杂性。在编写程序时,则需要注意数据说明的风格。 为了使程序中数据说明更易于理解和维护,必须注意以下几点 数据说明的次序应该标准化。有次序易查阅,能加速测试、调试和维护的过程。 例如数据说明 数据类型说明 常量说明 简单变量类型说明 数组说明 公用数据块说明 所有的文件说明, 整型量说明 实型量说明 字符量说明 逻辑量说明,12,b. 当多个变量名在一个语句中说明时,应该按字母顺序排列这些变量。 例如,把 integer size, length, width, cost, price 写成 integer cost, length, price , size, width c. 如果设计时使用了一个复杂的数据结构,则应该用注解说明用程序设计语言实现这个数据结构的方法和特点。,13,(3)语句构造 构造语句时应该遵循的原则是,每个语句都应该简单而直接,不能为了提高效率而使程序变得过分复杂;也不要刻意追求技巧性,使程序编写得过于紧凑。 例如AI AIAT; AT AIAT; AI AIAT;,WORK AT; AT AI; AI WORK;例如 int i,j; for i 1; i n; i for j 1; j n; j Vij ij * ji ,for i1; i n; i for j1; j n; j if i j Vij 1; else Vij 0;下述规则有助于使语句简单明了 不要为了节省空间而把多个语句写在同一行; 尽量避免复杂的条件测试; 尽量减少对“非”条件的测试; if char0 char 9 改成 if char 0 char 9 不要让读者绕弯子想。 避免大量使用循环嵌套和条件嵌套; 利用括号使逻辑表达式或算术表达式的运算次序清晰直观。,16,(4)输入输出 在设计和编写程序时应该考虑下述有关输入输出风格的规则 对所有的输入数据都要进行检验,识别错误的输入,以保证每个数据的有效性; 检查输入项的各种重要组合的合法性,必要时报告输入状态信息; 使得输入的步骤和操作尽可能简单,并保持简单的输入格式; 输入数据时,应允许使用自由格式输入; 应允许缺省值;,17,输入一批数据时,最好使用输入结束标志,而不要由用户指定输入数据数目; 在交互式输入输入时,要在屏幕上使用提示符明确提示交互输入的请求,指明可使用选择项的种类和取值范围。同时,在数据输入的过程中和输入结束时,也要在屏幕上给出状态信息; 当程序设计语言对输入输出格式有严格要求时,应保持输入格式与输入语句的要求的一致性; 给所有的输出加注解,并设计输出报表格式。 输入输出风格还受到许多其它因素的影响。如输入输出设备(例如终端的类型,图形设备,数字化转换设备等)、用户的熟练程度、以及通信环境等。,18,(5)程序效率,程序的效率是指程序的执行速度及程序所需占用的内存的存储空间。程序编码是最后提高运行速度和节省存储的机会,因此在此阶段不能不考虑程序的效率。,19,让我们首先明确讨论程序效率的几条准则 效率是一个性能要求,应当在需求分析阶段给出。软件效率以需求为准,不应以人力所及为准。 好的设计可以提高效率。 程序的效率与程序的简单性相关,不要牺牲程序的清晰性和可读性来不必要地提高效率。,20,效率问题 1 程序运行时间 2 存储器效率 3 输入输出的效率,21,1 程序运行时间,源程序的效率直接由详细设计阶段确定的算法的效率决定,但是,写程序的风格也能对程序的执行速度和存储器要求产生影响。 在把详细设计结果翻译成程序时,总可以应用下述规则 写程序之前先简化算术的和逻辑的表达式; 仔细研究嵌套的循环,以确定是否有语句可以从内层往外移; 尽量避免使用多维数组; 尽量避免使用指针和复杂的表; 使用执行时间短的算术运算; 不要混合使用不同的数据类型; 尽量使用整数运算和布尔表达式。 在效率是决定性因素的应用领域,尽量使用有良好优化特性的编译程序,以自动生成高效目标代码。,22,2 存储器效率,在大中型计算机系统中,存储限制不再是主要问题。在这种环境下,对内存采取基于操作系统的分页功能的虚拟存储管理。存储效率与操作系统的分页功能直接有关。 采用结构化程序设计,将程序功能合理分块,使每个模块或一组密切相关模块的程序体积大小与每页的容量相匹配,可减少页面调度,减少内外存交换,提高存储效率。 在微型计算机系统中,存储器的容量对软件设计和编码的制约很大。因此要选择可生成较短目标代码且存储压缩性能优良的编译程序,有时需采用汇编程序。 提高存储器效率的关键是程序的简单性。,23,3 输入输出的效率,输入输出可分为两种类型 面向人操作员的输入输出 面向设备的输入输出 如果操作员能够十分方便、简单地录入输入数据,或者能够十分直观、一目了然地了解输出信息,则可以说面向人的输入输出是高效的。,24,关于提高设备输入/输出效率的指导原则 输入/输出的请求应当最小化; 对于所有的输入/输出操作,安排适当的缓冲区,以减少频繁的信息交换。 对辅助存储例如磁盘,选择尽可能简单的,可接受的存取方法; 对辅助存储的输入/输出,应当成块传送; 对终端或打印机的输入/输出,应考虑设备特性,尽可能改善输入/输出的质量和速度; 任何不易理解的,对改善输入/输出效果关系不大的措施都是不可取的; 任何不易理解的所谓“超高效”的输入/输出是毫无价值的;,