软件工程第5章程序编码精编版

上传人:ahu****ng1 文档编号:143305250 上传时间:2020-08-28 格式:PPTX 页数:97 大小:648.42KB
返回 下载 相关 举报
软件工程第5章程序编码精编版_第1页
第1页 / 共97页
软件工程第5章程序编码精编版_第2页
第2页 / 共97页
软件工程第5章程序编码精编版_第3页
第3页 / 共97页
软件工程第5章程序编码精编版_第4页
第4页 / 共97页
软件工程第5章程序编码精编版_第5页
第5页 / 共97页
点击查看更多>>
资源描述

《软件工程第5章程序编码精编版》由会员分享,可在线阅读,更多相关《软件工程第5章程序编码精编版(97页珍藏版)》请在金锄头文库上搜索。

1、,第七章 程序编码,结构化程序设计 程序设计风格 程序复杂性度量,做为软件工程过程的一个阶段,程序编码是设计的继续。 程序设计语言的特性和程序设计风格会深刻地影响软件的质量和可维护性。 为了保证程序编码的质量,程序员必须深刻地理解、熟练地掌握并正确地运用程序设计语言的特性。此外,还要求源程序具有良好的结构性和良好的程序设计风格。,源程序的质量标准,正确性 可读性 可靠性 可维护性,结构化程序设计,结构化程序设计主要包括两方面: (1) 在编写程序时,强调使用几种基本控制结构,通过组合嵌套,形成程序的控制结构。尽可能避免使用GOTO语句。 (2) 在程序设计过程中,尽量采用自顶向下和逐步细化的原

2、则,由粗到细,一步步展开。,结构化程序设计的主要原则,使用语言中的顺序、选择、重复等有限的基本控制结构表示程序逻辑。 选用的控制结构只准许有一个入口和一个出口。 程序语句组成容易识别的块,每块只有一个入口和一个出口。 复杂结构应该用基本控制结构进行组合嵌套来实现。,语言中没有的控制结构,可用一段等价的程序段模拟,但要求该程序段在整个系统中前后一致。 严格控制GOTO语句,仅在下列情形才可使用: 用一个非结构化的程序设计语言去实现一个结构化的构造。 若不使用GOTO语句就会使程序功能模糊。 在某种可以改善而不是损害程序可读性的情况下。,例1 打印A, B, C三数中最小者的程序,程序1 if (

3、 A B ) goto 120; if ( B C ) goto 110; 100 write ( C ); goto 140; 110 write ( B ); goto 140; 120 if ( A C ) goto 130; goto 100; 130 write ( A ); 140 end 该程序出现了多条GOTO语句,程序可读性较差。,程序2 if ( A B ) and ( A C ) then write ( A ) else if ( A B ) and ( B C ) then write ( B ) else write ( C ) endif endif 该程序结构清

4、晰、可读性好。,例2 用二分法求方程 f (x)0 在区间a.b中的根的程序,假设在闭区间a.b上函数 f (x) 有唯一的一个零点,程序1 f0 = f (a); f1 = f (b); if ( f0 * f1 0 ) x0 = xm; f0 = fm; else x1 = xm; ,finish:printf (“n The root of this equation is %dn”,xm ); 该程序是单入口,两出口。正常出口是循环达到 n 次,非正常出口是循环中途控制转出到标号 finish 所在位置。不满足结构化要求!,程序2 f0 = f (a); f1 = f (b); if

5、( f0 * f1 = 0 ) x0 = a;x1 = b; for ( i = 1;i = n;i+ ) /正常出口 xm = ( x0 x1) / 2;fm = f (xm); if (abs( fm )eps | abs( x1x0 )eps) break; /非正常出口 if ( f0 * fm0) x0 = xm;f0 = fm; else x1 = xm; 该程序仍然存在二个出口,不是结构化程序。,程序3 f0 = f (a);f1 = f (b); if ( f0 * f1 = 0) x0 = a;x1 = b;i = 1;finished = 0; while (i = n 写

6、成 AIAI; XAI1AI; 这样将一句分成两句写,会产生意想不到的问题。,7.让编译程序做简单的优化。 8.尽可能使用库函数 9.避免不必要的转移。同时如果能保持程序可读性,则不必用GOTO语句。 例如,有一个求三个数中最小值的程序:,IF ( X Y ) GOTO 30 IF (Y Z) GOTO 50 SMALLZ GOTO 70 30 IF ( X Z)GOTO 60 SMALLZ GOTO 70 50 SMALLY GOTO 70 60 SMALLX 70 CONTINUE,程序只需编写成: SMALLX IF ( Y .LT. SMALL ) SMALLY IF ( Z .LT.

7、 SMALL ) SMALLZ 所以程序应当简单,不必过于深奥, 避免使用GOTO语句绕来绕去。 10.尽量只采用三种基本的控制结构来编写程序。除顺序结构外,使用IF-THEN-ELSE来实现选择结构;使用DO-UNTIL或DO-WHILE来实现循环结构。,11. 避免使用空的ELSE语句和IF THEN IF的语句。这种结构容 易使读者产生误解。例如, IF ( CHARA ) THEN IF ( CHARZ ) THEN PRINT “This is a letter。” ELSE PRINT “This is not a letter。” 可能产生二义性问题。,12.避免采用过于复杂的条

8、件测试。 13.尽量减少使用“否定”条件的条件语句。例如,如果在程序中出现 IF NOT ( ( CHAR0 ) OR ( CHAR9 ) ) THEN 改成 IF ( CHAR0 ) AND ( CHAR9 ) THEN 不要让读者绕弯子想。,14. 尽可能用通俗易懂的伪码来描述程序的流程,然后再翻译成必须使用的语言。 15. 数据结构要有利于程序的简化。 16. 要模块化,使模块功能尽可能单一化,模块间的耦合能够清晰可见。 17. 利用信息隐蔽,确保每一个模块的独立性。,18. 从数据出发去构造程序。 19. 不要修补不好的程序,要重新编写。也不要一味地追求代码的复用,要重新组织。 20.

9、 对太大的程序,要分块编写、测试,然后再集成。 21. 对递归定义的数据结构尽量使用递归过程。,四 输入和输出,输入和输出信息是与用户的使用直接相关的。输入和输出的方式和格式应当尽可能方便用户的使用。一定要避免因设计不当给用户带来的麻烦。 因此,在软件需求分析阶段和设计阶段,就应基本确定输入和输出的风格。系统能否被用户接受,有时就取决于输入和输出的风格。,不论是批处理的输入输出方式,还是交互式的输入输出方式,在设计和程序编码时都应考虑下列原则: 1. 对所有的输入数据都要进行检验,识别错误的输入,以保证每个数据的有效性;2. 检查输入项的各种重要组合的合理性,必要时报告输入状态信息;3. 使得

10、输入的步骤和操作尽可能简单,并保持简单的输入格式;,4. 输入数据时,应允许使用自由格式输入; 5. 应允许缺省值; 6. 输入一批数据时,最好使用输入结束标志,而不要由用户指定输入数据数目; 7. 在交互式输入输入时,要在屏幕上使用提示符明确提示交互输入的请求,指明可使用选择项的种类和取值范围。同时,在数据输入的过程中和输入结束时,也要在屏幕上给出状态信息;,8. 当程序设计语言对输入输出格式有严格要求时,应保持输入格式与输入语句的要求的一致性;9. 给所有的输出加注解,并设计输出报表格式。输入输出风格还受到许多其它因素的影响。如输入输出设备(例如终端的类型,图形设备,数字化转换设备等)、用

11、户的熟练程度、以及通信环境等。,程序效率,讨论效率的准则 程序的效率是指程序的执行速度及程序所需占用的内存的存储空间。程序编码是最后提高运行速度和节省存储的机会,因此在此阶段不能不考虑程序的效率。让我们首先明确讨论程序效率的几条准则,效率是一个性能要求,应当在需求分析阶段给出。软件效率以需求为准,不应以人力所及为准。 好的设计可以提高效率。 程序的效率与程序的简单性相关。 一般说来,任何对效率无重要改善,且对程序的简单性、可读性和正确性不利的程序设计方法都是不可取的。,算法对效率的影响,源程序的效率与详细设计阶段确定的算法的效率直接有关。在详细设计翻译转换成源程序代码后,算法效率反映为程序的执

12、行速度和存储容量的要求。 设计向程序转换过程中的指导原则:, 在编程序前,尽可能化简有关的算术表达式和逻辑表达式; 仔细检查算法中的嵌套的循环,尽可能将某些语句或表达式移到循环外面; 尽量避免使用多维数组; 尽量避免使用指针和复杂的表; 采用“快速”的算术运算;, 不要混淆数据类型,避免在表达式中出现类型混杂; 尽量采用整数算术表达式和布尔表达式; 选用等效的高效率算法; 许多编译程序具有“优化”功能,可以自动生成高效率的目标代码。,影响存储器效率的因素,在大中型计算机系统中,存储限制不再是主要问题。在这种环境下,对内存采取基于操作系统的分页功能的虚拟存储管理。存储效率与操作系统的分页功能直接

13、有关。,采用结构化程序设计,将程序功能合理分块,使每个模块或一组密切相关模块的程序体积大小与每页的容量相匹配,可减少页面调度,减少内外存交换,提高存储效率。,在微型计算机系统中,存储器的容量对软件设计和编码的制约很大。因此要选择可生成较短目标代码且存储压缩性能优良的编译程序,有时需采用汇编程序。 提高存储器效率的关键是程序的简单性。,影响输入输出的因素,输入输出可分为两种类型: 面向人(操作员)的输入输出 面向设备的输入输出 如果操作员能够十分方便、简单地录入输入数据,或者能够十分直观、一目了然地了解输出信息,则可以说面向人的输入输出是高效的。,关于面向设备的输入/输出,可以提出一些提高输入/

14、输出效率的指导原则: 输入/输出的请求应当最小化; 对于所有的输入/输出操作,安排适当的缓冲区,以减少频繁的信息交换。 对辅助存储(例如磁盘),选择尽可能简单的,可接受的存取方法;,对辅助存储的输入/输出,应当成块传送; 对终端或打印机的输入/输出,应考虑设备特性,尽可能改善输入/输出的质量和速度; 任何不易理解的,对改善输入/输出效果关系不大的措施都是不可取的; 任何不易理解的所谓“超高效”的输入/输出是毫无价值的;,程序复杂性度量,程序复杂性主要指模块内程序的复杂性。它直接关联到软件开发费用的多少,开发周期的长短和软件内部潜伏错误的多少。 减少程序复杂性,可提高软件的简单性和可理解性,并使

15、软件开发费用减少,开发周期缩短,软件内部潜藏错误减少。,复杂性度量需要满足的假设,为了度量程序复杂性,要求: 它可以用来计算任何一个程序的复杂性; 对于不合理的程序,例如对于长度动态增长的程序,或者对于原则上无法排错的程序,不应当使用它进行复杂性计算; 如果程序中指令条数、附加存储量、计算时间增多,不会减少程序的复杂性。,代码行度量法,源代码行数度量法基于两个前提: 程序复杂性随着程序规模的增加不均衡地增长; 控制程序规模的方法最好是采用分而治之的办法。将一个大程序分解成若干个简单的可理解的程序段。,方法的基本考虑是统计一个程序模块的源代码行数目,并以源代码行数做为程序复杂性的度量。 设每行代

16、码的出错率为每100行源程序中可能有的错误数目。 Thayer曾指出,程序出错率的估算范围是从0.047之间,即每100行源程序中可能存在0.047个错误。他还指出,每行代码的出错率与源程序行数之间不存在简单的线性关系。,Lipow指出,对于小程序,每行代码出错率为1.31.8;对于大程序,每行代码的出错率增加到2.73.2之间,这只是考虑了程序的可执行部分,没有包括程序中的说明部分。 Lipow及其他研究者得出一个结论:对于少于100个语句的小程序,源代码行数与出错率是线性相关的。随着程序的增大,出错率以非线性方式增长。,McCabe度量法,McCabe度量法,又称环路复杂性度量,是一种基于程序控制流的复杂性度量方法。 它基于一个程序模块的程序图中环路的个

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号