第7章结构化系统设计.p..._第1页
第7章结构化系统设计.p..._第2页
第7章结构化系统设计.p..._第3页
第7章结构化系统设计.p..._第4页
第7章结构化系统设计.p..._第5页
已阅读5页,还剩204页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章 结构化系统设计,7.1 系统设计的任务要求 7.2 结构化设计的基本概念 7.3 从数据流图导出结构图 7.4 一体化设计方法7.5 代码设计 7.6 输出设计 7.7 输入设计,7.8 人机对话设计 7.9 计算机处理过程的设计 7.10 计算机系统的选择 7.11 系统设计说明书 习题7,7.1 系统设计的任务要求,系统分析阶段要回答的中心问题是系统“做什么”,即明确系统的功能。这个阶段的成果是系统的逻辑模型。系统设计要回答的中心问题是系统“怎么做”,即如何实现系统说明书规定的系统功能。这一阶段,要根据实际的技术条件、经济条件和社会条件,确定系统的实施方案,即确定系统的物理模型。,7.1.1 系统设计的目标 根据一个逻辑模型,可以提出多个物理模型。我们怎样评价、选择这些物理模型呢?面向管理的信息系统,其优劣程度取决于它为管理工作提供信息服务的质量。具体讲,我们可以从以下六个方面来衡量。 1. 信息系统的功能 这当然是最根本的一条。它包括系统是否解决了用户希望解决的问题,是否有较强的数据校验功能,能否进行所需要的运算,能否提供符合用户需要的信息输出等等。,2. 系统的效率 这是与时间有关的指标。例如,联机处理系统的响应时间,即从发出要求到得到应答信号的时间,又如批处理系统的处理速度,即处理单个业务的平均时间等。在实时录入、成批处理的事务处理系统中,常用处理能力(标准时间内处理的业务个数)来表示系统的工作效率。,影响系统效率的因素很多,包括系统的硬件及其组织结构、人机接口设计是否合理、计算机处理过程的设计质量等等。这里强调的是整个系统的效率,而不是某一部分的效率。例如,商场的收款系统,衡量其效率的标准是顾客等待时间的长短。它包括人的操作时间和计算机的运算时间。一般来讲,计算机的运算时间比人操作的时间要少得多。因此,人机界面设计是否便于操作,操作人员是否熟练,是这类系统至关重要的因素。,3. 系统的可靠性 系统的可靠性,指系统在运行过程中抵御各种干扰,保证系统正常工作的能力。它包括检查错误、纠正错误的能力及系统一旦发生故障后重新恢复、重新启动的能力。 系统在运行过程中难免会遇到各种干扰。这些干扰有人为的,如病毒、无意的错误操作等;有自然的,如地震、火灾、突然停电等。提高系统的可靠性也有种种途径,例如可以选择可靠性较高的设备,采用硬件结构冗余设计(如双机结构),设置故障检测、恢复处理及各种安全措施等。,4. 系统的工作质量 系统的工作质量指系统提供的信息的准确程度,使用的方便性,输出表格的实用性和清晰性等。很明显,系统的工作质量直接影响系统的使用效果,因此,必须引起注意。同样,这里讲的工作质量是整个系统的工作质量,而不是某个部分的质量。管理信息系统是一个人机系统,除了程序正确之外,还要保证输入计算机的数据是正确无误的。即使输入是正确的,计算结果显示在屏幕上也是正确的,但人还可能看错,如把“3”看成“8”。,这就要求设计人员在各个环节,如输入设计、输出设计、代码设计、人机接口设计等环节都要精心设计。设计时既要考虑应用的要求,还要考虑使用者的能力与心理的反应。,5. 系统的可变更性 系统的可变更性是指修改和维护系统的难易程度。系统实施过程中,需要测试、修改。系统交付使用之后,也会发现某些错误或不足之处。另外,随着系统环境的变化,用户会对系统提出某些新的要求。因此,系统的修改是否方便直接关系到系统生存期的长短。一个可变更性好的系统,维护相对容易,生命周期就长。,6. 系统的经济性 系统的经济性是指系统收益与支出之比。这是确定设计方案的一个重要因素。 系统的效率、服务质量、可靠性、可变更性、经济性等指标是相互联系又彼此制约的,在一定程度上是相互矛盾的。例如,为了提高系统的可靠性,就要采取一些校验和控制措施,系统的效率就要受到一定的影响。但从另一个角度看,由于系统可靠性的提高,抗干扰能力强了,系统能不间断运行,中断时间的减少又提高了系统的效率。某些系统对可靠性要求很高,需要选取可靠性高的设备,甚至采用双机结构,这样系统成本要大幅度增加,经济性下降。,再如,为了增强系统的可变更性,采用模块化结构,系统的效率也会有所降低。这种彼此制约的关系说明,在系统设计时,应根据系统的具体情况有所侧重:对于可靠性要求高的系统,如涉及财务及某些高度机密的信息,首先要保证系统可靠,不惜增加成本,在一定程度上可降低效率;对于实时性要求高的系统,如飞机订票系统,首先保证效率,不妨增加一些存储空间的开销。 但是,从系统开发的角度看,系统的可变更性是首先应考虑的因素。这是因为,无论对系统研制过程还是今后的运行,它都有直接的影响。据统计,在系统的整体生命周期中,各种经费开销所占比例如下:,研制占20%其中:分析与设计35%编写程序15%调试50%维护占80%,这里的维护包括排除开发阶段的错误,适应环境变化增加新的功能等工作。 由此可见,修改系统的经费开销占了整个经费的90%(20%50%80%),如果系统的可变更性好,就可以大大节约人力、财力,延长系统生命期。事实上,一个信息系统不管事先怎样精心设计,系统投入运行后,总会进行某些修改或补充。这可能是经过一段时间后,发现某些地方效率还可以提高,或者还要增加某些可靠性措施,或者还要增加某些新的功能,或者对工作质量提出新的要求等等。,如果可变更性好,就比较容易满足这些要求。总而言之,可变更性好的系统,效率不高可以提高效率,质量不好可以改进质量,可靠性差可以加强可靠性。反之,可变更性差,修改不如重做,系统寿命自然就短。,从上面的分析可以看出:系统设计必须从保证系统的变更性入手,设计出一个易于理解,容易维护的系统。 为了分析具备什么特点的系统易于修改,必须先找出修改一个系统的困难来自何处。对系统的修改,往往是对某一个模块或某个子系统的细节作一些变动,或者对子系统的组合关系作某些变动。更常见的是修改某一局部的数据结构或执行语句。这种修改的本身并不困难,困难在于找出需要修改的地方和这一修改对其他部分的影响。,我们知道,系统各个部分之间存在控制、调用、数据交换等种种联系。对某一局部的修改,可能直接或间接地影响到系统的其他部分。对A的修改波及B,而对B的修改又可以影响到C、E。人们把这种影响形象地叫做“水波效应”。因此对系统某一个局部的修改,必须十分小心地追踪这一修改所波及的各个部分。这是系统难于修改的主要原因。为了使系统容易修改和容易理解,需要注意以下几个问题:,(1) 把系统划分为这样一些部分,其中每一部分的功能简单明确,内容简明易懂,易于修改。我们把这样的部分称为模块。即划分模块。 (2) 系统分成模块的工作按层次进行。首先,把整个系统看成一个模块,然后按功能分解成若干个第一层模块,这些模块互相配合,共同完成整个系统的功能。按功能再分解第一层的各个模块。依次下去,直到每个模块都十分简单。 (3) 每一个模块应尽可能独立,即应尽可能减少模块间的调用关系和数据交换关系。当然,系统中的模块不可能与其他模块没有联系,只是要求这种联系尽可能少。,(4) 模块间的关系要阐明,这样,在修改时可以追踪和控制。 总之,一个易于修改的系统应该由一些相对独立,功能单一的模块按照层次结构组成。这些模块之间不必要的联系都已去掉,而且它们的功能及相互关系都已阐明。这就是结构化设计的基本思想。,7.1.2 系统设计的内容 系统设计阶段的任务是提出实施方案,该方案是这个阶段工作成果的体现。这个方案以书面的正式文件系统设计说明书提出,它被批准后将成为系统实现阶段的工作依据。 系统设计的基本任务大体上可以分为两个方面。 1. 把总任务分解成许多基本的、具体的任务 这些具体任务合理地组织起来构成总任务。总体设计的基本任务是:,(1) 将系统划分成模块; (2) 决定每个模块的功能; (3) 决定模块的调用关系; (4) 决定模块的界面,即模块间信息的传递。 总体设计是系统开发过程中关键的一步。系统的质量及一些整体特性基本上是由这一步决定的。系统越大,总体设计的影响越大。认为各个局部都很好,组合起来就一定好的想法是不实际的。我们知道:整体大于部分之和。,2. 为各个具体任务选择适当的技术手段和处理方法 它包括: (1) 代码设计; (2) 数据库设计; (3) 输入设计; (4) 输出设计; (5) 人机对话设计; (6) 处理过程设计。,7.2 结构化设计的基本概念,7.2.1 模块 模块(module)一词使用很广泛,通常是指用一个名字就可以调用的一段程序语句。可以将它理解为类似“子程序”的概念,例如PASCAL程序设计中的函数、过程,FORTRAN程序设计中的函数和子程序。,图7.1 模块的表示方法,模块具有输入和输出、逻辑功能、运行程序、内部数据程序代码四种属性。模块的输入、输出是模块与外部的信息交换。一个模块从它的调用者那里获得输入,把产生的结果再传递给调用者。模块的逻辑功能是指它能做什么事,它是如何把输入转换成输出的。输入、逻辑功能、输出构成一个模块的外部特性。内部数据和程序代码则是模块的内部特性,是看不见的。模块用程序代码完成它的逻辑功能。内部数据是仅供该模块本身引用的数据。 在总体设计阶段,我们主要关心模块的外部特性。模块的内部属性是以后要解决的问题。,模块用长方形表示。模块的名字写在长方形内,如图7.1所示。模块的名字由一个动词和一个作宾语的名词表示。模块的名字应恰如其分地表达这一个模块的功能。,7.2.2 结构图 结构化设计采用结构图(structured chart)描述系统的模块结构及模块间的联系。图7.2是结构图的一个例子。,图7.2 结构图示例,结构图中的主要成分有: (1) 模块,用长方形表示。 (2) 调用,用从一个模块指向另一模块的箭头表示前一个模块调用后一个模块。箭尾的菱形表示有条件地调用,弧形箭头表示循环调用。 (3) 数据,用带圆圈的小箭头表示从一个模块传递给另一个模块的数据。 (4) 控制信息,用带小黑点的小箭头表示一个模块传送给另一个模块的控制信息。,结构图的层数称为深度。一个层次上的模块总数称为宽度。深度和宽度反映了系统的大小和复杂程度。 结构图是系统设计阶段最主要的表达和交流工具。这种图应当简明易懂,既要便于设计人员表达自己的设想,又要便于编写程序的人员了解实现要求,还要便于和管理人员商讨。 模块结构图可以由数据流图转换而来。但是,结构图与数据流图有着本质的差别:数据流图着眼于数据流,反映系统的逻辑功能,即系统“做什么”;结构图着眼于控制,反映系统的物理模型,即怎样逐步实现系统的总功能。从时间上来说,数据流图在前,控制结构图在后。,数据流图是绘制结构图的依据。总体设计阶段的任务,就是要对数据流图规定的功能,设计一套实现办法。因此,绘制结构图的过程就是完成这个任务的过程。 结构图也不同于程序框图(flowchart)。后者说明程序的步骤,即先做什么,再做什么。结构图描述各模块的“责任”(responsibility),如一个公司的组织机构图,就用来描述各个部门的隶属关系与职能。,7.2.3 模块间的联系 结构化设计的基本思想,就是把系统设计成由相对独立、功能单一的模块组成的层次结构。为了衡量模块的相对独立性,提出了模块间的耦合(coupling)与模块的内聚(cohesion)这两个概念。它们从不同侧面反映了模块的独立性。耦合反映模块之间连接的紧密程度,而内聚指一个模块内各元素彼此结合的紧密程度。如果所有模块的内聚都很强,模块之间的耦合自然就低,模块的独立性就强。反之亦然。 为了进一步说明这两个概念,我们先看一段小程序:,Begin n:=0; total:=0.0; read (value); WHILE value=0.0 DOBegin n:=n+1 total:=total+value; readln(value)End;average:=total/n;writeln (n, ,average)End.,我们用箭头表示各程序行之间的联系。这种联系往往是程序的某个部分(这里是程序行)引用其他地方定义的数据时产生的,即程序中几个地方都引用了存储器中的同一位置。在一个大的程序中,这种联系是非常多的。因此把一个系统分解成许多模块时,分法不同,模块间的联系程度就不同。我们希望模块内联系越紧越好,模块间联系越少越好。耦合、内聚这两个概念从不同的角度反映这种联系。,7.2.4 模块间的耦合 耦合是影响系统复杂程度的一个重要因素。若为了理解模块A,需要对模块B有所了解,则A、B之间就有联系。如果需要对B的理解越多,则A、B的连接就越紧密,我们就说它们耦合越紧。若程序员要修改紧耦合中的一个模块,很可能不得不修改另一个模块。因此,模块间的耦合程度对系统的可维护性、可靠性有强烈的影响。 影响模块间耦合程度的因素有三个: 联系方式:模块间通过什么方式联系;,来往信息的作用:模块间来往信息作什么用; 数量:模块间来往信息的多少。 这三个因素可用三维坐标表示,如图7.3所示,离坐标原点越远,耦合程度越高。下面分别讨论。,图7.3 影响耦合的因素,1. 联系方式 如图7.3所示,联系方式有两种:“直接引用”和“用过程语句调用”。 直接引用是指一个模块直接存取另一个模块的某些信息。例如全程变量,FORTRAN的COMMON量,C语言的EXTERNAL量,或共享的通信区等。这种耦合也称为公共环境耦合(common environment coupling)。这种耦合的复杂性随耦合的模块个数的增加而显著上升。降低这种耦合程度的办法是局部化,也就是把一个公共区分成许多子区,使每个子区上耦合的模块数减少,如图7.4所示。,图7.4 用局部化方法降低耦合程度,用过程语句调用,是通过模块的名字调用整个模块,一个模块只有一个入口,所有数据往来都以参数形式显式出现。采用这种联接方式,模块间耦合程度比较低。当然,两个模块共享数据很多时,参数传递也不方便。,2.来往信息的作用 模块间的来往信息可以作数据用,也可以作控制信息用。 若两个模块间传递的信息只作数据用,即一个模块提供的输出数据作另一个模块的输入数据,则这种耦合称为数据耦合(data coupling)。这种耦合当然是需要的。,如果两个模块间传递的信息作控制用,这种耦合称为控制耦合(controcoupling)。图7.5(a)中,模块A将参数“平均最高”传递给模块B,模块B按这个参数的值是“平均”还是“最高”去取相应成绩回送到A。这里的参数“平均最高”实际上是一个开关量(尽管它本身可能是数据形式),控制模块B如何工作。这就是控制耦合。,图7.5 控制耦合,控制耦合给理解和修改带来不便:第一,需要理解开关量;第二,模块要设开关量,还要记住开关值是“平均”还是“最高”,以便数据从模块返回后作相应处理。其实,在系统设计中这种耦合是可以避免的。在这个例子中,只要将图7.5(a)改为图7.5(b)所示的形式就行了。图(b)中模块根据需要调用模块B1或B2。,3. 往来信息的数量 很明显,模块间传递的信息量越大,它们之间的耦合程度越高,因为正是这种传递关系造成了模块间的联系。一个模块只需了解它确实需要使用的数据,对其他数据的存在最好完全不知道。 总之,结构化设计要求模块间的耦合程度尽可能小,为此应遵循以下原则:,用过程语句调用其他模块; 模块间的参数作数据用; 模块间的参数尽可能少。 在用高级语言编程序时,只要注意消除开关量,减少共用变量,就可以大大降低模块间的耦合程度。,7.2.5 模块的内聚 模块的内聚反映模块内部联系的紧密程度。如果一个模块内部相关性很高,都是为了同一个功能,我们就说它的内聚程度高。模块的内聚可以分为七类,下面分别介绍。,1. 偶然内聚(coincidentacohesion) 如图7.6所示,模块P、Q、R、S都有某些共同的操作,为了节约空间,减少程序量,可把这些共同的操作抽出来,组成一个模块。实际上这些语句间没有什么联系。这种联系就是偶然型的。在计算机内存小的时代,人们强调缩短程序长度,往往会引起这种情况。这种偶然性内聚的模块不便于修改。例如,若模块要将“B:A”改为“E:A”时,就不能直接改T,因为这一修改可能不适合其他模块。,图7.6 偶然内聚,2. 逻辑内聚(logicacohesion) 将几个逻辑上相似的功能放在一个模块中,模块内联系就是逻辑型内聚。如图7.5(a)中的模块“取平均成绩或最高成绩”就属这一类,它把“取平均成绩”和“取最高成绩”这两个相似的功能放在一起组成一个模块。这个模块的程序流程图如图7.7所示。它需要模块传递一个开关量,根据开关量判定执行哪一个分支。这样做的优点是节约空间,缺点是修改困难。如果现在不仅要知道最高成绩是多少,而且还要打印出获得最高成绩的学生姓名。这一修改就很难适应“取平均成绩”的要求。,图7.7 逻辑内聚,3. 时间内聚(temporacohesion) 这是指与时间有关的联系,即把需要有限时间间隔内处理的成分放在同一模块内。例如一些初始化模块。这种模块的内聚程度比前两种稍高一些,但仍是一种低的内聚。 4. 步骤内聚(proceduracohesion) 模块内的元素属于同一个公共步骤单元,则称该内聚为步骤内聚。图7.8(a)是程序SIMPRO的流程图,虚线框给出划分模块的一个方案。这样划分模块得到的结构图如图7.8(b)所示。模块PERP属时间内聚。模块PLANLOOP和TYPDECID都属于步骤内聚。前者的元素即主循环,后者的元素是主循环内的一个判定过程。,图7.8 步骤内聚,步骤内聚模块的内聚程度比时间内聚模块高。例如,PLANLOOP内各元素不仅满足时间内聚的条件,而且还有附加的步骤上的依赖关系。但步骤内聚的内聚程度仍不算高,往往导致模块间有相当紧的耦合。在SIMPRO程序中,生产情况模拟算法的处理元素同时出现在PLANLOOP和TYPDECID中。可以想象这两个模块会有较紧的耦合。当需要模拟修改时,可能需要同时研究这两个模块。,5. 通信内聚(communicationacohesion) 通信内聚是指模块内的成分引用共同的数据。如图7.9中的两个模块都属于这一类。模块A的两个部分都是对“购货单”的处理,而模块B的两个部分都是对数据存储D的处理。 根据数据流图容易判断一个模块是不是通信内聚。通信内聚的聚合程度已经算高了,找不到更高的内聚结构时,这种结构是完全可以接受的。,图7.9 通信内聚,6. 顺序内聚(sequentiacohesion) 顺序内聚是指模块中某个成分的输出是另一模块的输入。图7.10中的两个模块都属这一类。,图7.10 顺序内聚,与通信内聚相比,顺序内聚的内聚程度更高,因为不论从数据的角度还是从执行的顺序来看,模块内各成分的关系都更紧密。但是与功能内聚相比,通信内聚的内聚程度要低。如图7.11所示,若把ABCDE分割为ABCD、E两个模块,或者ABC、DE两个模块,又或者A、BC、DE三个模块,根据定义这些模块都是顺序内聚,但这样分割破坏了功能的完整性。若将它分割成AB、CDE两个模块,才是最好的分割,这时每个模块包含一个完整的功能。,图7.11 功能内聚,7. 功能内聚(functionacohesion) 若一个模块包括并且仅包括完成一个具体任务所需要的所有成分,则这个模块是功能内聚的。这种模块的聚合程度是最高的。结构化设计的目标就是获得这种模块。 判断一个模块是否为功能内聚的简单有效的办法是:从调用者的角度看,用一个短语简单明确地描述这个模块做什么(不是怎么做!),分析这个短语判断这个模块是完成一个具体任务,还是多个任务,或者做一些彼此无关的杂事。如果是完成一个具体任务,则这个模块是功能内聚的。,功能内聚模块的好处是界面清晰,容易理解,由于一个模块一个功能,因而复用性好。 耦合和内聚的概念是Stevens等人提出的,按他们的观点,给上述七种内聚评分如下: 功能内聚10分; 顺序内聚9分; 通信内聚7分; 步骤内聚5分; 时间内聚3分; 逻辑内聚1分; 偶然内聚0分。,7.2.6 作用范围与控制范围 程序中的每个判断都会产生这样的结果:根据此判断的结果,某些处理执行了,而另外一些没有执行。也就是说,有些处理的执行受判断的影响。由此引出判断的作用范围(或称影响范围)这一概念。 一个判断的作用范围是所有这样的模块的集合,这些模块内含有依赖于这个判断结果的处理。,图7.12 作用范围与控制范围,图7.12中,模块A有条件地调用模块B和C,说明在模块A中调用B、C的语句受判断(是工人还是干部)结果的影响。因此,模块属于这个判断的作用范围。当然,模块B、C也属于这个判断的作用范围。 一个模块的控制范围是指它本身及其所有下属模块的集合。这里所说的下属模块包括直接下属模块及下属模块的下属模块。图7.12中,模块的控制范围是集合A,B,C,D。,判断的作用范围和模块的控制范围,直接影响系统模块的复杂性和可修改性。结构化设计要求:对于任何一个判断,其作用范围应该是这个判断所在模块的控制范围的一个子集。换言之,所有受判断影响的模块应该从属于做出判断的那个模块。图7.12所示的情况满足这一要求。在这个例子中,“是工人还是干部”这个判断可能在模块或者在的上级模块做出,但不论是哪种情况,从这个局部看,都满足结构化设计要求。若该判断就在模块做出,则更理想。在这种情况下,判断的作用范围仅是做出判断的模块及其直接下属模块的集合。,在图7.13中,用“。标志判断所在的模块,灰色的模块表示它是判断的作用范围内的模块。 图7.13(a)的情况是作用范围越出控制范围,这样模块需把判断结果传给y,y再传给A。判断结果是控制信息,这样便产生控制耦合。或者在模块重新判断,这也有不便之处:修改判断时,两处都要修改。图7.13(b)作了改进,此时作用范围没越出控制范围,但判断点太高,同样造成控制耦合。图7.13(c)作了改善。图7.13(d)是最理想的情况,它将不在控制范围内但在作用范围内的模块移到控制范围内,成为模块B的直接下属。,图7.13 判断的位置,7.2.7 模块的扇入与扇出 模块的扇出是指模块的直接下属模块的个数,如图7.14所示。图7.14中,模块平均的扇出数是2。一般认为,设计得好的系统平均扇出数是3或4。,图7.14 模块的扇出,一个模块的扇出数过大或过小都不理想。过大比过小更不好。一般认为扇出的上限不应超过7。扇出过大意味着管理模块过于复杂,需要控制和协调过多的下级。解决的办法是适当增加中间层次。 一个模块的扇入是指调用它的上级模块的个数。扇入越大,表示该模块被越多的上级模块共享,这当然是我们所希望的,但是不能为了获得高扇入而不惜代价。例如把彼此无关的功能凑在一起构成一个模块,虽然扇入数高了,但这样的模块的内聚程度必然低。这是我们应避免的。,设计得好的系统,上层模块有较高的扇出,下层模块有较高的扇入。其结构图像清真寺的塔,上尖,中间宽,下面小。,7.2.8 病人监护系统实例 我们通过下面的实例,说明前面介绍的一些概念在总体设计中的应用,并说明系统设计中应注意的其他一些问题。 实例:通过病床专用设备对病人进行监护。这些设备可以测量病人的若干指标,如体温、脉博、血压等等。每经过一定的时间间隔,监护系统从监护设备读入这些数据,并存入数据库中。医生为每个病人指定各种指标的安全范围。若发现某个指标超出安全范围,或某个监护部件有故障,则向护理站发出通报:指标超出安全范围时报告病人号,部件有故障时则报告床号。,1. 初始结构图 根据上述要求,某个经验不足的设计员做出了该系统的初始结构图,如图7.15所示。 图中:PN是病人号,FS是各指标数据,EOF是标志已查过最后一个病人,EF是标志设备故障,BN是床位号,SR是安全范围,FS2是标志指标是否合理,USF是标志指标不安全。 各模块的功能如下:,图7.15 初始结构图,(1) “采集数据”模块。向主模块传送病人的有关数据:PN、FS、EOF、EF。为此,它调用两个模块:“判定下一个病人”和“读取数据”。 (2) “检查数据”模块。检查数据是否在合理范围内,是否在安全范围内,判定病人是否安全。它分别调用三个模块完成。 (3) “处理数据”模块。把病人有关数据记入数据库中,若病人处于不安全范围则通知医护人员;若设备有故障则通知维修人员。它分别调用三个模块完成这些功能。,2. 结构图的改进 初始结构图有很多需要改进的地方: (1) “通报不安全因素”可由主模块直接调用,主模块具备调用这一模块的参数,而且USF这个参数也只是调用这个模块时才使用。 (2) 同理,“写数据库”模块也可由主模块直接调用。,(3) 经过(1)、(2)的改进后,“处理数据”这一模块只调用“通报设备故障”这一个模块。事实上,“处理数据”这一模块除了起“管道”作用,即把上层模块的信息传递给下层模块之外,没有什么实质性的工作,因而本身也可合并到主模块去,由主模块调用“通报设备故障”。 作了上述变动后,结构图的顶层与第一层如图7.16所示。,图7.16 消除“管道”模块,(4) 前面提到通报设备故障时应通报床位号而不应是病人号。床位号BN可由“采集数据”模块传给主模块,再由主模块传递给“通报设备故障”。但这样做增加了模块间的联系。解决这个问题的另一个途径是由“采集数据”模块直接调用“通报设备故障”模块。同时,设备故障或测得的指标不合理,都应通知维修站。所以在通知维修站之前,还要调用“检查不合理范围”模块。这样,也简化了“检查数据”模块的界面。作了这些变动之后,结构图如图7.17所示。,(5) 若使“读取数据”模块包括由病人号查床位号的功能,则“判定下一个病人”模块的界面可以简化:不用传递BN(床位号)。考虑到“读取数据”模块的篇幅可能过大,可以抽出一个模块“由PN查BN”供它调用。这样,结构图的有关部分如图7.18所示。,图7.17 改进的结构图(1),在此之前,“读取数据”模块是根据床位号读数据。作了这个改动之后,则是根据病人号读数据。因此,该模块的名字改为“采集病人数据”更好。在这个模块中,隐含一段根据床位号从监护设备读入相应因素的程序。这段程序对设备维修人员可能有用。他们关心的主要是设备情况,而不是某个病床上是否有人、这个病人是谁。因此,把这段程序抽出来单独成一个模块更好,名字为“从床号读数据”,则图7.18改写为图7.19。,图7.18 简化模块界面,图7.19 增加公用模块,(6) 若由“检查数据”模块直接调用“通报不安全因素”,则可减少模块间的联系:不用传递USF。这时“检查数据”的名字改为“报告不安全因素”更为恰当。结构图的有关部份如图7.20所示。,图7.20 减少模块间的联系,(7) “从床号读数据”调用“通报设备故障”可能发生这种情况:在某设备维修期间,这个程序可能重复报告该设备故障。这令人生厌。若改由它的上级模块调用,会更灵活。这有典型意义:若一个模块检测错误后,一方面要报告错误信息,一方面又要向上层报告信息,这时由它的上层模块决定是否报告错误信息更灵活、更清楚,见图7.21。 (8) 考虑到无论是通报设备故障,还是通报不安全因素,都要打印一些信息,因此可以再抽出一个“写一行”模块给护理站,供两个模块调用。考虑到“通报不安全因素”模块可能比较大,则抽出一个模块:“生成一行不安全因素”。经过上面这些改进后的结构图如图7.21所示。,图7.21 改进的结构图(2),在这个例子中,用到以下一些技巧: 减少模块间的联系,其中用得最多的是减少传递的参数,尤其注意减少控制信息的传递; 消除重复功能; 消除“管道性”模块; 考虑将来可能发生的变化; 控制模块的大小。一般认为一个模块在50100个语句为宜,过大的模块可按功能分解出下级模块,过小的模块可适当合并;尽可能从整个结构图出发考虑;初始结构图中不满足系统说明书的地方,在改进过程中完善。,7.3 从数据流图导出结构图,结构化系统设计方法与结构化系统分析有着密切的联系。在系统分析阶段,我们用结构化分析方法获得用DFD等工具描述的系统说明书。设计阶段,我们则以DFD为基础设计系统的模块结构。本节讨论如何从数据流图导出初始结构图。,数据流图有两种典型的结构:变换型(transform)结构和事务型(transaction)结构。这两种结构可以分别通过变换分析和事务分析方法导出标准形式的结构图。这些方法都是先设计结构图的顶端主模块,然后自顶向下逐步细化,得到满足数据流图要求的系统结构。,7.3.1 变换分析 变换结构是一种线性结构。它明显地分成逻辑输入、主加工和逻辑输出三部分。图7.22(a)是一个典型的例子。变换分析(transform analysis)过程可以分为三步:,图7.22 变换分析,找出主加工、逻辑输入和逻辑输出部分; 设计顶层模块和第一层模块; 设计中、下层模块。 下面分别讨论。 1. 找出系统的逻辑输入、主加工和逻辑输出部分 如果设计人员经验丰富,又熟悉系统说明书,则容易确定系统的主加工部分。例如,几股数据流的汇合处往往就是系统的主加工部分。若一时不能确定哪是主加工部分,可以用下面的方法先确定哪些数据流是逻辑输入、哪些数据流是逻辑输出。,从物理输入端开始,一步步向系统的中间移动,直至分析到这样一个数据流:它已不能再被看作系统的输入,则它的前一个数据流就是系统的逻辑输入。在图7.22(a)中,从“原始数据”这一数据流开始向中间移动,逐个分析数据流,发现数据流“P3P4”不能再被理解为系统的输入了。因此,数据流“P2P3”是逻辑输入。 同理,从物理输出端开始,逆数据流方向向中间移动,可以确定系统的逻辑输出。 介于逻辑输入、逻辑输出之间的加工就是主加工。图7.22(a)中的处理框P3就是主加工。,当然,实际的数据流图往往比这个例子复杂,输入、输出数据流都可能有多个,这时,需要对每个输入、输出数据流逐个进行分析,确定相应的逻辑输入、逻辑输出。处于这些逻辑输入、逻辑输出之间的处理框就是主加工。主加工可能包括数据流图中的多个处理框。 从上面的分析过程可以看出,逻辑输入、逻辑输出的划分涉及对数据流的理解。各人的理解不同,结果就有差异,但一般出入不会太大。,2. 设计顶层模块和第一层模块 找到主加工之后,遵照“自顶向下,逐步加细”的原则,设计各层的模块。每创建一个模块必须确定该模块的外部特征:模块的功能及与其他模块的界面(调用时传送的信息);为每个模块起一个名字,这个名字应当恰如其分地反映出这个模块的功能。 系统的主加工就是系统的顶层模块,其功能就是整个系统的功能。,第一层模块按输入、变换、输出等分支来处理:为每一个逻辑输入设计一个输入模块,其功能是为顶层模块提供相应的数据;为每一个逻辑输出设计一个输出模块,它的功能是输出顶层模块的输出信息;为主加工设计一个变换模块,它的功能就是将逻辑输入变换成逻辑输出。第一层模块与顶层模块之间传送的数据应该同数据流图相对应。 图7.22(a)有一个逻辑输入,一个逻辑输出,所以对应的结构图第一层模块共三个,即宽度为3。如图7.22(b)所示。,3. 设计中、下层模块 对输入、变换、输出模块逐个分解,便可得到初始结构图。 输入模块为系统提供逻辑输入,一般要进行变换,先确定实现最后变换的变换模块。这个变换模块显然又需要某些输入,对每个这样的输入,对应一个新的输入模块。用类似方法依次分解下去,直到最终的物理输入为止。 对输出模块的分解与上面的方法相似。,对变换模块的分解,目前还没有像上面那样的归纳出的方法,我们只能通过研究数据流图中相应加工的组成情况,应用7.2节介绍的耦合、内聚等概念,得到好的分解。 与图7.22(a)相应的结构图如图7.22(b)所示。 回顾一下7.2.8节“病人监护系统”这个例子,有助于我们理解这里介绍的方法。这个系统的数据流图如图7.23所示。,图7.23 病人监护系统数据流图,“合理数据”可以看作是这个系统的逻辑输入,也是系统的逻辑输出。因此,这个系统没有主加工。由此设计出系统结构图的顶层模块和第一层模块,如图7.24所示。进一步分析便可得到如图7.21所示的结构图。由此可见由数据流图出发,采用变换分析的方法得到的结构图比采用直观理解的方法得到的结构图(图7.15)要好得多。,图7.24 病人监护系统结构图,7.3.2 事务分析 图7.25是事务型结构的例子。在这种结构中,某个加工将它的输入分离成一串平行的数据流,然后分别执行后面的某些加工。对于这种类型的数据流图,可以通过事务分析(transaction Analysis)得到相应的结构图。,事务分析也是按“自顶向下,逐步细化”的原则进行的。先设计主模块,其功能就是整个系统的功能。下面有一个“分析模块”和“调度模块”。前者分析事务的类型,后者根据不同的类型调用相应的下层模块。这样得到与图7.25相应的结构图,如图7.26所示。这里作用范围可能在控制范围之外,从而产生控制耦合。对于不太复杂的系统,可以通过在主模块判别事务类型来解决这一问题。对于复杂的问题,还得分开设模块。,图7.25 事务型结构,图7.26 事务分析,前面我们分别讨论了变换分析和事务分析。在实际应用中,这两种分析方法往往交替使用。数据流图的某一个局部可能是变换型,另一个局部可能是事务型,如此等等。这时,一般以变换分析为主,辅之以事务分析。各个系统有不同的特点,初始结构图的设计方法也不同。凡是满足系统说明书要求的结构图都可以作为初始结构图。这里称之为初始结构图,是因为数据流图并没有完全反映出用户的要求(如查询要求、控制流等),因此,按数据流图导出的结构图还要参照小说明、查询分析等文档进行调整。,7.3.3 数据流图层次的转换 数据流图是分层次的,当我们对某一层数据流图进行变换分析或事务分析得出相应的模块结构图之后,还必须转换它下一层的数据流图。如图7.27所示,如果处理框P1.4对应模块M32,则P1.4进一步分解的处理框应转换成M32的下层模块。 作为一个练习,建议读者根据上一章给出的“学习成绩管理”的数据流图,画出对应的初始结构图,并根据这两节的内容,优化你的初始结构图。,图7.27 数据流图的层次与模块结构,7.4 一体化设计方法,结构化设计方法也有明显的不足。系统的总体设计应包括程序结构和数据结构两个方面,但传统的结构化设计只考虑程序结构方面,而进行数据结构方面的设计需要参考其他方法。事实上,关于数据库设计的许多信息在系统分析阶段已经得到,但没有充分利用。因此,在系统分析阶段与系统设计阶段之间存有“空隙”,没有很平滑地由前一阶段过渡到后一阶段。,一体化方法对传统的结构化方法做了改进,集功能分析、过程设计、数据库设计为一体,充分利用利用系统分析的结果,完成系统功能结构的设计和数据库设计,填补两个开发阶段之间的空隙。,7.4.1 基本概念(1)初等功能 在数据流图中,需要再分解为子功能称为一般功能,不需要再分解的功能称为初等功能。与初等功能联系的数据流称为初等数据流。(2)选单树 在一个规模较大的系统中,需要一系列的屏幕选单引导用户选择需要系统完成的功能。这些选单是按层次组织起来的,称为选单树。从用户角度看,选单树就是系统的总体结构。(3)事务 事务是信息系统可独立完成的一项业务或活动。在数据流图中,一项事务包含由数据流链接的一些基本功能、与这些基本功能联系的数据存储和外部实体。 信息系统由一系列事务组成。系统的所有事务构成信息系统内部的总体结构。,7.4.2 选单树初步设计 选单树设计的目标,是建立与系统功能相应的层次选单。选单树的设计分两阶段进行:第一阶段,从DFD导出一个初始选单树;第二阶段,在事务设计之后,修改、完善选单树。 为了设计初始选单树,需要从顶层数据流图开始,自顶向下考查所有数据流图。为便于对照检查,选单中各行的标号和标题,暂时用对应功能的标号和标题说明。在优化、完善选单树时,再给出更恰当的标号和标题。,7.4.3 事务设计 一项事务由数据流链接的几个初等功能及有关的数据存储、外部实体构成。其中有一个初等功能是该事务的触发者,这可以从初始选单中找到(标有“T”)。由此出发,沿(或逆)数据流找下一个初等功能,依此下去,直到进入数据存储或外部实体,便可找到一项事务的所有成分。这个过程有可能由一张数据流图跨越到其他数据流图上。初始选单树中所有标有“T”的行都完成这种过程后,便可找出系统的全部事务。,事务设计可能影响到数据流图和初始选单树。所以,在事务设计之后,要对选单树进行必要的整理和完善。第一 消除所有蜕化选单屏幕,若这一行前标有“T”,则在其父选单的相应行前标以“”,表示该行是“准选择行”;第二适当改变各行的标号、标题,使之意思更明确。,7.5 代 码 设 计,7.5.1 代码的作用 代码是用来表征客观事物的一个或一组有序的符号,它应易于计算机和人识别与处理。代码也简称为“码”。,编码就是用数字或字母代表事物。编码的历史可以追溯到古代。从古代常用来传递信息的烟信号直到现代的电传打字机,没有代码是难以想象的。这个问题过去不太受重视,今天却成了信息技术的中心问题之一,成为现代化管理的重要基础。通过编码,建立统一的经济信息语言,有利于提高通用化水平,使资源共享,达到统一化;有利于采用集中化措施以节约人力,加快处理速度;有利于检索方法的统一。下面具体介绍代码的功能。,1. 鉴别功能 这是代码最基本的特性。任何代码都必须具备这种基本特性。在一个信息分类编码标准中,一个代码只能惟一地标识一个分类对象,而一个分类对象只能有一个惟一的代码。 2. 分类 当按分类对象的属性(如工艺、材料、用途等)分类,并分别赋予不同的类别代码时,代码又可以作为分类对象类别的标识。这是利用计算机进行分类统计的基础。,3. 排序 当按分类对象产生的时间、所占空间或其他方面的顺序关系分类,并赋予不同的代码时,代码又可以作为区别分类对象排序的标识。 4. 专用含义 当客观需要采用一些专用符号时,代码可提供一定的专门含义,如数学运算的程序,分类对象的技术参数、性能指标等。,7.5.2 代码的种类 代码的种类如图7.39所示。图中列出了最基本的代码。实际应用中,常常根据需要采用两种或两种以上基本代码的组合。下面介绍几种最常用的代码。,图7.39 代码的种类,1. 顺序码 按图7.39的分类,顺序码是一种无实义代码。这种代码只作为分类对象的惟一标识,只代替对象名称,而不提供对象的任何其他信息。 顺序码是一种最简单、最常用的代码。这种代码是将顺序的自然数或字母赋予分类对象。例如“人的性别代码”(GB226180)规定:1为男性,2为女性。 顺序码的优点是代码简短,使用方便,易于管理,易添加,对分类对象无任何特殊规定。缺点是代码本身没有给出对象的任何其他信息。通常非系统化的分类对象常采用顺序码。,2. 矩阵码 矩阵码是一

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论