1、第 4 章 总体设计 4.1 总体设计的目标和任务 4.2 软件设计的概念和原理 4.3 设计准则 4.4 总体设计的常用方法及工具,第 4 章 总体设计软件设计是一个把软件需求变换成软件表示的过程。它包括确定能实现软件功能、性能要求集合的最合理的软件系统结构,设计实现的算法和数据结构。软件设计的结果是软件设计规格说明书。软件设计通常划分为两个阶段,即总体(概要)设计阶段和详细设计阶段。总体目标是将需求分析阶段得到的目标系统的逻辑模型, 变换为目标系统的物理模型。简单地说, 是根据需求分析的做什么(What to do?),来确定系统应该怎么做(How to do ?)。,4.1 总体设计的目
2、标和任务 4.1.1 总体设计的任务在总体设计过程中,系统分析员要先复审软件计划、软件需求分析提供的文档,审定后进入设计。总体设计的具体任务如下: 4.1.1.1 制定规范(1)阅读和理解需求说明,确认用户要求,确定设计目标,安排优先顺序。 (2)根据目标确定最合适的设计方法。(3)规定设计文档的编制标准。(4)规定编码的信息形式、与硬件/操作系统的接口规约等。(5)制定编程规范,如命名规则、程序的结构等。,4.1.1.2 软件系统结构设计。(1)选定设计方法,按功能划分模块。(2)确定每个模块的功能(3)确定模块间的调用关系(4)确定模块之间的接口,即模块之间传递的信息。 (5)评价模块结构
3、的质量 4.1.1.3 数据结构及数据库设计 1.数据结构设计将数据词典中描述的详细数据内容加以细化,转化为数据结构的定义。2.数据库设计(1)概念结构设计 设计概念模型(E-R图)。,(2)逻辑结构设计将概念模型(E-R)转换成DBMS支持的数据模型。(3)物理结构设计设计数据模型的一些物理细节,为数据模型在设备上选定合适的存储结构和存取方式. 4.1.1.4 可靠性设计 考虑相应措施,确保软件质量。 4.1.1.5 编写概要设计文档(1)概要设计说明书(2)数据库设计说明书(3)用户手册(4)测试计划,4.1.1.6 设计审查和复审及早发现软件缺陷,使各种缺陷在编码、测试和 交付使用前加以
4、改正,这样可明显地减少开发阶段后 期和维护阶段的费用。 4.1.2 总体设计的目标软件设计的最终目标是要取得最佳方案。一般来 讲,好的软件会表现出三个特点:1.能按照指定的要求工作,符合功能和性能要求。2.软件的可维护好,能方便地进行修改。3.有一套齐备的文档。所谓“最佳”是指侯选的方案,能节省开发费用、 降低资源消耗、缩短开发时间、能够赢得较高的生产 率、较高的可靠性和可维护性。,软件设计是后续开发步骤及软件维护工作的基础。在设计阶段所做的种种决策直接影响软件的质量,如果没有好的软件设计,就没有稳定的系统,也难以维护。,4.2 软件设计的概念和原理,软件工程围绕软件生存期,提出解决各阶段、步
5、骤任务的具体方法和技术。使得软件开发就像工厂的流水生产,有序地进行技术,所不同的是软件开发的归档和控制更加困难。因此,软件开发必须遵循一套原则,配之科学的管理手段,限制人的随意性,讲究规范化。 4.2.1 软件结构和过程 软件总体设计主要是软件结构设计,而详细设计是软件的过程设计。所以弄清结构和过程的差别及特点,是进行总体设计和详细设计的前提。,4.2.1.1软件结构 软件结构是软件要求的各个元素及相互关系的描述。一般软件元素就是功能模块。通过调用关系,将软件元素组合在一起,即得到软件结构。 由功能模块连接而得到的软件结构最普通的形式就是树型结构和网状结构。,1. 结构的层次规则(1)顶层只有
6、一个模块。(2)底层有若干个模块。(3)中间层(除顶层以外)有多个模块。任一模块都会有它的邻层(上、下)模块与之有关。(4)在同层模块之间不发生联系。,扇入:一个给定模块的直接上属 模块数。扇出:一个给定模块的直接下属 模块数。深度:结构图中模块的层次数。宽度:结构图中同一层模块的最 大模块数。,2.度量软件结构的术语,深度,宽度,扇出,扇入,控制结构示意图:,(=2),(=4),(=3),(=6),扇入数越高,则表明共享这一模块的上级模块数就越多,这是我们所追求的目标。扇出数过高,则表明它所调用的下一级模块数过多,过高的扇出会使控制变得复杂化。造成扇出数过高的原因是分解速度过快。当然,扇出数
7、太低也并不可取。可见,一个好的软件结构的形态准则是:软件结构应具有瓮形结构,即顶部宽度最小,中部宽度最大,底部宽度次之。在结构顶部有较高的扇出数,在底部有较高的扇入数。,4.2.1.2 过程软件过程用以描述各模块的处理细节(算法的详细描述),包括对下层模块控制的操作细节。 4.2.2 模块化 (Modularity)模块:一种独立且可以标识的程序单位。它可以 单独编译,也可与其他程序单位组合,并装入计算机内 存中。模块化:把一个程序按功能分解成若干个彼此具 有一定独立性,同时也具有一定联系的组成部分。模 块化是好的软件设计的一个基本准则;,4.2.2.1 模块化的目的采用模块化原理会使软件结构
8、清晰,不仅容易设计也容易阅读和理解。可以大大减少软件开发成本。例: 将问题P分解为P1,P2 (P=P1+P2) 。设函数C(x)是定义问题 x 的复杂程度,函数E(x)是解决问题 x所需要的工作量。对问题P1和P2,如:C(P1) C(P2) 显然: E(P1) E(P2) 有规律:C(P1+P2) C(P1)+C(P2)E(P1+P2) E(P1)+E(P2) “各个击破”理论,成本或工作量,模块数量,软件总成本,集成成本,成本/模块,M,最小成本区域,随着模块数量的增加,模块本身的复杂度和工作量就会变小,但会导致模块接口间的工作量增加。每个软件都存在一个最小成本区,把模块数控制在这一范围
9、,可以使总的开发工作量保持最小。,4.2.2.2 抽象与逐步求精,1.抽象(Abstraction)抽象是从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征。抽象是哲学的根本特点,抽象不能脱离具体而独自存在。抽象是人类在认识复杂现象的过程中使用的最强有利的思维工具。2.逐步求精逐步求精是人类解决复杂问题的又一基本方法。抽象与逐步求精和模块化的概念是紧密相关的,它们是一对互补的概念。,1人同问 什么是抽象? 2012-1-9 12:11 提问者: 王茹熠 我来帮他解答 推荐答案 2012-1-9 12:20 抽象 抽象是哲学的根本特点, 抽象,4.2.2.3 信息隐蔽和局部化 (In
10、formation Hiding)信息隐蔽 模块所包含的信息,不允许其它不需要这些信息 的模块访问,独立的模块间仅仅交换为完成系统功能 而必须交换的信息。信息隐蔽的目的:提高模块的独立性,减少修改 或维护时的影响面。信息局部化 把关系密切的软件元素物理地放得彼此靠近。这 样能使得系统有很好的可护性、可靠性和可理解性。,4.2.2.4 模块独立性( Module Independence ) 模块独立的概念是模块化、抽象、信息隐蔽和局 部化概念的直接结果。模块独立的含义:1.模块完成独立的功能;2.模块符合信息隐蔽和信息局部化原则;3.模块间的关联和依赖程度尽量小。模块的独立性,取决于模块内部和
11、外部模块的特 征。SD方法为模块独立性给出了两个定性的度量标准: 两个模块之间的关系耦合性 模块自身各组成部分之间的关系内聚性,4.2.2.5 耦合性 Coupling 耦合性是对一个软件结构内部两个不同模块之间 相互关联程度的度量。耦合的强与弱取决于模块间接口的复杂程度。耦 合性越高,模块独立性就越弱。,无耦合 没有依赖关系,松散耦合 有少量依赖关系,紧密耦合 有很多依赖关系,耦合的强度依赖以下因素:一模块对另一模块的引用;一模块向另一模块传递的数据量;一模块施加到另一模块的控制的数量模块间接 口的复杂程度。,(1)非直接耦合(Nondirect Coupling)两个模块没有直接关系,它们
12、的联系完全是通 过主模块的控制和调用实现,这就是非直接耦合。 这种耦合的模块独立性最强。,一模块调用另一模块时,被调用模块的输入、输 出都是简单的数据。数据耦合属于松散耦合。,(2) 数据耦合(Data Coupling),开发票,计算水费,数据耦合举例,(3) 标记耦合(特征耦合),stamp coupling如两个模块通过传递数据结构(不是简单数据, 而是记录、数组等)加以联系,或都与一个数据结构 有关系, 则称这两个模块间存在标记耦合。,标记耦合举例,“住户情况”是一个数据结构,图中的两个模块都与此数据结构有关。因此,计算水费”和“计算电费”均与计算水电费为标记耦合。另外,计算水费”和“
13、计算电费” 本无关,但它们都引用了“住户情况”这一数据结构,使其产生了依赖关系,增加了模块之间的耦合度。,可将标记耦合修改为数据耦合,计算水电费,计算水费,计算电费,本月 用水量单价,本月 用电量单价,水费,电费,(4) 控制耦合,Control Coupling一模块向下属模块传递的信息 (开关量、标志等控制被调用模块决策的变量) 控制了被调用模块的内部逻辑。,控制耦合举例,A,计算平均分 或最高分,B,平均/最高 (控制信号),成绩,读入分数,输出结果,计算平均分,计算最高分,平均/最高?,B,控制耦合增加了理解和编程的复杂 性,调用模块必须知道被调模块的内部 逻辑,从而增加了模块间的相互
14、依赖关 系。消除模块间控制耦合的方法首先将被调用模块内的判定上移到 调用模块中;然后将被调用模块分解成 若干个单一功能的模块。,改控制耦合为数据耦合,将B模块分解成B1和B2两个模块。,A,计算平均分,B1,平均成绩,最高成绩,计算最高分,B2,(5) 外部耦合External Coupling一组模块均与同一外部环境关 联(例如,I/O模块与特定的设备、 格式和通信协议相关联),它们之间 便存在外部耦合。外部偶合必不可 少,但这种模块数目应尽量少。,(6) 公共耦合(公共数据区耦合) Common Coupling一组模块引用了同一个公用数据区 (也称全局数据区、公共数据环境)的数据。公用数
15、据区指:全局数据结构共享通讯区内存公共覆盖区等,公共耦合举例,公共数据区,C,B,模块A、B、C间存在错综复杂的联系,(1)软件可理解性降低 (2)诊断错误困难 (3)软件可维护性差, (4)软件可靠性差 (公共数据区及全程变量无保护措施) 慎用公共数据区和全程变量!,公共耦合存在的问题:,(7) 内容耦合 Content Coupling 如果发生下列情形,两个模块之间就发生了内容耦合 (1) 一个模块直接访问另一个模块的内部数据; (2) 一个模块不通过正常入口转到另一模块内部; (3) 两个模块有一部分程序代码重迭(只可能出现在汇编语言中); (4) 一个模块有多个入口。,一模块直接访问
16、 另一模块的内部 信息 (程序代码 或数据),最不好的耦合形式 !,A,B,A,B,模块代码重叠,Entry1 Entry2,多入口模块,模块间的耦合,耦合是影响软件复杂程度和设计质量的重要 因素。我们的目标是建立模块间耦合度尽可能松 散的系统,应做到:(1) 尽量使用数据耦合;少用控制耦合;限 制公共耦合的范围;坚决避免使用内容耦合。(2) 尽量降低接口的复杂性,4.2.2.6 内聚性Cohesion内聚性是对模块内的各个组成部分 在功能上相互关联程度的度量。内聚性 越高,模块独立性就越强。设计目标:高内聚(模块在软件过 程中完成单一的任务),(1)偶然内聚(巧合内聚),Coincident
17、al Cohesion,模块M中的三条语句没有任何联系,完全是为了避免重复而写在一起的。缺点:可理解性差, 可修改性差,(2) 逻辑内聚,Logical Cohesion把几种相关功能(逻辑上相似的功能)组合在一模块内,每次调用由传出模块的参数确定执行哪种功能。,逻辑内聚模块,E,F,G,EFG模块内部逻辑,缺点:增强了耦合程度(控制耦合),不易修改,效率低。,公用代码段,公用代码段,(3) 时间内聚(经典内聚),Classical Cohesion模块完成的功能必须在同一时间内执 行,这些功能只因时间因素关联在一起。 例如:初始化系统模块系统结束模块紧急故障处理模块等均是时间性聚合 模块。,
18、(4)过程内聚(顺序性组合),Procedural Cohesion模块内的各处理成份相关,且 必须以特定次序执行。,过程内聚模块,读入 成绩单,审查 成绩单,统计 成绩,打印 成绩,读入并审查成绩单,统计并打印成绩单,(5) 通信内聚,Communicational Cohesion模块内各部分使用相同的输入数据,或产生了相同的输出结果。,通信内聚模块例,使用了相同的输入数据,产生职工 工资报表并计算平均工资模块,(6) 信息内聚,Informational Cohesion模块完成多个功能,各 功能都在同一数据结构上操 作,每一功能有唯一入口。,信息内聚模块,符 号 表,查找,登录,删除,
19、修改,几个加工同时引用一个共同的数据,(7) 功能内聚,Functional Cohesion模块仅包括为完成某个功能所必须的所有成份(模块所有成份共同完成一个功能,缺一不可 ) 。功能内聚的内聚性最强,内聚,3.耦合、内聚与模块独立性关系耦合与内聚都是模块独立性的定性标准,都反映出了模块 独立性的良好程度。但模块的内聚与耦合是密切相关的。各模块内聚程度越高, 模块间的耦合程度就越低。软件概要设计的目标是力求增加模 块的内聚性,尽量减少模块间的耦合性,但增加内聚比减少耦合 更重要,应当把更多的注意力集中到提高模块的内聚程度上。我们的设计目标是高内聚,低耦合。,4.3 设计准则将初始SC根据模块
20、独立性原则进行精化, 对模块进行合并、分解、修改、调整,得到 高内聚、低耦合模块,得到易于实现、易于 测试和易于维护的软件结构,产生设计文档 的最终SC。,改进软件结构设计的指导原则,(1)完善模块的功能 (2)消除重复的功能 (3)将模块的作用范围限制在模块的控制范围内 (4)软件结构的深度、宽度、扇出和扇入应适中 (5)模块的大小要适中 (6)降低模块接口的复杂性 (7)可预测模块的功能 (8)避免模块的病态连接,(1)完善模块的功能,划分模块时,应注意保持模块的相对独立 性,模块划分的准则是:将相关的各部分放在 一起,而无关的东西不要放在一起。完整的模块应包括三部分:有执行规定功能部分;
21、有出错处理部分;有返回的标志。,(2)消除重复的功能,(3)将模块的作用范围限制在模块的控制范围内,模块的作用范围是指模块中若有一个判定条件,受到该判定条件影响的所有模块的集合。图中 C的作用范围是 D、E、F、G、H和L。 模块的控制范围是指模块本身以及它的所有下属模块构成的集合。模块C的控制范围为: C、D、E、F、G、H 。当模块 C 作出的决策影响到了模块L,显然模块 L就超出了模块C的控制范围。,C,H,D,E,G,X,F,A,I,L,J,K,B,注意:如果在设计过程中,发现了作用范围不在控制范围内,可采用下述办法之一,把作用范围限制到控制范围之内:1)将判定所在的模块,合并到父模块
22、中去,使判定处于较高层次;2)将判定上移到层次较高的位置;3)将受判定影响的模块下移到控制范围内;,(4)软件结构的深度、宽度、扇出和扇入应适中 软件结构的深度表示了控制层数,一般来讲深度和程序的长度之间应该有一定的对应关系,所以,深度能粗略地标志一个系统的大小和复杂程度。如果层数过多则应该考虑是否模块划分过于简单,应考虑适当合并。 软件结构的宽度越大,一般来说,系统就越复杂。而对宽度影响最大的因素是模块的扇出。扇出太大一般是因为缺少中间层次,应该适当增加中间层次的控制模块。经验表明,一个好的软件结构,平均扇出通常是3或4个。,分解过快,可通过改进,避免平铺结构。,高扇出的模块结构举例:,通过
23、增加中间层降低扇出,编外 人员 工资,取得工资数据,计时 制工 资额,薪金 制工 资额,编外 人员 税款,编外 人员 扣款,常规扣款,税收扣款,计算实发工资,编外 人员 工资,计时 制工 资额,薪金 制工 资额,编外 人员 税款,编外 人员 扣款,常规扣款,税收扣款,计算实发工资,编外 人员 工资,计时 制工 资额,薪金 制工 资额,编外 人员 税款,编外 人员 扣款,常规扣款,税收扣款,编外 人员 工资,计时 制工 资额,薪金 制工 资额,编外 人员 税款,编外 人员 扣款,常规扣款,税收扣款,编外 人员 工资,计时 制工 资额,薪金 制工 资额,编外 人员 税款,编外 人员 扣款,常规扣款
24、,税收扣款,编外 人员 工资,计时 制工 资额,薪金 制工 资额,编外 人员 税款,编外 人员 扣款,常规扣款,税收扣款,(5) 模块的大小要适中模块过大,说明分解不够,使可理解程度下降;模块过小,造成开销大于有效操作,会使系统接 口复杂。(6) 降低模块接口的复杂性模块的接口要简单清晰、含义明确,便于理解, 易于实现、易于测试和维护。模块接口的复杂性是软 件发生错误的一个重要原因。因此,设计模块接口时 应使得传递的信息简单,且和模块功能一致。 (7) 可预测模块的功能把模块看成黑盒子,若相同的输入产生了相同输 出,则其功能是可预测的。若模块带有内部状态, 其 功能可能是不可预测的。不可预测的
25、模块难理解、难 测试、难维护。,防止模块功能过分局限虽然功能单一的模块具有高内聚。但如任意的限制 局部数据结构的大小,过分限的制控制流中可做的选择 或外部接口的模式,那么模块的功能就会过分局限,使 得使用范围过分狭窄,缺乏灵活性和可扩充性。(8) 避免模块的病态连接力求设计单入口和单出口的模块, 避免 “病态连 接”,以防止内容耦合。,4.4. 总体设计的常用方法及工具从系统设计的角度出发,软件设计方法可以分为三大类:1.面向数据流的设计;Data Flow-Oriented Design2.面向数据结构的设计;Data Structure-Oriented Design3.面向对象的设计。O
26、bject-Oriented Design 4.4.1 面向数据流的设计方法 面向数据流的设计方法,又称结构化设计方法即SD(Structured Design)。,4.4.1.1 基本概念SD方法以数据流图为基础,定义了把DFD变换成软件结构图即SC图(SC Structure Chart)的不同映射方法。,映射,DFD (问题结构),SC (软件结构),1. SC图中的基本符号SD方法在概要设计中的主要表达工具约定使用的 符号含义:,SC图中模块间的控制关系信息传递,用弧形线表示循环调用,A根据内在的循环重 复调用B、C等模块,SC中的四种模块,传入模块,(a),(b),A,A,传出模块,
27、B,B,变换模块,(c),C,D,协调模块,E,(d),E,F,F,从下属模块取得数据,经过某些处理,再将其传送给上级模块。它传送的数据流叫做逻辑输入数据流。,从上级模块获得数据,进行某些处理,再将其传送给下属模块。它传送的数据流叫做逻辑输出数据流。,从上级模块取得数据,进行特定的处理,转换成其它形式,再传送回上级模块。它加工的数据流叫做变换数据流。,对所有下属模块进行协调和管理的模块。,酒店管理信息系统功能结构图,大型零售商场管理信息系统功能结构图,TM M I S,系统维护,POS系统,零售实时系统,商品进货管理,商品批发管理,商品库存管理,商品及商品帐管理,顾客管理,连锁店管理,财务管理
28、,人事工资管理,计划统计管理,经理查询,2.数据流图的分类 根据系统结构特征,数据流图可归 纳为两种类型: 变换型结构事务型结构,变换型结构数据流图,传入,变换,传出,变换 中心,传入 部分,传出 部分,变换型数据流举例,输入 信息,物理 输入,格式 检查,处理,显示,正确 信息,结果,物理 输出,数据,变换中心,逻辑 输入,逻辑 输出,传入部分,传出部分,特点:具有明确的传入、变换(或称主加 工) 和传出界面的DFD。,逻辑输入:指离物理输入端最远,但仍可以视为系统输入的那些数据流。,逻辑输出:指离物理输出端最远,但仍可以视为系统输出的那些数据流。,变换流示意图,信息,时间,信息流,输入流,
29、输出流,交换流,外部 表示,内部 表示,事务 分析,事务 中心,动作1,动作2,动作3,接受,接受 部分,事务型结构数据流图,4.4.1.2 SD方法的设计过程,(1)区分传入、变换中心、传出部分,在 DFD 上标明分界线。(2)第一级分解(建立初始SC框架),设计出顶层和第一层模块。(3)第二级分解(分解SC各分支),自顶向下分解,设计出每个分支的中、下层模块。(4)合并各分支,获得初始的SC图。,4.4.1.3 变换分析的步骤 变换分析步骤:,变换分析举例: (1)区分传入、变换中心、传出部分,在 DFD 上标明分界线,变换中心,(2)第一级分解(建立初始SC框架)设计顶层和第一层模块,第
30、一级分解的方法,MC,传入部分,传出部分,变换中心,第一级分解后的SC图,MC,第一层,顶层,第一级分解后的SC(另一种画法),MC,(3)第二级分解(分解SC各分支)自顶向下分解,设计出每个分支的中、下层模块。,传入分支的分解 (1),B,C,A,D,E,a,b,c,e,d,传 入 部 分,传出分支的分解,MC,(4)合并各分支,得到初始的SC图。,传入分支的另一种分解 方法,MA,Get C,b,a,c,Read D,d,e,c,e,B to C,b,c,d,e,a,b,Get E,Get B,D to E,A to B,Read A,传出分支的另一种分解方法,从图-导出的初始SC图的另一
31、种表示方法,MC,顶层第一层第二层,在任何情况下,都可使用变换分析方法设计软件结构。但是,如果数据流具有明显的事务特点时 ( 有一个明显的事务中心),采用事务分析方法为宜。,4.4.1.4 事务分析设计方法,事务分析设计方法步骤:,(1)在DFD上确定事务中心、接收部分和发送部分。 (2)画出SC框架,把DFD上的三部分分别映射为事务控制模块、接收模块和动作发送模块。 (3)分解细化接收分支和发送分支,完成初始SC。,事务分析的映射方法,总控,调度,C路径,B路径,A 路径,A路径,B路径,C路径,接收 路径,用户命令交互子系统,密码命令,密码,显示信息,系统参数数据,用户 命令,读系统 数据
32、,配置信息,显示信息 和状态,命令 分析处理,命令类型,开/关 命令,建立配 置文件,原配置 数据,格式化 配置数据,配置命令,重试信息,四位数字,检验信息,检验信息,A/D信息,格式化配置 数据,格式化 配置数据,用户命令交互子系统初始的SC,用户执行模块,读用户命令,命令处理,密码处理 控制器,现用/非现用 系统,系统设置 控制器,用户命令交互子系统,读用户 命令,密码,显示信息,系统参数数据,用户命令,读系统 数据,配置信息,显示信息 和状态,命令 分析处理,读 密码,命令类型,建立配 置文件,原配置 数据,格式化 配置数据,重试信息,四位数字,检验信息,检验信息,A/D信息,格式化配置
33、 数据,格式化 配置数据,密码命令,开/关 命令,配置命令,用户命令交互子系统的SC,用户执行模块,读用户命令,命令处理,密码处理 控制器,现用/非现用 系统,系统设置 控制器,读系统 数据,建立配 置文件,显示信息 与状态,用户命令交互子系统,读用户 命令,密码,显示信息,系统参数数据,用户命令,读系统 数据,配置信息,显示信息 和状态,命令 分析处理,读 密码,命令类型,建立配 置文件,原配置 数据,与文件中 密码比较,格式化 配置数据,检验信 息过程,重试信息,四位数字,检验信息,检验信息,A/D信息,格式化配置 数据,格式化 配置数据,密码命令,开/关 命令,配置命令,用户命令交互子系
34、统的SC,读系统 数据,用户执行模块,读用户命令,命令处理,密码处理 控制器,现用/非现 用系统,系统设置 控制器,建立配 置文件,读 密码,用文件 比较密码,密码输出 控制器,产生 无效信息,显示信息 与状态,事务流设计举例,取A,总控,A,L,M,N,G,F,B,C,D,E,(主模块),事务加工模块,I,M,L,N,A,B,C,D,F,E,G,事务中心,输出,E,F,G,动作分支的典型结构,P,T 2,T 1,T i,A 2,D 2,A 1,D 1,A 3,A j,D k,事务层,操作层,细节层,处理层,主模块,事务加 工模块,操作 模块,细节 模块,事务流设计举例,取A,总控,A,L,M
35、,N,G,D,B,C,F,E,动作1,动作n,.,细节模块1,细节模块2,.,(操作模块),(细节模块),事务型数据流图举例,I,M,L,N,O,A,B,C,D,F,E,G,H,事务流设计举例 (另一种画法),XX系统,变换控制,A,L,M,A,G,D,B,C,F,E,E、F、G,E、F、G,输出H,O,E、F、G,H,H,N,输入A,输出E、F、G,大型系统DFD中,变换型和事务型 结构往往共存:,T,事务中心,传入,变换,传出,3,4,1,2,6,7,5,8,10,9,11,变换中心,传入,传出,事务型,(3) 混合流设计举例,混合流设计举例,T,事务 中心,传入,变换,传出,接收部分,发
36、送 部 分,AB,T1,变换中心,传入,传出,T2,T3,a,b,b1,b2,b3,c1,c2,c3,d,e,g,f,j,m,事务流子系统,BC,CD,DE,EH,HK,FJ,KL,LM,h,混合流设计举例,k,混合流设计举例,输入D,XX系统,变换控制,输出K,输入C,d,c,输出L,CD,DE,FJ,EH,HK,KL,c,d,d,k,k,k,L,L,输出M,LM,m,m,L,事务子系统,4.4.2 面向数据结构的分析设计方法面向数据流的设计方法来源于程序模块化和功能分解的概念,而面向数据结构的设计方法,则是根据数据结构设计程序处理过程的方法。目前比较成熟的有M.A.Jackson提出的 J
37、ackson系统方法(JSD Jackson System Development)和J.D.Warnier提出的程序逻辑构造方法(LCPLogical Construction of Programs)。下面简单介绍Jackson方法。 4.4.2.1 Jackson方法思想 在许多系统中,所处理的信息都有清晰的层次结构,且输入信息、信息的内部存储和输出信息都具有一定的数据结构。数据结构与程序的结构紧密,相关,有一个著名的公式:程序=算法+“数据结构” 可见,在程序设计中算法和数据结构是紧密相连的,不同的数据结构往往决定了不同的算法结构。也就是说在一定程度上数据结构决定了算法结构,同时也会影
38、响处理过程。例如:重复出现的数据应由具有循环控制结构的程序处理;需要选择数据时,就用带有分支控制的程序结构;而层次的数据,通常和使用这些数据的程序的层次结构十分相似。面向数据结构的设计是根据某些过程,从一些数据结构中导出程序结构,着重于问题数据结构到问题解的程序结构之间的转换,而不强调模块定义。,因此,该方法首先要充分了解所涉及的数据结构,而且用工具清晰地描述数据结构,然后按一定的步骤根据数据结构,导出解决问题的程序结构,完成设计工作。Jackson方法是一种典型的面向数据结构的设计方法。该方法把问题分解为可由三种基本控制结构形式表示的各部分的层次结构。这三种基本控制结构形式是顺序控制结构、选
39、择控制结构和重复控制结构。三种数据结构可以进行组合,形成复杂的结构体系。采用这一方法从目标系统的输入、输出数据结构人手,导出程序框架结构,再补充其他细节,就可得到完整的程序结构图。Jackson方法对有明确输入、输出数据结构的中小型系统特别有效,如商业应用中的文件表格处理。该方法也可与其他方法结合,用于模块的详细设计。,4.4.2.2 Jackson图Jackson图是Jackson方法的图形描述工具。在一般的数据处理系统中,数据结构有“顺序”、“选 择”和 “重复” 等三种类型。以数据结构为基础建立的系 统结构,也有“顺序”、“选择”和“重复”等三种类型。 Jackson方法给出了顺序、选择
40、和重复三种结构形式 的图形表示方法。用Jackson 图表示的三种基本结构, 由方框、连线和一些附加标记组成。标记“O”代表选 择,标记“*”代表重复。连线可以理解为“包含”或 “由组成”。,选择结构,S右面括号中的数字i是分支事件的编号;,可选结构,A或者是选择元素B或者是不出现(可选结构是选择结构的一种常见的特殊形式);,Jackson图的优点是:便于表示层次结构,是对结构进行自顶向下分解的有力工具;形象直观,可读性好;Jackson图可以表示数据结构,也可以表示程序结构。,重复结构,循环结束条件的编号为i。,2. Jackson伪码为了方便从程序结构到逻辑描述的转换, Jackson 方
41、法中为结构图设计了一组与之对应的伪码,并称之 为图解逻辑。 Jackson方法中使用的伪代码和Jackson 图是完全对应的。下面是和三种基本控制结构对应的 伪代码。 顺序结构A seq BCA end其中,seq和end是关键字。,选择结构 A select cond1 B A or cond2C A or cond3D A end 其中,select、or和end为关键字;cond1、 cond2、cond3分别是执行B、C或D的条件。,重复结构A iter until / while cond B A end 其中,iter、until、while和end为关键字,cond 表示条件。,
42、3. Jackson图的使用方法设计一个打印表格的程序。要求表格的形式如下图所示。其中,类别可以是教师或学生两种,打印“状态”这一项时,如果“类别”是教师,打印出他的工龄;如果“类别”是学生,打印出他的年级。,(1)表示数据结构。表格是由表头和表体组成,表体又由若干行组成,每行又分4列,分别为姓名、年龄、类别和状态。可用Jackson图表示其输出的数据结构如下图a。,姓名 年龄 类别 状态,表格,表体,表头,行,姓名,年龄,类别,状态,工龄,年级,a 用Jackson图表示输出数据结构,*,(2)表示程序结构 将图a 所表示的表格生成为一个计算机文件的程序结 构,如图 b所示。 即产生表格的系
43、统由产生表头模块和产生表体模块顺序组成;而产生表体模块可重复调用产生行模块,该模块又产生姓名、年龄、类别和状态模块顺序组成。产生状态模块根据类别选择产生工龄或产生年级模块执行。,b 计算机文件程序结构图,不难看出,只要在图 a的每个方框内的名称前添加上 “产生” 两字即可。这种从数据结构图导出程序结构图的过程,称为 “映射” 。由于该例只有输出结构,由输出结构直接导出程序结构。应该指出,用Jackson图表示程序结构时,图中每一个方框不一定都代表模块。大多数情况下,一个方框可能只包含完成程序中一个简单操作的一条或几条语句。,4.4.2.3 Jackson方法的步骤Jackson方法一般可以归纳
44、为五个步骤:(1)分析并确定输入数据和输出数据的逻辑结构,并用Jackson结构图表示这些数据结构。(2)找出输人数据结构和输出数据结构中有对应关系的数据单元。所谓有对应关系是指,这些数据单元在数据内容上、数量上和顺序上有直接的因果关系。对于重复的数据单元,重复的次序和次数都相同时才有对应关系。 (3)由输入 / 输出的数据结构图导出程序结构图。映射规则如下:1)为每对在输入结构与输出结构中有对应关系的数据单元,按照它们在数据结构图中的层次,在程序结构的相应的层次画出一个处理框。,如果这对数据单元在输入数据结构和输出数据结构中所处的层次相同,则在程序结构图中所处的相同层次中画出一个处理框;如果
45、这对数据单元在输入数据结构和输出数据结构中所处的层次不同,则在程序结构图中所画的处理框,它所处的层次应与它们在数据结构图中低层次的那个对应。2)为输入数据结构和输人数据结构中剩余的数据单元,按照每个数据单元所处的层次,在程序结构图的相应层次分别为它们画上对应的处理框。 3)所有处理框在程序结构图上的位置,应与由它处理的数据单元在数据结构的Jackson图上的位置相对应。4)根据需要对映射导出的程序结构图进行进一步的细化。,描绘程序结构的 Jackson图,应该综合输入数据结构和输出数据结构的层次关系导出。在导出程序结构图的过程中,由于 Jackson图规定,在构成顺序结构的元素中不能有重复出现
46、或选择出现的元素,因此,可能需要增加中间层次的处理框。做好这一步的关键是准确地找出有对应关系的所有数据单元。所谓对应单元,是指在程序中具有因果关系,可以或者需要放在一起处理的单元。 (4)列出完成结构图各框处理功能的全部操作 (包括如:“打开文件”、“关闭文件”等辅助性操作)和条件(包括分支条件和循环结束条件),并且把它们分配到程序结构图的适当位置。(5)用Jackson伪码写出与程序结构图对应的过程性描述。,4.4.2.4 Jackson方法实例例: 一个正文文件由若干个记录组成,每个记录是一个字符串,要求统计每个记录中空格个数,以及文件中空格的总数。要求输出的格式是:每打印一行字符串后,另起一行输出该字符串中的空格数,最后输出文件空格的总数。按上述Jackson方法的步骤如下:,(1)分析并确定输入数据和输出数据的逻辑结构该问题的输入是正文文件,其数据结构的Jackson图如图A所示;按照输出的要求,输出结构如图B所示。,表示输入/输出数据结构的Jackson图,