详细设计 教学提示:第4章介绍了概要设计的有关知识,本章将介绍详细设计的内容,主要包 括详细设计的任务与原则、设计方法以及规格说明及评审等。 教学目标:理解详细设计的设计任务和设计原则,掌握详细设计的方法和常用工具 的使用,了解详细设计的规格说明书的内容和评审。 通过前面的学习了解了软件概要设计的主要任务是以比较抽象概括的方式提出解决 问题的办法。从软件工程的观点看,在使用程序设计语言编制程序之前,还需要确定每个 模块的具体算法,可以用程序流程图、N-S图、PAD 图或伪码给予清晰的描述,以便在编 码阶段直接翻译成在计算机上能够运行的程序代码,这就是详细设计的内容,因此详细设 计(ProgramDesign)也称过程设计或程序设计。详细设计阶段的任务就是把解法具体 化,但这个阶段不是真正地编写程序,而是设计出程序的详细规格说明。这种规格说明的 作用十分类似于其他工程领域中经常使用的工程蓝图,它们应该包含必要的细节,使程序 员可以根据它们写出实际的程序代码。 5.1 详细设计的任务与原则 详细设计指在概要设计提供的文档及相关设计结果的基础上进一步确定如何实现目 标系统。这一阶段所产生的设计文档将直接影响下一阶段的程序质量。为了保证软件质 量,软件详细设计既要正确,又要清晰易读,以便于编码的实现和验证。 5.1.1 详细设计的任务 详细设计是在概要设计的指导下根据目标系统逻辑功能的要求,结合实际情况,详细 地确定目标系统的结构和具体的实施方案,即对系统的各组成部分进行细致、具体的物理 设计,使系统概要设计阶段所做的各种决定具体化,从而在编码阶段可以把这个描述直接 翻译成用某种程序设计语言书写的程序。 详细设计不同于编码(Coding),其目标是不仅为软件结构图(SC图或HC图)中的每 个模块确定使用的算法和数据结构,而且用某种选定的表达工具给予清晰的描述,更重要 的是使设计的处理过程尽可能简明易懂。 详细设计阶段的主要任务如下。 5 1. 模块的逻辑结构设计 逻辑结构设计是结合所开发项目的具体要求和对每个模块规定的功能开发出模块处 理的详细算法,并选择某种适当的工具加以精确描述。 编码是根据详细设计的逻辑结构进行的程序设计,良好的详细设计是获得可维护性 强、可理解性好的高质量软件的前提。 2. 模块的数据设计 模块的数据设计是为在需求分析阶段的数据对象定义逻辑数据结构,并且对不同的 逻辑数据结构进行不同的算法设计,以便选择一个最有效的方案,同时确定实现逻辑数据 结构所必需的操作模块,以便了解数据结构的影响范围。数据设计包括数据结构设计、数 据库结构设计和文件设计等。 由于数据结构会直接影响程序结构和过程复杂性,因此会在很大程度上决定软件 质量。 3. 模块的接口设计 接口设计是分析软件各部分之间的联系,确定该软件的内部接口和外部接口是否已 经明确定义,模块是否满足高内聚和低耦合的要求,模块作用范围是否在其控制范围之 内等。 4. 模块的测试用例设计 要为每个模块设计一组测试用例,以便在编码阶段对模块代码(即程序)进行预定的 测试,模块的测试用例是软件测试计划的重要组成部分,通常应包括输入数据和期望的输 出数据等内容,其要求和设计方法将在第8章详细介绍,这里需要说明的是,由于负责详 细设计的软件人员对模块的功能、逻辑和接口最清楚,所以可以由他们在完成详细设计后 提出对各个模块的测试要求。 5. 模块的其他设计 根据软件系统的具体要求,还可能进行以下设计:网络系统的设计、输入/输出格式 的设计、系统配置的设计等。 6. 编写详细设计说明书 在详细设计结束时,应该把上述结果写入详细设计说明书,并对详细设计说明书进行 评审。如果评审没有通过,则要再次进行详细设计,直到满足要求为止。通过复审的详细 设计说明书将形成正式文档,交付给下一阶段(编码阶段)并成为其工作依据。 1.详细设计的原则 5.2 由于详细设计是为程序员编码提供的依据,因此在进行详细设计时应遵循以下原则。 62 63 1. 模块的逻辑描述清晰易懂、正确可靠 详细设计的结果基本决定了最终的程序代码的质量。由于详细设计的蓝图是给后续 阶段的工作人员看的,所以模块的逻辑描述正确可靠是软件设计正确的前提。详细设计 结果的清晰易懂主要有两方面的作用:一是易于编码的实现,二是易于软件的测试和 维护。如 果详细设计易于理解,又便于测试和排除所发现的错误,则能够有效地在开发期间 消除在程序中隐藏的绝大多数故障,使得程序可以得到正确稳定的运行,极大地减小运行 期间软件失效的可能性,大幅提高软件的可靠性。 2. 采用结构化设计方法 改善控制结构,降低程序复杂程度,提高程序的可读性、可测试性和可维护性。采用 自顶向下逐步求精的方法进行程序设计,一般采用顺序、选择和循环3种结构,以确保程 序的静态结构和动态结构的执行情况相一致,保证程序容易理解。 3. 选择恰当的工具进行各模块的算法描述 算法表达工具可以由开发单位或设计人员选择,但表达工具必须具有描述过程细节 的能力,进而可以在编码阶段直接将它翻译为用程序设计语言书写的源程序。 5.2 详细设计的方法 使用不同的详细设计方法会影响详细设计的可读性、易理解性以及程序代码的质量 和效率,从而进一步影响程序代码的可维护性。因此掌握详细设计的方法是详细设计的 关键。 5.2.1 结构化程序设计技术 结构化程序设计技术是软件工程发展史中的重要成就之一。结构程序设计技术使得 程序中的控制可以任意地、不受限制地转变成有限的固定结构,使程序的分支减少,易于 阅读和理解,并易于测试,提高了软件开发的生产率和质量。 1. 结构化设计技术的形成 结构化设计技术是从对“取消GOTO 语句”的争论开始而逐步形成的。GOTO 语句 是程序设计语言的一个控制成分,它在给编程带来控制流程转移的方便与灵活、提高程序 执行效率的同时,也使程序的可理解性降低。 20世纪70年代以前,人们设计的绝大多数软件都是非结构化的。早在1963年,针 对当时流行的ALGOL语言,Naur指出在程序中大量、没有节制地使用GOTO 语句会使 程序结构变得非常混乱,但这在当时并没有引起人们足够的重视。随后,著名的荷兰科学 家E.W.Dijkstra在1965年的IFIP会议上指出:可以从高级语言中消除GOTO 语句, 64 程序的质量与程序中所包含的GOTO 语句的数量呈反比。他提出了结构化程序的概念, 认为GOTO 语句太原始,引用太多会使程序一塌糊涂。由此引发了一场关于GOTO 语 句的争论。 1966年,Boehm 和Jacopini在一篇文章中证明:只用“顺序”“选择”和“循环”3种基 本控制结构就能实现任何单入口、单出口的程序设计。 1972年,IBM 公司的Mills进一步提出,程序应该只有一个入口和一个出口,采用自 顶向下、逐步求精的设计和单入口、单出口的控制结构。改善程序设计控制结构可以降低 程序的复杂程度,从而提高程序的可读性、可测试性、可维护性。 我们知道,程序的执行是动态的过程,如果不加限制地使用GOTO 语句,则会使程序 变得晦涩难懂,增加程序出错的概率,降低程序的可靠性;GOTO 语句会影响程序结构的 清晰度,破坏程序基本结构的单入口、单出口原则;由于GOTO 语句将程序串成一体,因 此会给程序的测试和维护造成困难,在修改程序时也会引发副作用。 通过下面的一个实例,我们可以体会到非结构化程序设计技术的缺点。 【例5.1】 编程实现:从键盘输入3个数,判断最小值并输出。 方法一:用非结构化设计技术实现。 算法描述如图5.1所示。 图5.1 求3个数中最小值的非结构化设计的算法描述 具体代码如下。 #include main() { int a, b, c; scanf("%d %d %d",&a,&b,&c); if (a main() { int a,b,c; scanf("%d %d %d",&a,&b,&c); if(a=b && b