对所有的输入数据都进行检验,从而识别错误的输入,以保证每个数据的有效性 检查输入项的各种重要组合的合理性,必要时报告输入状态信息: 使得输入的步骤和操作尽可能简单,并保持简单的输入格式 输入数据时,应允许使用自由格式输入 应允许缺省值 输入一批数据时,最好使用输入结束标志,而不要由用户指定输入数据数目 在以交互式输入/输出方式进行输入时,要在屏幕上使用提示符明确提示交互输入 的请求,指明可使用选择项的种类和取值范围。同时,在数据输入的过程中和输入结束时, 也要在屏幕上给出状态信息: ■当程序设计语言对输入/输出格式有严格要求时,应保持输入格式与输入语句的要 求的一致性 给所有的输出加注解,并设计输出报表格式。 输入/输出风格还受到许多其它因素的影响。如输入/输出设备(例如终端的类型,图 形设备,数字化转换设备等)、用户的熟练程度、以及通信环境等 Wasserman为“用户软件工程及交互系统的设计”提供了一组指导性原则,可供软件设 和编程参考。 把计算机系统的内部特性隐蔽起来不让用户看到: ·有完备的输入出错检査和出错恢复措施,在程序执行过程中尽量排除由于用户的原因 而造成程序出错的可能性; 如果用户的请求有了结果,应随时通知用户 充分利用联机帮助手段,对于不熟练的用户,提供对话式服务,对于熟练的用户,提 供较高级的系统服务,改善输入/输出的能力 ·使输入格式和操作要求与用户的技术水平相适应。对于不熟练的用户,充分利用菜单 系统逐步引导用户操作;对于熟练的用户,允许绕过菜单,直接使用命令方式进行操作 按照输出设备的速度设计信息输出过程 区别不同类型的用户,分别进行设计和编码 保持始终如一的响应时间; 在出现错误时应尽量减少用户的额外工作 在交互式系统中,这些要求应成为软件需求的一部分,并通过设计和编码,在用户和系 统之间建立良好的通信接口。 3.程序效率 (1)讨论效率的准则 程序的效率是指程序的执行速度及程序所需占用的内存的存储空间。讨论程序效率的几 条准则为 效率是一个性能要求,应当在需求分析阶段给出。软件效率以需求为准,不应以人力 所及为准。 好的设计可以提高效率 程序的效率与程序的简单性相关。 般说来,任何对效率无重要改善,且对程序的简单性、可读性和正确性不利的程序设 计方法都是不可取的 (2)算法对效率的影响 源程序的效率与详细设计阶段确定的算法的效率直接有关。在详细设计翻译转换成源程 序代码后,算法效率反映为程序的执行速度和存储容量的要求
6 ▪ 对所有的输入数据都进行检验,从而识别错误的输入,以保证每个数据的有效性; ▪ 检查输入项的各种重要组合的合理性,必要时报告输入状态信息; ▪ 使得输入的步骤和操作尽可能简单,并保持简单的输入格式; ▪ 输入数据时,应允许使用自由格式输入; ▪ 应允许缺省值; ▪ 输入一批数据时,最好使用输入结束标志,而不要由用户指定输入数据数目; ▪ 在以交互式输入/输出方式进行输入时, 要在屏幕上使用提示符明确提示交互输入 的请求,指明可使用选择项的种类和取值范围。同时,在数据输入的过程中和输入结束时, 也要在屏幕上给出状态信息; ▪ 当程序设计语言对输入/输出格式有严格要求时, 应保持输入格式与输入语句的要 求的一致性; ▪ 给所有的输出加注解,并设计输出报表格式。 输入/输出风格还受到许多其它因素的影响。如输入/输出设备(例如终端的类型,图 形设备,数字化转换设备等)、用户的熟练程度、以及通信环境等。 Wasserman 为“用户软件工程及交互系统的设计”提供了一组指导性原则,可供软件设 计和编程参考。 ▪ 把计算机系统的内部特性隐蔽起来不让用户看到; ▪ 有完备的输入出错检查和出错恢复措施,在程序执行过程中尽量排除由于用户的原因 而造成程序出错的可能性; ▪ 如果用户的请求有了结果,应随时通知用户; ▪ 充分利用联机帮助手段,对于不熟练的用户,提供对话式服务,对于熟练的用户,提 供较高级的系统服务,改善输入/输出的能力; ▪ 使输入格式和操作要求与用户的技术水平相适应。对于不熟练的用户,充分利用菜单 系统逐步引导用户操作;对于熟练的用户,允许绕过菜单,直接使用命令方式进行操作; ▪ 按照输出设备的速度设计信息输出过程; ▪ 区别不同类型的用户,分别进行设计和编码; ▪ 保持始终如一的响应时间; ▪ 在出现错误时应尽量减少用户的额外工作。 在交互式系统中,这些要求应成为软件需求的一部分,并通过设计和编码,在用户和系 统之间建立良好的通信接口。 3. 程序效率 (1) 讨论效率的准则 程序的效率是指程序的执行速度及程序所需占用的内存的存储空间。讨论程序效率的几 条准则为: ▪ 效率是一个性能要求,应当在需求分析阶段给出。软件效率以需求为准,不应以人力 所及为准。 ▪ 好的设计可以提高效率。 ▪ 程序的效率与程序的简单性相关。 一般说来,任何对效率无重要改善,且对程序的简单性、可读性和正确性不利的程序设 计方法都是不可取的。 (2) 算法对效率的影响 源程序的效率与详细设计阶段确定的算法的效率直接有关。在详细设计翻译转换成源程 序代码后,算法效率反映为程序的执行速度和存储容量的要求
转换过程中的指导原则是: 在编程序前,尽可能化简有关的算术表达式和逻辑表达式; 仔细检査算法中的嵌套的循环,尽可能将某些语句或表达式移到循环外面: 尽量避免使用多维数组 尽量避免使用指针和复杂的表; 采用“快速”的算术运算 不要混淆数据类型,避免在表达式中出现类型混杂 尽量采用整数算术表达式和布尔表达式; 选用等效的高效率算法; 许多编译程序具有“优化”功能,可以自动生成高效率的目标代码。它可剔除重复的表 达式计算,采用循环求值法、快速的算术运算,以及采用一些能够提高目标代码运行效率的 算法来提高效率。对于效率至上的应用来说,这样的编译程序是很有效的。 (3)影响存储效率的因素 在大中型计算机系统中,存储限制不再是主要问题。在这种环境下,对内存采取基于操 作系统的分页功能的虚拟存储管理,给软件提供了巨大的逻辑地址空间。这时,存储效率与 操作系统的分页功能直接有关,并不是指要使所使用的存储空间达到最少。 釆用结构化程序设计,将程序功能合理分块,使每个模块或一组密切相关模块的程序体 积大小与每页的容量相匹配,可减少页面调度,减少内外存交换,提高存储效率 在微型计算机系统中,存储容量对软件设计和编码的制约很大。因此要选择可生成较短 目标代码且存储压缩性能优良的编译程序,有时需采用汇编程序。通过程序员富有创造性的 努力,提高软件时间与空间效率。 提高存储效率的关键是程序的简单性 (4)影响输入/输出的因素 输入/输出可分为两种类型:一种是面向人(操作员)的输入/输出;一种是面向设备 的输入/输出。如果操作员能够十分方便、简单地录入输入数据,或者能够十分直观、一目 了然地了解输出信息,则可以说面向人的输入/输出是高效的。至于面向设备的输入/输出, 分析起来比较复杂。从详细设计和程序编码的角度来说,可以提出一些提高输入/输出效率 的指导原则 输入/输出的请求应当最小化 对于所有的输入/输出操作,安排适当的缓冲区,以减少频繁的信息交换 对辅助存储(例如磁盘),选择尽可能简单的,可接受的存取方法 对辅助存储的输入/输出,应当成块传送 对终端或打印机的输入/输出,应考虑设备特性,尽可能改善输入/输出的质量和 任何不易理解的,对改善输入/输出效果关系不大的措施都是不可取的 任何不易理解的所谓“超高效”的输入/输出是毫无价值的: 好的输入/输出程序设计风格对提高输入/输出效率会有明显的效果。 4.程序设计语言 程序编码阶段的任务是将软件的详细设计转换成用程序设计语言实现的程序代码。因 此,程序设计语言的性能和设计风格对于程序设计的效能和质量有着直接的关系。 (1)程序设计语言特性的比较 ①软件心理学的观点 因为从设计到编码的转换基本上是人的活动,因此语言的性能对程序员的心理影响,将
7 转换过程中的指导原则是: ▪ 在编程序前,尽可能化简有关的算术表达式和逻辑表达式; ▪ 仔细检查算法中的嵌套的循环,尽可能将某些语句或表达式移到循环外面; ▪ 尽量避免使用多维数组; ▪ 尽量避免使用指针和复杂的表; ▪ 采用“快速”的算术运算; ▪ 不要混淆数据类型,避免在表达式中出现类型混杂; ▪ 尽量采用整数算术表达式和布尔表达式; ▪ 选用等效的高效率算法; 许多编译程序具有“优化”功能,可以自动生成高效率的目标代码。它可剔除重复的表 达式计算,采用循环求值法、快速的算术运算,以及采用一些能够提高目标代码运行效率的 算法来提高效率。对于效率至上的应用来说,这样的编译程序是很有效的。 (3) 影响存储效率的因素 在大中型计算机系统中,存储限制不再是主要问题。在这种环境下,对内存采取基于操 作系统的分页功能的虚拟存储管理,给软件提供了巨大的逻辑地址空间。这时,存储效率与 操作系统的分页功能直接有关,并不是指要使所使用的存储空间达到最少。 采用结构化程序设计,将程序功能合理分块,使每个模块或一组密切相关模块的程序体 积大小与每页的容量相匹配,可减少页面调度,减少内外存交换,提高存储效率。 在微型计算机系统中,存储容量对软件设计和编码的制约很大。因此要选择可生成较短 目标代码且存储压缩性能优良的编译程序,有时需采用汇编程序。通过程序员富有创造性的 努力,提高软件时间与空间效率。 提高存储效率的关键是程序的简单性。 (4) 影响输入/输出的因素 输入/输出可分为两种类型:一种是面向人(操作员)的输入/输出;一种是面向设备 的输入/输出。如果操作员能够十分方便、简单地录入输入数据,或者能够十分直观、一目 了然地了解输出信息,则可以说面向人的输入/输出是高效的。至于面向设备的输入/输出, 分析起来比较复杂。从详细设计和程序编码的角度来说,可以提出一些提高输入/输出效率 的指导原则: ▪ 输入/输出的请求应当最小化; ▪ 对于所有的输入/输出操作,安排适当的缓冲区,以减少频繁的信息交换。 ▪ 对辅助存储(例如磁盘),选择尽可能简单的,可接受的存取方法; ▪ 对辅助存储的输入/输出,应当成块传送; ▪ 对终端或打印机的输入/输出,应考虑设备特性, 尽可能改善输入/输出的质量和 速度; ▪ 任何不易理解的,对改善输入/输出效果关系不大的措施都是不可取的; ▪ 任何不易理解的所谓“超高效”的输入/输出是毫无价值的; ▪ 好的输入/输出程序设计风格对提高输入/输出效率会有明显的效果。 4. 程序设计语言 程序编码阶段的任务是将软件的详细设计转换成用程序设计语言实现的程序代码。因 此,程序设计语言的性能和设计风格对于程序设计的效能和质量有着直接的关系。 (1) 程序设计语言特性的比较 ① 软件心理学的观点 因为从设计到编码的转换基本上是人的活动,因此语言的性能对程序员的心理影响,将
对转换产生重大影响。程序员总是希望选择简单易学、使用方便的语言,以减少程序出错率, 提高软件可靠性。从心理学的观点,影响程序员心理的语言特性有如下六种: 一致性:它表示一种语言所使用符号的兼容程度、允许随意规定限制、以及允许对 法或语义破例的程度。同是一个符号,给予多种用途,会引起许多难以察觉的错误 二义性:虽然语言的编译程序总是以一种机械的规则来解释语句,但读者则可能用 不同的方式来理解语句。例如,对于一个逻辑表达式A≥“0”andA≤“9”,读者可能对 这个逻辑表达式有不同的理解 如果一个程序设计语言缺乏一致性和存在二义性,那么用这种语言编写出来的程序可读 性就差,同时用这种语言编程也容易出错 简洁性(紧凑性):表示程序员为了用该语言编写程序,必须记忆的有关编码的信息 量。可用语言支持块结构和结构化程序的能力、可使用的保留字和缩写字的种类、数据类型 的种类和缺省说明、算术运算符和逻辑运算符的种类、系统内标准函数的数目等来衡量 遗憾的是,语言的简洁性与程序的一致性常常是抵触的。 局部性:指程序设计语言的联想(综合)特性。综合的特性使人们能够对事物从整 体上进行记忆和识别。在编码过程中,由语句组合成模块,由模块组装为程序体系结构,并 在组装过程中实现模块的高内聚和低耦合,可使程序的局部性加强 线性:指程序的联想(顺序)特性。人们总是习惯于按逻辑线性序列理解程序。如 果程序中线性序列和逻辑运算较多,会提高可读性。如果存在大量的分支和循环,就会破坏 顺序状态,增加理解上的困难。直接实现结构化程序可提高程序的线性特性 传统:人们学习一种新的程序设计语言的能力受到传统的影响。具有 Pascal基础的 程序人员在学习C语言时不会感到困难,因为C保持了 Pasca所确立的传统语言特性。但是 要求同一个人去学习APL或者LISP这样一些语言,传统就中断了。 ②软件工程的观点 从软件工程观点,程序设计语言的特性应着重考虑软件开发项目的需要。为此,对于程 序编码,有如下一些工程上的性能要求 ■详细设计应能直接地容易地翻译成代码程序:把设计变为程序的难易程度,反映了 程序设计语言与设计说明相接近的程度。所选择的程序设计语言是否具有结构化的构造,复 杂的数据结构,专门的输入/输出能力,位运算和串处理的能力,直接影响到从详细设计变 换到代码程序的难易程度,以及特定软件开发项目的可实现性。 源程序应具有可移植性:源程序的可移植性通常有三种解释:①对源程序不做修改 或少做修改就可以实现处理机上的移植或编译程序上的移植:②即使程序的运行环境改变 (例如,改用一个新版本的操作系统),源程序也不用改变:③源程序的许多模块可以不做 修改或少做修改就能集成为功能性的各种软件包,以适应不同的需要。 为改善软件的可移植性,主要是使语言标准化。在开发软件时,应严格地遵守ISO或 ANSI、GB的标准,而不要去理会特定编译器提供的非标准特性 编译程序应具有较高的效率 尽可能应用代码生成的自动工具:有效的软件开发工具是缩短编码时间,改善源代 码质量的关键因素。使用带有各种有效的自动化工具的“软件开发环境”,支持从设计到源代 码的翻译等各项工作,可以保证软件开发获得成功。 可维护性:源程序的可读性,语言自身的文档化特性(涉及标识符的允许长度、标 号命名、数据类型的丰富程度、控制结构的规定等)是影响到可维护性的重要因素。 ③程序设计语言的技术性能 在计划阶段,极少考虑程序语言的技术特性。但在选定资源时,要规划将要使用的支撑 工具,就要确定一个具体的编译器或者确定一个程序设计环境。如果软件开发组的成员对所
8 对转换产生重大影响。程序员总是希望选择简单易学、使用方便的语言,以减少程序出错率, 提高软件可靠性。从心理学的观点,影响程序员心理的语言特性有如下六种: ▪ 一致性 :它表示一种语言所使用符号的兼容程度、允许随意规定限制、以及允许对 语法或语义破例的程度。同是一个符号,给予多种用途,会引起许多难以察觉的错误。 ▪ 二义性 :虽然语言的编译程序总是以一种机械的规则来解释语句,但读者则可能用 不同的方式来理解语句。例如,对于一个逻辑表达式 A ≥“0”and A ≤“9”,读者可能对 这个逻辑表达式有不同的理解。 如果一个程序设计语言缺乏一致性和存在二义性,那么用这种语言编写出来的程序可读 性就差,同时用这种语言编程也容易出错。 ▪ 简洁性(紧凑性):表示程序员为了用该语言编写程序,必须记忆的有关编码的信息 量。可用语言支持块结构和结构化程序的能力、可使用的保留字和缩写字的种类、数据类型 的种类和缺省说明、算术运算符和逻辑运算符的种类、系统内标准函数的数目等来衡量。 遗憾的是,语言的简洁性与程序的一致性常常是抵触的。 ▪ 局部性 :指程序设计语言的联想(综合)特性。综合的特性使人们能够对事物从整 体上进行记忆和识别。在编码过程中,由语句组合成模块,由模块组装为程序体系结构,并 在组装过程中实现模块的高内聚和低耦合,可使程序的局部性加强。 ▪ 线性 :指程序的联想(顺序)特性。人们总是习惯于按逻辑线性序列理解程序。如 果程序中线性序列和逻辑运算较多,会提高可读性。如果存在大量的分支和循环,就会破坏 顺序状态,增加理解上的困难。直接实现结构化程序可提高程序的线性特性。 ▪ 传统 :人们学习一种新的程序设计语言的能力受到传统的影响。具有 Pascal 基础的 程序人员在学习 C 语言时不会感到困难,因为 C 保持了 Pascal 所确立的传统语言特性。但是 要求同一个人去学习 APL 或者 LISP 这样一些语言,传统就中断了。 ② 软件工程的观点 从软件工程观点,程序设计语言的特性应着重考虑软件开发项目的需要。为此,对于程 序编码,有如下一些工程上的性能要求: ▪ 详细设计应能直接地容易地翻译成代码程序 :把设计变为程序的难易程度,反映了 程序设计语言与设计说明相接近的程度。所选择的程序设计语言是否具有结构化的构造,复 杂的数据结构,专门的输入/输出能力,位运算和串处理的能力,直接影响到从详细设计变 换到代码程序的难易程度,以及特定软件开发项目的可实现性。 ▪ 源程序应具有可移植性 :源程序的可移植性通常有三种解释:① 对源程序不做修改 或少做修改就可以实现处理机上的移植或编译程序上的移植;② 即使程序的运行环境改变 (例如,改用一个新版本的操作系统),源程序也不用改变;③ 源程序的许多模块可以不做 修改或少做修改就能集成为功能性的各种软件包,以适应不同的需要。 为改善软件的可移植性,主要是使语言标准化。在开发软件时,应严格地遵守 ISO 或 ANSI、GB 的标准,而不要去理会特定编译器提供的非标准特性。 ▪ 编译程序应具有较高的效率。 ▪ 尽可能应用代码生成的自动工具 :有效的软件开发工具是缩短编码时间,改善源代 码质量的关键因素。使用带有各种有效的自动化工具的“软件开发环境”,支持从设计到源代 码的翻译等各项工作,可以保证软件开发获得成功。 ▪ 可维护性 :源程序的可读性,语言自身的文档化特性(涉及标识符的允许长度、标 号命名、数据类型的丰富程度、控制结构的规定等)是影响到可维护性的重要因素。 ③ 程序设计语言的技术性能 在计划阶段,极少考虑程序语言的技术特性。但在选定资源时,要规划将要使用的支撑 工具,就要确定一个具体的编译器或者确定一个程序设计环境。如果软件开发组的成员对所