(课件)-北京理工大学软件工程实践

上传人:jiups****uk12 文档编号:45241787 上传时间:2018-06-15 格式:PPT 页数:70 大小:97.10KB
返回 下载 相关 举报
(课件)-北京理工大学软件工程实践_第1页
第1页 / 共70页
(课件)-北京理工大学软件工程实践_第2页
第2页 / 共70页
(课件)-北京理工大学软件工程实践_第3页
第3页 / 共70页
(课件)-北京理工大学软件工程实践_第4页
第4页 / 共70页
(课件)-北京理工大学软件工程实践_第5页
第5页 / 共70页
点击查看更多>>
资源描述

《(课件)-北京理工大学软件工程实践》由会员分享,可在线阅读,更多相关《(课件)-北京理工大学软件工程实践(70页珍藏版)》请在金锄头文库上搜索。

1、北京理工大学 软件工程实践汤铭端 中国航天科工集团公司204所第五讲软件实现内容和目的n编程语言的选择 n编程风格n程序效率n编码要求n静态分析n代码审查n软件调试编程n编程是设计的自然结果n编程语言的特性和编程风格会深刻地影 响软件的重量和可维护性n软件实现是一个不断变换的过程:设计 源程序目标代码机器码编程语言的选择n应用领域n算法及运算的复杂性n软件运行的环境n性能n数据结构的复杂性n软件开发组成员对该语言的熟悉程度编程风格n程序必须是可以理解的n程序的风格应该强调简单和清晰n影响程序风格的因素有:n源程序内部文档化n数据说明的方法n语句的结构nI/O的方法源程序文档化n选择好标识符(变

2、量和标号)的名字n挑选有意义的标识符名字n安排注解n序言式注解(头文件)n功能注解n使程序的结构一目了然n缩进数据说明n数据说明的次序应该规范化n多个变量说明时最好按字典数顺序排列n对复杂结构用注解说明语句结构n每个语句应该简单直接,不应该为提高效率而 把语句复杂化n使程序简单易懂n避免采用复杂的条件语句n不要用“否定”条件的条件语句n避免多重的循环嵌套或条件嵌套n用括号使逻辑表达式或算术表达式更为清晰n用空格及有意义的符号使语句内容清晰明确n反问自己“如果这程序不是我编的,我能看懂吗?”输入/输出n对批处理I/On符合逻辑地组织输入nI/O出错检查n好的I/O出错恢复功能n清晰的输出报告格式

3、n对交互式I/On简单而有提示的输入方式n完备的出错处理及出错恢 复n人机对话输出nI/O格式的一致性n原则:n检查所有输入数据的合法性n检查输入项的各种重要组合 是否合理n输入格式要简单n最好采用数据结尾指示符, 而不应要求用户规定“输入 项目的数量”n交互式I/O要求用户输入时 ,标明交互输入可选择的种 类和范围n输出时保持格式的一致性n设计和标明所有的输出Wasserman交互系统设计原则原则n把计算机的内部特性掩盖起来不让用户看到n使程序“穿上防弹衣”,保证程序不被用户破坏n如果用户的请求会产生重大的后果,就要提醒用 户n在使用此程序时提供联机的帮助条件n按照用户的水平设计输入要求n按

4、照输出设备的速度设计输出信息n区别对待不同类型的用户n保持一致的响应时间n应尽量减少用户处理出错的工作量效率n要求有效地利用临界资源是自然的nCPU周期和内存单元常被看作临界资源n有关效率的三个格言:n效率是一种性能需求。软件的效率应根据需要,而 不是尽可能地高!n好的设计必然提高效率。n程序的简单性与程序的效率往往是一致的。n总之不要去牺牲程序的清晰性、可读性或正确 性去追求效率的非本质的提高源程序的效率n源程序的效率与算法 效率直接相关n编程风格会影响运行 速度及所需内存的大 小n编译器的“优化”特性 是提高效率的一种手 段n原则:n在具体编程前应简化算术 表达式及逻辑表达式n细心地分析多

5、层嵌套循环 以确定能否把一些语句或 表达式移到循环之外n尽量避免采用多维数组n尽量避免采用指针及复杂 的表n采用“快”的算术运算n不要把不同的数据类型混 在一起n只要可能就采用整型数的 算术运算和布尔表达式内存效率n大机器领域内存几乎无限制,虚存使“内 存效率”不等同于“占用最小的内存”n微机领域内存的限制仍是很现实的问题n采用汇编语言可以节省内存n提高运行效率的技术往往可以同时节省 内存n使程序简单是提高内存效率的关键输入输出效率n提高I/O效率的指导原则:n全部I/O应有缓冲以避免过于频繁的信息交 换n对外存应该选用最简单的可接收的存取方式n与外存联系的I/O操作应成块地传送数据n与终端及

6、行式打印机联系的I/O操作应考虑 设备的特性,以改进质量与速度n如果“超高效率”的I/O无法被人们理解,则 是毫无意义的Kernighan和Plauger给出的好 的程序设计风格的规则n写得清晰而不是太灵巧n简单而直接地说明你的用意n使用库功能n避免使用临时变量n写清晰不要为了“效率”而牺牲清晰n让机器干苦活n用调用一个公共的例程去代替重复的表示n选用不易混淆的变量名n避免使用不必要的转移Kernighan和Plauger给出的好 的程序设计风格的规则n不使用条件转移代替一个逻辑表达式n假如一个逻辑表达式难以理解,则试着对其进 行变换n使用数组,避免重复的控制序列n选用使程序简单的数据表示法n

7、先用一个容易理解的伪语言写程序,然后再翻 译成你所用的语言 使用IFELSEIFELSEIFELSEENDIF实施多 路选择n模块化,使用子例程Kernighan和Plauger给出的好 的程序设计风格的规则n确保注释与代码一致n不要用注释去精确地重复代码使每一个注 释有价值n不要注释或修补坏代码重写n使用有意义的变量名n使用有意义的语句标号n程序格式应有助于读者理解程序n为你的数据设计提供文档n仅使用GOTO去实施一个基本的结构Kernighan和Plauger给出的好 的程序设计风格的规则n假如你能保持程序的可读性,则完全不必使用 GOTOn以小片段的方式写和测试一个大程序n对已定义的递归

8、数据结构使用递归过程n检测输入的合理性和合法性n确保输入没有违反程序的限制n使用文件的结尾或标记终止输入,而不是用计 数来终止输入n识别错误的输入(若有可能要恢复输入)Kernighan和Plauger给出的好 的程序设计风格的规则n输入简易,输出自明n使用一致的输入格式n使输入容易校对n若可能,使用自由格式输入n使用自标识的输入,允许缺省,输出时反映这 两者n确保在使用之前,所有变量已被置初值n在出现故障时不要停机n使用排错编译程序Kernighan和Plauger给出的好 的程序设计风格的规则n用DATA语句或INITIAL属性置常数n用可执行的代码置变量初值n尽量注意由错误引起的分岔n注

9、意在相等时转移的正确性n当一个循环从边上或底上退出到同一个地方时 ,必须十分小心n确保你的代码“没有做什么优美方面的事情”n在边值处测试程序n人工核查某些答案Kernighan和Plauger给出的好 的程序设计风格的规则n10.0乘以0.1很少是1.0n不要单独地进行浮点数相等比较n先保证正确,再提高速度n在提高速度之前,做好自动防止故障的措施n先保证清晰,再提高速度n不要为谋求“效率”上的少量增益而牺牲清晰n让你的编译程序做简单的优化n不要滥用再使用代码,取而代之的是改组n确保特殊情况是确实的特殊Kernighan和Plauger给出的好 的程序设计风格的规则n保持简单,以提高速度n不要浪

10、费代码而提高速度找一个较好 的算法n使用工具装备你的程序,在“效率”改变以 前测量(END)程序编码结构要求n采用结构化编码方法n按以下22个特性构造(1)完整性n任何程序或控制段的开始和结束,必须 包含在单一的结构化模块中。(2)功能n每个模块必须完成单一的定义良好的功 能,模块的全部元素都是为了实现唯一 的功能。n此外,模块实现的细节对其它模块来说 应该是隐蔽的。如果实现的细节改变, 直接受影响的只是实现功能的那个模块 ,并且只有该模块需要修改。(3)入口出口n每个模块一般要求单一入口和单一出口 。处理完成后,模块必须返回到调用它 的程序而不是其它模块。n接口(入口与出口条件和参数)必须明

11、 确表示和定义。(4)说明n模块的说明语句和数据语句应放在程序 首部之后和第一个可执行语句之前,虽 然允许每行可有多个数据说明,但应保 证清晰地定义复杂的数据结构。(5)常量n常量必须在程序的说明中定义,常量通 常有数组规模、值、DO和FOR 循环中 的循环数、数组下标、记录规模和行长 度等。(6)变元n在调用语句中的变元一般不得包含算术 或逻辑表达式。n每个变元必须由单一变量来表示。n在调用一个模块的过程中,变元的类型 和个数必须与模块的形参相一致。n此外,必须标明调用过程中使用的形参 。(7)幂n幂的指数必须用整数表示,即 而不是3.0。(8)混合方式运算n应避免使用混合运算的算术表达式,

12、不 能避免时应仔细计算表达式的值,以保 证类型转换得到预期的结果,应对转换 进行适当的注释。(9)转移n尽量少用无条件转移语句。如需使用, 必须在同一程序单元内转移,并应向转 移语句所在点的前方转移。n允许使用为实现结构化程序设计所必需 的转移指令。(10)错误处理a.必须记录所有错误的发生及处理情况,保存系 统发生错误的全部记录,以利于后续错误情况 的处理和分析; b.必须预先了解错误的潜在影响,并且在它们出 现之前确定如何处理; c.应尽可能使错误不扩散,不引起连锁反应; d.当程序不能执行时,必须在中止前释放已取得 的全部资源和结果。(11)范围检查n为保证变量值落在预期的范围内,必须进

13、行范 围检查。n如果变量值不在规定范围内,则必须进行适当 的错误处理。n变量的定义域必须在设计时规定,在实现时声 明,并在运行时检查。n必须进行范围检查的变量应包括:参数;数值 下标;CASE结构中的变量参数;循环结构中用 作初值、增量和终值的变量。(12)序标和下标n循环序标参数和数值下标必须表示为整 型的常量或变量。(13)循环终止n必须保证循环终止,终止条件不能靠对 循环参数所作假设的正确性,而是靠对 循环入口事前直接的验证。(14)标号和名字的使用n标号和名字必须有意义、一致并明显、 唯一,不易混淆。(15)全局变量和共享变量n应避免使用全局或共享变量。当一个变量由两个或多 个模块共享

14、时,每个模块都必须正确地使用该变量。n由多个模块使用的变量应作为变元进行通信。限制变 量的范围有助于掌握变量的准确含义。n当有明确的技术根据需要使用公共数据时,应有下列 限制: a.仅使用可由名字访问的公用域; b.公用数据域的长度和说明,对于使用它的每个模块 都是相同的; c.可能时,应仅保留公用块的一个副本,而且必须用 “INCLUDE ”语句包容在每一个模块中而不是在模块 中各自编码描述。 (16)连接约定n如果模块是用汇编语言实现的,则必须定义和 使用模块间通信的标准约定。目的是构造独立 的、自包容的模块,它可以用良好定义的方法 与其它模块通信。n应考虑的约定有: a.在将控制转给其它

15、模块之前必须保护寄存器的内容 ,并在控制返回时恢复; b.通信必须通过变元素; c.必须有一个与调用模块返回地址进行通信的标准方 法。 (17)输入与输出n输入例程和输出例程必须集中在有限几 个模块内。n将这些例程汇集到少数几个模块中有利 于输入和输出数据的监控。n此外,将这些例程限制在有限范围内可 使修改更容易。 (18)命名n代码和数据单元的名字必须体现它们的 功能和内容。(19)程序首部n每个代码模块必须包含一个标准化的程 序首部注释语句块,作为每个程序模块 的内部源文档。它放在模块的首部,描 述模块的功能、用途和操作要求。n程序首部应包括下面的信息: a.名称:包含用于标识模块的名称、

16、版本标识 符和入口。 b.目的:包含模块目的功能的简要说明。程序首部n程序首部应包括下面的信息: c.输入输出,包含该模块所使用的每个文件 名,并指明是向模块输入、还是输出、还是两者兼 有。使用交互式屏幕的模块也应提供屏幕功 能的说明。 d.参数:提供模块所需的全部变元的定义以及模块的 返回值(输出参数)。参数定义必须包括:名字、 数据类型、大小和功能。 e.调用:提供该模块调用的全部例程的清单和调用该 模块的全部例程的清单。 f.全局数据:提供模块中使用的全部公用或全局数据 的清单。程序首部n程序首部应包括下面的信息: g.限制:包含约束或限制模块性能特点的任何特殊或 非常规因素的清单。 h.异常结束:包含异常返回条件和动作的清单。 i.方法:包含为实现模块的功能而使用的方法的详细 说明。 j.编程者:代码编制人名及所属机构。 k.版本号及完成日期:当前的模块版本号和它的完成 日期。 l.修改记录:包含对该模块的修改人、所属机构、日 期及对应的版本号。(20)行间注释n源程序体内的注释必须解释程序执行的

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

当前位置:首页 > 行业资料 > 其它行业文档

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