(4)数据流图画法
画数据流图的基本步骤概括地说,就是自外向内,自顶向下,逐层细化,完善求精。具体步骤可按如下来做。
①先找系统的数据源点与汇点。它们是外部实体,由它们确定系统与外界的接口。②找出外部实体的输出数据流与输入数据流。③在图的边上画出系统的外部实体。
④从外部实体的输出数据流(即系统的源点)出发,按照系统的逻辑需要,逐步画出一系列逻辑加工,直到找到外部实体所需的输入数据流(即系统的汇点),形成数据流的封闭。⑤按照下面所给的原则进行检查和修改。
⑥按照上述步骤,再从各加工出发,画出所需的子图。
(5)进行检查和修改的原则
①数据流图上所有图形符号只限于前述四种基本图形元素。②数据流的主图必须包括前述4种基本元素,缺一不可。
③数据流图的主图上的数据流必须封闭在外部实体之间,外部实体可以不只一个。④每个加工至少有一个输入数据流和一个输出数据流。
⑤在数据流图中,需按层给加工框编号。编号表明该加工处在哪一层,以及上下层的父图与子图的对应关系。
⑥任何一个数据流子图必须与它上一层的一个加工对应,两者的输入数据流和输出数据流必须一致。即父图与子图的平衡,它表明了在细化过程中输入与输出不能有丢失和添加。⑦图上每个元素都必须有名字。表明数据流和数据文件是什么数据,加工做什么事情。
⑧数据流图中不可夹带控制流。因为数据流图是实际业务流程的客观映象,说明系统“做什么”而不是要表明系统“如何做”,因此不是系统的执行顺序,不是程序流程图。⑨初画时可以忽略琐碎的细节,以集中精力于主要数据流。
在需求分析期间,有时会要求修改系统的某些方面。使用数据流图可以很容易地把需要修改的区域分离出来。只要清楚地了解穿过要修改区域边界的数据流,就可以为将来的修改做好充分的准备,而且在修改时能够不打乱系统的其他部分。
2.数据词典
数据词典的任务是对于数据流图中出现的所有被命名的图形元素在数据词典中作为一个词条加以定义,使得每一个图形元素的名字都有一个确切的解释。
数据词典中所有的定义应是严密的、精确的,不可有半点含糊,不可有二义性。
(1)数据词典的定义
对在数据流图中每一个命名的图形元素均给予定义,其内容有图形元素的名字、别名或编号、分类、描述、定义、位置等。以下是不同词条应给出的内容。
①数据流词条描述
数据流是数据结构在系统内传播的路径。一个数据流词条应有以下几项内容:
数据流名:
说明:简要介绍作用即它产生的原因和结果。
数据流来源:来自何方。
数据流去向:去向何方。数据流组成:数据结构。
每个数据量:数据量、流通量。
②数据元素词条描述
图中的每一个数据结构都是由数据元素构成的,数据元素是数据处理中最小的,不可再分的单位,它直接反映事物的某一特征。对于这些数据元素也必须在数据词典中给出描述。其描述需要以下信息:
数据元素名
类型:数字(离散值,连续值),文字S(编码类型)。
长度。
取值范围。
相关的数据元素及数据结构。
数据元素的取值可分数字型与文字型。数字型又有离散值与连续值之分。离散值或是枚举的,或是介于上下界的一组数;连续值一般是有取值范围的实数集。对于文字型,需给予编码类型,文字值需加以定义。③数据文件词条描述
数据文件是数据结构保存的地方。一个数据文件词条应有以下几项内容。数据文件名。
简述:存放的是什么数据。输入数据。输出数据。
数据文件组成:数据结构。
存储方式:顺序、直接、关键码。存取频率。
④加工逻辑词条描述
加工比较复杂,它到后来就是一段程序。加工的表达方式有判定表、判定树和结构化英语等等,它们要全部写在一个词条中是有困难的。主要描述有:加工名。
加工编号:反映该加工的层次。简要描述:加工逻辑及功能简述。输入数据流。输出数据流。
加工逻辑:简述加工程序、加工顺序。⑤源点及汇(终)点词条描述
对于一个数据处理系统来说,源点和汇点应当比较少。如果过多就缺少独立性,人—机界面太复杂,这时就要考虑减少,提高系统独立性。定义源点和汇点时,应包括:名称:外部实体名。
简要描述:什么外部实体。有关数据流。数目。
(2)数据词典的使用
在结构化分析的过程中,可以通过名字,方便地查阅数据的定义:同时可按各种要求,随时列出各种表,以满足分析员的需要。还可以按描述内容(或定义)来查询数据的名字,通过检查各个加工的逻辑功能,可以实现和检查在数据与程序之间的一致性和完整性,在以后的设计与实现阶段,以至于到维护阶段。都需要参考数据词典进行设计、修改和查询。
(3)数据结构的描述
在数据词典的编制中,分析员最常用的描述数据结构的方式有定义式和Warnier图。①定义式
在数据流图中,数据流和数据文件都具有一定的数据结构。因此必须以一种清晰、准确、无二义性方式来描述数据结构。
这种定义方法是自顶向下,逐级给出定义式,直到最后给出基本数据元素为止。②Warnier图
Warnier图是表示数据层次结构的一种图工具。它用树形结构描绘数据结构,它还能指出某一类数据或某一数据元素重复出现的次数,并能指明某一特定数据在某一类数据中是否是有条件的出现。在进行软件设计时,从Warnier图入手,能够很容易转换成软件的设计描述。
3.加工逻辑说明
在数据流图中,每一个加工框只简单地写上了一个加工名,这显然不能表达加工的全部内容。随着自顶向下逐层细化,功能越来越具体,加工逻辑也越来越精细。到最底一层,加工逻辑详细到可以实现的程序,因此称为“原子加工”或“基本加工”。如果能够写出每一个基本加工的全部详细逻辑功能,再自底向上综合,就能完成全部逻辑加工。在写基本加工逻辑的说明时,应满足如下的要求:
·对数据流图的每一个基本加工,必须有一个加工逻辑说明;
·加工逻辑说明必须描述基本加工如何把输入数据流变换为输出数据流的加工规则;
·加工逻辑说明必须描述实现加工的策略而不是实现加工的细节。
目前用于写加工逻辑说明的工具有结构化语言、判定表和判定树。下面分别介绍。
(1)结构化语言
结构化语言也称为PDL,是一种介于自然语言和形式化语言之间的半形式化语言。它是在自然语言基础上加了一些限制而得到的语言,是使用有限的词汇和有限的语句来描述加工逻辑。结构化语言的词汇表由英语命令动词、数据词典中定义的名字、有限的自定义词和控制结构关键词IF-THEN-ELSE、WHELE-DO、REPEAT-UNTIL、CASE-OF等组成。其动词的含义要具体,尽可能少用或不用形容词和副词。
语言的正文用基本控制结构进行分割,加工中的操作用自然语言短语来表示。其基本控制结构有简单陈述句结构、判定结构和重复结构。此外在书写时,必须按层次横向向右移行,续行也同样向右移行,对齐。
要了解基本加工逻辑的来龙去脉、在数据流图中的位置、加工的使用情况等有更清楚的了解,一般对结构化英语的描述加一些外层说明。
(2)判定表
在某些数据处理问题中,某数据流图的加工需要依赖于多个逻辑条件的取值,就是说完成这一加工的一组动作是由于某一组条件取值的组合而引发的。这时使用判定表来描述比较合适。下面以“检查发货单”为例,说明判定表的构成。判定表由4个部分组成,双线分割开的4部分是:
条件桩(Condition Stub)———左上部分:列出了各种可能的条件。除去某些问题中对各个条件的先后次序有特定的要求以外,通常判定表中对各条件的先后次序不要求。条件项(Condition Entry)———右上部分:给出各个条件的条件取值的组合。
动作桩(Action Stub):———左下部分:列出了可能采取的动作。这些动作的排列顺序没有限制,但为便于阅读也可令共按适当的顺序排列。
动作项(Action Entry):———右下部分:是和条件项紧密相关的,它指出了在条件项的各种取值的组合情况下一步应采取什么动作。这里将任一条件取值组合及其相应要执行动作作称为规则,它在判定有中是纵贯条件项和动作项的一列。显然,判定表中列出了多少个条件取值的组合,也就有多少条规则,即条件项一动作项有多少列。
在实际使用判定表时,常常先把它化简。如果表中有两条或更多的规则具有相同的动作,并且其条件项之间存在着某些关系,就可设法将它们合并。就是说要执行的动作与第三条件的取值无关,这样,便可将这两条规则合并,合并后的第三条件取值用“—”表示,即与取值无关。类似地,无关条件项“—”,在逻辑上又可包含其他项值,具有相同动作的规则还可以进一步合并。判定表能够把在什么条件下,系统应完成哪些操作,表达得十分清楚、准确、一目了然。这是用语言说明难以准确、清楚表达的,但是用判定表描述循环比较困难。有时,判定表可以和结构化语言结合起来使用。
(3)判定树
判定树也是用来表达加工逻辑的一种工具。有时候它比判定表更直观,用它来描述加工,很容易为用户接受。
没有一种统一的方法来构造判定树,也不可能有统一的方法。因为客观存在是用结构化语言,甚至是自然语言写成的叙述文作为构造树的原始依据的,但可以从中找些规律。首先,应从文字资料中分清哪些是判定条件,哪些是判定做出的结论。
在表达一个基本加工逻辑时,结构化语言、判定表和判定树常常交*使用,互相补充。因为这3种手段各有优缺点。
总之,加工逻辑说明是结构化分析方法的一个组成部分,对每个加工都要加以说明。使用的手段,应当以结构化语言为主,对存在判断问题的加工逻辑,可辅之以判定表和判定树。
4.软件需求说明
软件需求规格说明书包括的主要内容如下:
(1)概述
(2)数据描述①数据流图②数据字典
③系统接口说明④内部接口说明
(3)功能描述①功能②处理说明③设计的限制
(4)性能描述①性能指标②测试种类
③预期的软件响应性能④其它
(5)参考文献目录
(6)附录
其中概述是从系统的角度描述软件的目标和任务。软件需求文档的生成方法有以下两种。
(1)计算机辅助生成:由于需求文档的规模较大,并且需要经常查询、维护,所以使用计算机辅助的软件需求分析工具,来实现软件需求文档的自动生成,是非常有意义的。1977年最先推出了需求陈述语言RSL(RSL中的语句是计算机可以处理的)。同年美国密执安大学开发了PSL/PSA(问题陈述语言/问题陈述分析程序)系统。它是信息系统开发自动化支持环境1SDOS的一个组成部分。其中PSL是用来描述系统的形式语言,它可以对系统需求的一致性进行检查,并可根据开发者的需要,随时生成需求文档。
(2)手工与半手工方式:这种方法难以保证文档质量。半手工方式是利用正文编辑程序及其他实用程序辅助手工方式来生成文档,这类方法难以保证文档的正确性、一致性和完整性。
(四)软件设计
在明确了用户的需求以后,下一步的任务就是对未来的软件系统进行设计。软件设计通常可分为概要设计和详细设计。概要设计的任务是确定软件系统的结构,进行模块划分,确定每个模块的功能、接口以及模块间的调用关系。详细设计的任务是为每个模块设计实现的细节。此外,在概要设计阶段还应对全局数据结构进行设计,详细设计阶段还应对局部数据结构进行设计。有的设计方法不区分概要设计和详细设计,统称为软件设计。
人们在开发过程中,总结出许多软件设计的概念和原则,这些概念和原则对提高软件的设计质量有很大的帮助。
1.抽象
抽象是指忽视一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象是认识复杂问题的过程中人类使用的最有力的思维工具,它抽取出事物的本质特性而暂时不考虑它的细节。
软件工程中从软件定义到软件开发要经历多个阶段,在这个过程中每前进一步都可看作是对软件的抽象层次的一次细化。抽象的最低层次就是实现该软件的源程序代码。在进行模块化设计时可以有多个抽象层次,最高抽象层次的模块用概括的方式叙述问题的解法,较低抽象层次的模块是对较高的抽象层次模块对问题解决描述的细化。过程抽象和数据抽象是常用的两种主要抽象手段。
过程抽象是指任何一个完成明确功能的操作都可被使用者当作单个的实体看待,尽管这个操作实际上可能由一系列更低级的操作来完成。过程抽象常常也称为功能/子功能抽象。例如函数、子程序。
数据抽象定义了数据类型和施加于该类型的操作,并限定了对象值的范围,只能通过使用这些操作修改和观察这些数据,例如抽象数据类型。
2.模块化
模块化是指将一个待开发的软件分解成若干个小的简单的部分———模块,每个模块可独立地开发、测试,最后组装成完整的程序。这是一种复杂问题的“分而治之”的原则,模块化的目的是使程序的结构清晰,容易阅读,容易理解,容易测试,容易修改。
模块是指执行某一特定任务(也可以是实现某一特定的抽象数据类型)的数据结构和程序代码。一个模块有它的外部特征和内部特征。外部特征包括模块的接口(即它的输入/输出参数,引用的全局变量和它需调用的其他模块)和模块的功能,内部特征包括模块的局部数据和实现该模块的程序代码。调用一个模块只需知道它的外部特征,而不必了解其内部特征。
3.信息隐蔽
信息隐蔽是开发整体程序结构时使用的法则,即将每个程序的成分隐蔽或封装在一个单一的设计模块中,定义每一个模块时尽可能少地显露其内部的处理。
在设计时首先列出一些可能发生变化的因素,在划分模块时将一个可能发生变化的因素隐蔽在某个模块的内部,使其他模块与这个因素无关。在这个因素发生变化时,我们只需修改含有这个因素的模块,而与其他模块无关。
隐蔽的对象可以有:什么样的决策、可能修改的决策、数据结构的内部连接以及对它所做的操作细节、内部特征码、与计算机硬件有关的细节等。
信息隐蔽原则对提高软件的可修改性、可测试性和可移植性都有重要的作用。
4.模块独立
模块独立是指每个模块完成一个相对独立的特定子功能,并且与其他模块之间的联系简单。衡量模块独立程序的度量标准有两个:耦合和内聚。耦合是指模块之间联系的紧密程度。耦合度越高则模块的独立性越差。内聚是指模块内部各元素之间联系的紧密程度。例如一个完成多个功能的模块的内聚度就比完成单一功能的模块的内聚度低。内聚度越低模块的独立性越差。因此,模块独立就是希望每个模块都是高内聚低耦合的。
(1)耦合
两个模块之间的耦合方式通常有如下7种,下面按它们的耦合度从低到高的次序依次作介绍。①非直接耦合:非直接耦合是指两个模块没有直接的联系,它们中的任一个都能不依赖于对方而独立地工作。
②数据耦合:数据耦合是指两个模块借助于参数表传递简单数据。
③标记耦合(stamp coupling):当一个数据结构的一部分(如记录的一部分)借助于模块接口被传递时就发生标记耦合。
④控制耦合:控制耦合指两个模块间传递的信息中包含用于控制模块内部逻辑的控制信息。⑤外部耦合:当模块与软件以外的环境有关时就发生外部耦合。例如,输入/输出把一个模块与特定的设备、格式、通信协议耦合在一起。
⑥公共耦合:多个模块引用一全局数据区的模式称为公共耦合。例如FORTRAN语言中的COMMON语句、C语言中的external数据类型、一个磁盘文件等都是全局数据区。⑦内容耦合:内容耦合指两上模块之间出现了下列情况之一:
·一个模块访问另一个模块的内部数据;
·一个模块不通过正常入口转到另一模块的内部;·两个模块有一部分程序代码重叠;
·一个模块有多个入口。
(2)内聚
模块的内聚种类通常可分成7种,下面按内聚度从低到高的次序依次作介绍。
①偶然内聚:如果一个模块完成一组任务,这组任务彼此间即使有关系,其关系也是很松散的,这个模块属于偶然内聚。
②逻辑内聚:如果一个模块完成逻辑上相关的一组任务,这个模块是逻辑内聚的。例如,产生与类型无关的全部输出的模块。
③瞬时内聚(temporal cohesion):如果一个模块所包含的任务必须在同一时间间隔内执行,这个模块属于瞬时内聚。例如初始化模块。
④过程内聚:如果一个模块的处理元素是相关的,而且必须按特定的次序执行,这个模块属于过程内聚。
⑤通信内聚:如果一个模块的所有处理元素集中在一个数据结构的区域上,该模块属于通信内聚。例如,一个模块中的所有处理元素使用同一输入数据。
⑥顺序内聚:如果一个模块的处理元素是相关的,而且必须顺序执行,这个模块属于顺序内聚。⑦功能内聚:如果一个模块完成一个单一的功能,模块中的各部分在此目标下协同工作,而且都是为完成这一功能而不可缺少的,那么这个模块是功能内聚的。