4.1软件设计概述4.2模块化设计原理4.3软件结构4.4软件体系结构模型4.5结构化软件设计4.6面向对象的设计4.1.1软件设计过程软件设计过程主要包括总体设计、详细设计和设计测试3项活动,这3项活动在各具特色的软件设计方法中以不同的过程形式表现。软件设计的第1类活动是总体设计,也称为“概要设计”、“软件结构设计”或“高层设计”。软件设计说明文档是设计规约的模板,描述所有设计信息。表4-1给出了一个软件设计文档标准示例。1范围1.1系统目标1.2主要软件需求1.3软件设计约束、限制2数据设计2.1数据对象和形成的数据结构2.2文件和数据库结构2.2.1外部文件结构①逻辑结构②逻辑记录描述③访问方法2.2.2全局数据2.2.3文件和数据交叉索引3体系结构设计3.1数据和控制流复审3.2得出的程序结构4接口设计4.1人机界面规约4.2人机界面设计规约4.3外部接口设计4.3.1外部数据接口4.3.2外部系统或设备接口4.4内部接口设计规约5(每个模块)过程设计5.1处理说明5.2接口描述5.3设计语言描述5.4使用的模块5.5内部设计结构5.6注释/约束/限制6需求交叉索引7测试部分7.1测试方针7.2集成策略7.3特殊考虑8附录(包括特殊注解)表4-2给出了详细设计说明书模板。1引言1.1编写目的:阐明编写详细设计说明书的目的,指明读者对象1.2项目背景:应包括项目的来源和主管部门等1.3定义:列出本文档中所用到的专门术语的定义和缩写词·列出有关资料的作者、标题、编号、发表日期、出版单位或资料来源·文档所引用的资料、软件开发的标准或规范1.4参考资料项目经核准的计划任务书、合同或上级机关的批文项目开发计划;需求规格说明书;概要设计说明书测试计划(初稿)用户操作手册2总体设计2.1需求概述2.2软件结构:如给出软件系统的结构图3程序描述3.1逐个模块给出以下说明·性能·输出项目·功能·输入项目3.2算法:模块所选用的算法3.3程序逻辑:详细描述模块实现的算法,可采用标准流程图;PDL语言;N-S图;判定表等描述算法的图表3.4接口·限制条件·存储分配3.5测试要点:给出测试模块的主要测试要求4.2.1模块化问题总的复杂性和总工作量会随着分解逐步减少。但是如果无限地分解下去,总工作量反而会增加。这是因为一个软件系统的各个模块之间是相互关联的,模块划分的数量越多,模块间的联系也就越多。模块本身的复杂性和工作量虽然随着模块变小而减少,模块的接口工作量却随着模块数增加而增大。软件模块化开发存在一个最小成本区,把模块数控制在一定的范围内可以得到最小的总开发工作量,因此软件模块化必须保证科学、合理地进行模块分解。抽象具有不同的级别,在最高的抽象级上,使用问题所处环境的语言,以概括性的术语描述解决方案;在较低的抽象级上,将提供更详细的解决方案说明。例如,当考虑开始需求时,与用户使用业务描述语言和领域术语交谈,主要目的是了解用户的动机。分解技术是模块化概念的一个基本问题,目的是分解一个软件解决方案以求获得最好的模块集合。信息隐蔽原则建议模块应该具有的特征是每个模块对其他所有模块都隐蔽自己的设计决策。信息隐蔽意味着通过一系列独立的模块可以得到有效地模块化,这些独立的构件或模块之间仅交换那些必须交换的信息,且交互是最简单的。1.内聚性内聚性是从功能的角度对模块内部聚合能力的度量,模块的内聚性按照从弱到强逐步增强的顺序可分成7类,如图4-1所示。高内聚是模块独立性追求的目标。2.耦合性耦合性是对一个软件结构内不同模块之间互连程度的度量,其强弱取决于模块间接口的复杂程度及通过接口的数据类型和数目。模块的耦合度按照从弱到强逐步增强的顺序也可分成7类,如图4-2所示。逐步求精是一种自顶向下的设计策略,通过连续精化层次结构的软件细节实现软件的开发。层次结构的开发将通过逐步分解功能的过程抽象,直至形成程序设计语言的语句。逐步求精是人类采用抽象到具体的过程,把一个复杂问题趋于简单化控制和管理的有效策略,这是一个细化的过程。开发软件时应从在高抽象级上定义的功能陈述或数据描述开始,然后在这些原始陈述上持续细化越来越多的细节。重构是一种重新组织的技术,可以简化构件或模块的设计或编码且无须改变其功能或行为。这是一种改进程序内部结构,但不改变代码或设计的外部行为。软件结构图的主要元素如下。(1)模块:模块用带有名字的方框表示,名称应体现模块的功能。(2)控制关系:控制关系用单向箭头或直线表示模块间的调用关系。(3)信息传递:用带注释的短箭头表示模块调用过程中传递的信息。(4)循环调用和选择调用:在上部模块底部加一个菱形符号表示选择调用,在上部模块的下方加一个弧形箭头,表示循环调用。(5)软件结构图的形态特征如下。(6)画结构图应注意的事项如下。4.4.1系统构成模型1.以数据为中心的结构模型大多数使用大量数据的系统都是围绕共享数据库(或者称为“容器”)组织的,所以基于一个共享数据库的系统模型称为“以数据为中心的结构模型”。这个模型适合于数据由一个子系统产生,而其他子系统共享使用的系统结构,这种类型的系统有命令控制系统、管理信息系统、CAD系统和CASE工具集成系统等。图4-4所示所示为基于一个共享数据的CASE工具集成系统的系统结构示例。2.数据流体系结构模型当输入数据经过一系列的计算和操作构件或模块的变换形成输出数据时,可以应用数据流体系结构。管道和过滤器体系结构(如图4-5所示)通过一组由管道连接的过滤器变换数据,并向下传递。3.客户机/服务器结构模型客户机/服务器结构模型的主要组成部分如下。(1)一组给其他子系统提供服务的单机服务器。(2)一组向服务器请求服务的客户机。(3)一个连接客户机和服务器的网络(可选)。客户机必须知道可用的服务器的名字及其所提供的服务,并通过远程调用获取服务器提供的服务;反之,服务器没有必要知道客户机的身份,以及到底有多少客户机在运行。图4-6所示为多媒体服务系统。4.抽象机模型抽象机模型也称为“分层模型”,是建立子系统的接口模型。它把子系统组织成一系列的层次,每一层提供一组服务,并定义为一个抽象机。例如,网络协议OSI参考模型就是一个有影响的抽象机模型例子,如图4-7所示。1.集中式控制(1)调用—返回模型:这是一个自上而下的子过程模型。控制始于系统的顶层,在子系统(程序)调用过程中,控制逐步传递到更低的层次中。该模型适用于顺序执行的系统。(2)管理者模型:这是一种适用于并发系统的模型,一个系统组件被指定为系统管理者,控制其他系统过程的启动、终止和协调。一个过程就是一个能和其他过程并发执行的子系统或模块。图4-8所示是一个实时系统的集中式控制模型例子。2.事件驱动系统在集中式控制模型中,控制决断通常由一些系统状态变量值决定;相反,事件驱动的控制模型是通过外部产生的事件驱动系统的。有多种不同的基于事件驱动的系统,如电子表格和基于规则的产生式系统等。广播模型和中断驱动模型是两种事件驱动的控制模型。4.5.1面向数据流的设计方法1.数据流类型根据基本系统模型,数据信息必须以“外部”信息形式进入软件系统。例如,键盘输入的数据和鼠标交互的事件等,经过内部处理以后再以“外部”的形式离开系统。根据数据信息的“流动”特点,可分为3种数据流类型,即变换型数据流,事务型数据流和混合型数据流。图4-9所示为变换型数据流模型表示信息的时间“历史”状况。当数据流经过一个具有“事务中心”特征的数据处理时,它可以根据事务类型,从多条路径的数据流中选择一条活动通路。这种具有根据条件选择处理不同事务的数据流,就是事务型数据流,简称为“事务流”。图4-10所示为具有事务流特征的数据流图示例。在一个大型系统的DFD中,变换流和事务流往往会同时出现。例如,在一个事务型的DFD中,分支动作路径上的信息流也可能会体现出变换流的特征,如图4-11所示。其中以事务流为中心,在分支通路上出现变换型的数据流。有些系统中以变换流为中心,且在变换中以拥有多条通路的事务流形式存在,如图4-12所示。2.数据流设计方法(1)复查基本系统模型,并精化系统数据流图。(2)分析数据流类型,确定数据流具有变换流特征,还是事务流特征。(3)如果是变换流特征,确定输入流和输出流的边界(也分别称为“最高输入/输出抽象点”),该流边界之间就是变换流,也称为“变换中心”。(4)采用自顶向下,逐步求精的方式完成模块分解,确定相应的软件组成结构,并对每一个模块给出一个简要说明,包括模块接口信息,模型内部信息,过程陈述和约束等。(5)根据模块独立性原理和运用设计度量标准,对导出的软件结构进行优化。【案例4.1】统计文件中单词数目的数据流设计统计文件中单词数目系统的数据流图如图4-13所示。根据输入流边界和输出流边界确定了输入、变换、输出数据流,软件可第1次分解成如图4-14所示的3个模块的结构。“读取和验证文件名”、“统计单词数目”和“格式化和显示单词数”模块分别对应数据流图的输入、变换和输出3个部分。“读取和验证文件名”模块把验证标志传给“统计单词数”模块。文件名若无效,则打印错误信息,退出系统;若有效,则统计该文件的单词数目,然后传给“格式化和显示单词数”模块。“读取和验证文件名”及“格式化和显示单词数”模块具有通信内聚性,可分别把各自的功能进一步分解为下属模块功能。图4-15给出了第3次分解后的软件结构图。【案例4.2】自动柜员机(ATM)事务流设计“自动柜员机(ATM)业务”软件的数据流图如图4-16所示。ATM系统结构应分解为事务分析器与事务调度器两部分,分析器确定事务类型,并将事务类型信息传给调度器,然后由调度器执行该项事务;事务操作部分可以逐步求精,直到给出最基本的操作细节。事务基本操作细节模块往往是被上层模块共享的,这部分结构模式往往被称为“瓮型”结构。图4-17给出了ATM软件结构图。【案例4.3】公司的销售管理系统设计一个公司的销售管理系统的数据流图如图4-18所示。在每个功能中都经历了数据输入—数据变换,以及分析—数据输出这样的变换型数据流程。将销售管理系统的数据流图变换成软件结构图,如图4-19所示。1.Jackson图Jackson图是Jackson方法分析和设计最有效的表达手段,用它既可以描述问题的数据结构,也可以描述软件的程序结构。图4-20给出了Jackson图顺序、选择和重复4种逻辑结构的表示方法示例。JSD方法的设计过程主要有以下5个步骤。(1)分析并确定问题的输入和输出数据的逻辑结构,并用Jackson图描绘这些数据结构。(2)找出输入数据结构和输出数据结构中有对应关系的数据单元。注意对应关系是指有直接的因果关系,有相同的数据单元(重复出现的数据单元必须有相同的重复次序和次数)。(3)根据下述规则从数据结构的Jackson图导出程序结构的Jackson图。(4)列出所有的操作和条件(包括分支条件和循环条件),并把它们分配到程序结构图的适当位置。(5)用某种形式的伪码给出程序结构图对应的过程性描述。【案例4.4】统计文件空格数并输出统计问题描述:一个由若干个记录组成的正文文件,每个记录是一个字符串,要求统计每个记录中空格字符的个数和整个文件中的空格总数。统计输出格式为每复制一行字符串之后,另起一行输出该字符串的空格数,最后输出整个文件的空格总数。分析:用Jackson图描述正文文件和输出表格的数据结构,如图4-21所示。设计:用Jackson图描述统计文件空格数的程序结构,如图4-22所示。把以上所有操作和条件分配到程序结构图的适应位置,得到最终的程序处理结构Jackson图,如图4-23所示。最后,根据图4-23的结构特征给出用伪码描述的程序处理过程如下。统计空格seq打开文件读入字符串Totalsum=0程序体iteruntil文件结束…程序体end打印总数seq打印出空格总数打印总数end关闭文件停止统计空格end2.问题定义和数据流描述【案例4.5】图书馆管理系统设计图书馆系统的借/还书功能数据流图在本书3.4.4节的图3-9和图3-10中已经给出,这是一个