结构化软件开发过程的平稳过渡
结构化软件开发过程的平稳过渡
陈家骏 郑国梁
南京大学计算机科学与技术系,南京 210093
摘 要
本文提出了实现结构化软件开发过程平稳过渡的一种策略,使得结构化软件开发能够平稳地从需求过渡到设计、从设计过渡到实现,并且提高软件结构对需求变化的适应性。另外,对软件系统所需数据(库)的设计进行了考虑。
关键词:结构化方法,CASE,数据库
一、前言
随着计算机硬件功能的不断提高, 价格的不断降低, 造成计算机应用领域的不断扩大,社会对计算机软件的需求也越来越大。相反,软件的发展却不尽人意, 这主要体现在:软件开发周期长,生产率低以及软件质量难以保证, 出现了所谓的“软件危机”。为了解决软件的这些问题,软件工程应运而生,即用工程化的方法来开发软件。围绕软件开发,出现了许多支持软件开发的方法,如: 结构化方法、JSD方法以及目前流行的面向对象的方法等等。实践表明: 一个方法如果没有相应软件工具的支持,是难以实用的,因此,支持各种软件开发方法的软件工具相继出现。早期的软件工具只是针对软件开发的某个阶段提供帮 助,并不能对软件开发全过程给出连续、一致地支持,因此,支持各种软件开发方法的CASE环境出现了。
在从多的软件开发方法中,结构化方法[]以其概念简单、实用和开发效率高[],受到许多软件开发者的青睐。目前,大多数 的软件开发人员仍然采用结构化方法来开发大型软件。但是,结构化方法也有其不足之处,其中,最突出的是:用结构化方法开发软件,所涉及到的问题空间(用户 需求)与解题空间(软件的设计与实现)相差较大,这主要体现在: 一、从需求说明到软件设计的过渡比较困难;二、当问题需求作了修改,往往会造成软件结构较大的变动。另外, 结构化方法主要针对软件系统功能的设计,对数据(库)的设计支持较少。针对结构化方法的这些问题,本文提出了一种解决方案,即,在我们开发的JS- CASE环境中,提供设施来缓解结构化方法的这些不足,实现从分析到设计、从设计到实现的平稳过渡。本文下面将描述JS-CASE对结构化开发方法提供连 续、一致的支持策略。
二、从需求分析到概要设计的过渡
用结构化分析方法进行系统需求分析,可得到一组数据流图(DFD) 和一部数据词典(DD)[],其中,DFD描述了系统的功能及系统中数据的流动,为了便于描述复杂问题,往往采用一组分层的DFD来表示,它体现了抽象原则,这样,在一幅DFD不致于包含过多的信息; DD给出了DFD中每个元素(数据、文件及加工等)的定义。DFD及DD给出了问题的描述,代表了问题空间。
用结构化设计方法进行软件系统的设计,可得到一组模块构图(SC)和相应的模块说明书(MSP)[]。其中,SC描述软 件系统由哪些模块构成以及各模块之间的调用关系,为了便于设计和与问题空间对应,可采用分层的SC来表示;MSP描述了SC中每个模块的功能。SC与 MSP给出了解题方案,代表了解题空间。
为了实现从结构化分析到结构化设计的平稳过渡。[]提出了变换分析与事务分析技术,把用结构化分析得到的DFD及DD转换成初始的SC及MSP,作为结构化设计的依据。在结构化设计阶段,可采用内聚性最大和偶合度最小的原则,对初始的SC及MSP进行一步设计。
然而,传统方法存在以下的不足:一、没有提供从分层DFD到分层SC的转换策略;二、缺少对数据(库)设计的支持。为此,我们提出了如下的解决方案:
对用结构化分析得到的分层DFD,采用变换分析与事务分析技术逐个进行转换,得到一组分层的SC,各层SC之间的关系与各层DFD之间的关系相对应, 同时,在每个DFD的每个加工与转换得到的每个SC中的每个模块之间,建立联系(追踪信息), 该联系描述了某个SC是由哪一个DFD转换而来, 以及某个SC 中的某个模块是由哪一个DFD中的哪一个加工转换而来。当修改了某个DFD或某个加工, 就能立即找到受影响的几个SC或模块, 这样,不之于造成整个SC的改变,从而提高软件结构对问题变动的适应性。另外,转换过程把DFD及DD中有关加工的描述(小说明)自动带入每个模块的说明书中, 供详细设计参考使用。
从DFD导出初始SC时,顶层DFD与子(下层)DFD的处理是不同的。从顶层DFD转换出的SC中,包含最外层数据流的get与put模块;从子DFD转换出的SC中,不包含最外层数据流的get与put模块,相应数据是从上层SC传下来的。下面给出具体的转换策略:
(1)对于变换型的DFD:
若为顶层图,可转换成下述的SC: 若为子图,可转换成下述的SC:
(2)对于事务型的DFD
若为顶层图,可转换成下述的SC: 若为子图,可转换成下述的SC:
(3)对于下面的二个DFD,MAIN为顶层图,B为MAIN中加工B的子图
可转换成下面的二个SC:MAIN与B
从DFD到SC的转换,只反映了系统功能设计的获取,并没有涉及软件系统所需数据的设计。在DFD中,除了包含加工与数 据流外,还包括文件,这里的文件一般属于记录式文件,它们与关系模型中的关系(表格)有相似之处。因此,可以把DFD 中的文件提取出来,加上DD中关于每个文件的定义,构成一个原始的关系模型。DFD中的每个文件在这里就成为一个个关系。当然,这个原始的关系模型一般不 符合关系代数中范式的要求,它包含了很多的数据冗余和不一致性。在数据库设计中,可以把它作为依据,参照关系代数的范式理论,对其作进一步设计(如:对原 关系进行分解或合并),最终可得到一个规范的关系模型。在该模型中, 有些关系就是原来的文件,有些可能是由原来的文件分解或合并而来。这样, 原来的文件可看成是由该关系模型通过关系运算得到。
三、从详细设计到实现的过渡
在详细设计阶段,我们的CASE环境提供PDL/C详细设计语言,对概要设计所得到的SC中每个模块的功能进行进一步设计。该PDL/C语言采用了与C语言相类似的语法结构, 其中, 可包含自然语言语句。利用本CASE环境所提供的结构编辑器,可对PDL/C程序进行结构化编辑, 它包括精化与隐藏功能。原始的PDL/C 程序可由模块说明书自动产生, 通过对其中自然语言成份不断地精化,最终可得到符合C语言语法的PDL/C 程序。
对得到的PDL/C程序,本CASE环境提供PDL/C到C的自动转换工具, 该工具对PDL/C程序进行C语言语法检查,对符合C语言语法的PDL/C程序,自动转换成C程序,不符合的,指出待精化的位置。另外,该转换工具可根据 模块结构图,自动产生C程序模块的接口信息以及生成可执行程序所需的Makefile文件。除顶层模块外,对其它模块都自动产生.c与.h文件,顶层模块 只产生.c文件。例如, 对应下面的模块结构图:
可得到七个C程序模块文件:A.c, B.h, B.c, C.h, C.c, D.h,和D.c,其中,对于每个.c文件中自动生成#include语句,如:对A.c件中,包含:
#include "B.h"
#include "C.h"
对于每个.h文件,自动生成被上层模块调用的函数原型, 该函数一般来说与模块名相同,如: 在B.h中,包含:
result_type B(param_type1, param_type2,...);
同时,系统可根据被开发软件的运行环境(DOS或UNlX)自动产生生成可执行文件所需的Makefile文件,例如,产生DOS环境中Borlandc的Makefile具有下述形式。
A.EXE: A.obj B.obj C.obj D.obj
BCC -e A.exe A.obj B.obj C.obj D.obj
A.obj: A.c B.h C.h
BCC -c A.c
B.obj: B.c D.h
BCC -c B.c
C.obj: C.c
BCC -c C.c
D.obj: D.c
BCC -c D.c
对概要设计阶段得到的数据库关系模型,JS-CASE提供抽象的数据描述与操纵语言,用于对关系模型进行形式化描述,以 便进一步设计。最终结果可自动转换到某种数据库管理系统(如:INFORMIX、ORACLE等)的实现描述。由于大多数数据库管理系统提供了属主(嵌 入)方式的实现(函数),因此,对数据库的操作可并入属主语言(如:C)中。
四、结束语
本文提出的结构化软件开发过程平稳过渡的思想,已用于我们开发的JS-CASE环境中,该CASE环境对结构化软件开发 过程各个阶段提供软件工具支持,包括:DFD及DD的编辑、DFD平衡检查、SC及MSP的编辑、DFD及DD到SC及MSP的自动转换、初始关系模型的 生成及设计、PDL/C程序的自动生成与编辑、PDL/C到C程序的转换与Makefile生成、PAD及NS详细设计工具以及测试与评测等等,这些工具 与系统中的中心数据库、对象管理、项目工程管理及软件配置管理一起构成了一个集成化的CASE环境。JS-CASE属江苏省八·五攻关项目,目前已通过江 苏省科委组织的技术鉴定,处于国内领先地位。从用JS-CASE开发的几个应用来看,JS-CASE对提高软件开发效率及软件质量,提供了强有力的支持。
浙公网安备 33010602011771号