第9章面向数据的设计方法面向数据的设计(datastructured-orienteddesign)方法就是根据问题的数据结构定义一组映射,把问题的数据结构转换为问题解的程序结构。面向数据流的设计来源于程序的模块化和功能分解的概念;而面向数据结构的设计,则侧重于问题的数据结构,把程序结构设计成与问题的数据结构一致,不强调模块定义。模块只是设计过程的副产品,对于模块独立性原则也未过分强调。这种程序结构容易理解,也易于修改。9.1面向数据设计的概念在许多应用领域中,信息有着清晰的层次结构,输入数据、存储信息(即数据库)及输出数据都有各自的组织形式。一般说来,顺序出现的数据可以用顺序控制结构的程序处理;选择出现的数据用分支控制结构的程序处理;重复出现的数据用循环控制结构的程序处理。因此可以根据数据的组织形式确定使用和处理这些数据的程序的组织形式。9.1面向数据设计的概念面向数据的设计就是根据数据结构的表示获得软件表示。本章重点讨论:1.Jackson系统开发方法JacksonSystemDevelopment,简称JSD2.基于结构化数据的系统开发方法DataStructuredSystemDevelopment,简称DSSD9.1面向数据设计的概念JSD方法是Jackson于1989年对软件设计中广为使用的Jackson结构程序设计(JacksonStructuredProgramming,简称JSP)方法的扩展。DSSD方法,也称为Warnier-Orr方法,是对Warnier程序逻辑构造(LogicalConstructionofProgram,简称LCP)方法的扩充,除了设计能力以外,还加强了分析能力。9.1面向数据设计的概念面向数据设计方法一般都包括下列任务:1.确定数据结构特征;2.用顺序、选择和重复三种基本形式表示数据;3.把数据结构表示映射为软件的控制结构;4.用与具体方法配套的设计指南进一步精化控制结构;5.开发软件的过程性描述。9.1面向数据设计的概念JSD和DSSD方法的软件总体结构设计与软件过程性设计的分界并不明显,都能很快地过渡到过程性描述。这也是易于理解和易于维护的重要表现之一。JSD和DSSD也是分析与设计一体化的,本章侧重于讨论与设计有关的技术。面向数据的设计方法,要求信息结构用层次图表示,在软件需求规格说明中与信息域的描述相对应。9.1面向数据设计的概念面向数据的设计方法的适用场合具有明显的层次信息结构的应用:企事业的信息管理系统;系统软件(如操作系统);科学与工程计算;计算机辅助教学;组合问题求解等领域。例如:CAD/CAE/CIM类应用软件。9.2Jackson系统开发方法用JSD方法开发一个软件的步骤:1)标识实体与动作:用与面向对象方法类似的分析技术识别出系统中的实体(包括人、对象、产生或使用信息的组织)和动作(客观世界中影响系统实体的那些事件);2)生成实体结构图:针对每一实体,将影响它的所有动作按发生的时间顺序用Jackson结构图(Jacksondiagrams)表示出来。为了描述时间约束,同一动作必须出现在多张结构图中;用JSD方法开发一个软件的步骤:3)初建系统模型:将实体和动作统一用一个过程模型表示,并定义该模型中的过程与客观世界中的过程之间的联系。所用描述工具为系统规格说明图(SystemSpecificationDiagram,简称SSD);4)扩充功能性过程:在过程模型中扩充交互型功能和信息型功能,分别产生内部输入信息和系统输出信息;5)系统定时:确定实现必须满足的时间约束;6)实现:确定系统中所有软硬件成分,形成一个完整设计方案。前三个步骤主要在需求分析阶段完成,后三步是软件设计的任务。9.2.1JSD分析技术回顾我们曾以大学校园内直达交通车系统USS为例进行需求分析,结果得出“交通车”和“按钮”两实体及其动作对应的实体结构图如下图所示。ShuttleShuttle*bodyStation(i)Arrive(i)°Leave(i)°Arrive(1)ButtonPush*Leave(1)9.2.1JSD分析技术回顾初建系统模型后,得到USS的系统规格说明图(图7-2-4)。其中后缀为“_0”的过程表示客观世界中的过程(或外部过程),后缀为“_1”的过程表示系统模型内的过程(或模型过程)。图7-2-4USS的系统规格说明图Button-1DSShuttle-0Shuttle-1SV数据流联系Button-0状态向量联系9.2.1JSD分析技术回顾将实体结构图与初建系统模型(系统规格说明图)综合起来,可导出目标软件系统中每个过程内部细节的结构正文表示,如6.2.3节过程BUTTON_1和SHUTTLE_1所描述。上述结构正文也可对应地用Jackson结构图表示。图6-2-5是与模型过程SHUTTLE_1的结构正文对应的Jackson结构图。图6-2-5对应于结构正文的结构图Shuttle-1Station(i)*Arrive(1)Leave(1)Shuttle-body1TRANSit-body1wait-body1Transit(i)*Transit(1)*Arrive(i)Leave(i)Wait(1)*TRANSit-bodywait-bodyWait(i)*9.2.2扩充功能性过程这一步骤以初建系统模型为基础,通过数据流和状态向量两种方式将新定义的功能性过程与原有的模型过程联系起来。具体考虑两类功能:1.信息型功能(informationfunction):从模型过程产生的数据流和状态向量中提取信息并生成输出信息。嵌入型功能只需在原有模型过程的结构正文中插入一些操作;2.交互型功能(interactivefunction):监视模型过程的状态向量,在输出结果的同时产生内部输入信息,反过来影响模型化过程的动作。图10-2-1两类功能性过程与系统模型的关系外部过程系统模型信息型功能过程交互型功能过程客观世界系统9.2.2扩充功能性过程假设在交通车上有一块发光板,专门显示车到站的信息,发光板“亮”说明车到站,“暗”说明车离开。此板或亮或暗受LON(i)、LOFF(i)两命令的控制。在过程SHUTTLE_1中可嵌入一个新功能:当交通车到达站(i)时,发出命令LON(i);离开站(i)时,发出命令LOFF(i)。交通车在两站之间往返运行过程中,输出“开关发光板”的命令数据流,图10-2-2为增加这一功能后的SSD,结构正文修改为:9.2.2扩充功能性过程图10-2-2修改后的SSDLAMPCMDS—LampcommandsButton-0BDSVButton-1Shuttle-0Shuttle-1LAMPCMDSSHUTTLE_1seqLON(1)/*控制发光板“亮”,说明交通车正停在站1上*/read状态向量WAIT_BODY1itrwhileWait(1)read状态向量WAIT_BODY1endLOFF(1)/*交通车即将离站;控制发光板“暗”*/LEAVE(1)TRANSIT_BODY1itrwhileTransit(1)read状态向量TRANSIT_BODY1endSHUTTLE_BODY1itrSTATIONseqARRIVE(i)LON(i)/*交通车已停靠站(i)*/WAIT_BODYitrwhileWait(i)read状态向量WAIT_BODYendLOFF(i)/*交通车将离开站(i)*/LEAVE(i)TRANSIT_BODYitrwhileTransit(i)read状态向量TRANSIT_BODYendSTATIONendSHUTTL_BODY1endARRIVE(1)SHUTTL_1end9.2.2扩充功能性过程第二个功能是产生关于启动(START)和关闭(STOP)发动机的命令,以此控制交通车的运行。下达STOP命令的条件是,传感器显示车已到站,而下达START命令的条件是乘客压下按钮招呼交通车并恰好交通车在某个站上等待。为此引入一个功能性过程mcontrol,它从SHUTTLE_1和BUTTON_2两过程接收数据,适时地发出START和STOP两种命令。过程SHUTTLE_1与过程mcontrol之间用数据流“S1D”连接。因此SHUTTLE_1的结构正文进一步修改为:SHUTTLE_1seqLON(1)read状态向量WAIT_BODY1itrwhileWait(1)read状态向量WAIT_BODY1endLOFF(1)LEAVE(1)TRANSIT_BODY1itrwhileTransit(1)read状态向量TRANSIT_BODY1endSHUTTLE_BODY1itrSTATIONseqARRIVE(i)writearrivetoS1D/*向mcontrol发送数据流,说明车已到站(i)*/LON(i)WAIT_BODYitrwhileWait(i)read状态向量WAIT_BODYendLOFF(i)LEAVE(i)TRANSIT_BODYitrwhileTransit(i)read状态向量TRANSIT_BODYendSTATIONendSHUTTLE_BODY1endARRIVE(1)writearrivetoS1D/*发送数据流,说明车已到站1*/SHUTTLE_1end9.2.2扩充功能性过程过程SHUTTLE_1执行“read状态向量”操作和过程mcontrol对“S1D”的访问都必须有足够快的频率,否则交通车将不能及时停下来。为完成USS实例,还需进一步考虑实体BUTTON模型。过程BUTTON_1是对按钮动作的精确描述(即每次压下都对应过程push的一次调用),实际上系统应把第一次压下按钮招呼交通车的动作与一次运行未开始之前乘客压下按钮招呼交通车的请求区分开来。用已有实体无法描述和区分动作之间的时间约束,常常引入额外的实体——为此设计过程BUTTON_2,结构图如图10-2-3所示图10-2-3button-2的结构图Button-2Pushgroup*ExtraArrivalbodyExtrapushbodyRequestpushArrivalExtraArrival*Extrapush*9.2.2扩充功能性过程功能性过程mcontrol既负责检查BUTTON_2的状态向量“B2V”,确定是否有未满足的请求,又负责把从SHUTTLE_1处(S1D)获取的信息(即交通车已到达发出请求的车站)传递给BUTTON_2(MBD流)。在此定义了一个交互型功能。BUTTON_2的结构正文描述如下:BUTTON_2seqrequest:=no/*置初值*/readMBDandB1D/*检查是否有未满足请求和交通车是否停在站上*/BUTTON_BODYitrPUSH_GROUPseqEXTRA_AR_BODYitrwhile(ARRIVAL)/*交通车已靠站但尚无请求,或既无请求交通车也未靠站*/readMBDandB1DEXTRA_AR_BODYendRQ_PUSHseq/*首次请求到达,置请求标志*/request:=yesreadMBDandB1DRQ_PUSHendEXTRA_RQ_PUSHitrwhile(REQUEST)/*因交通车尚未靠站,请求暂不满足,循环等待*/readMBDandB1DEXTRA_RQ_PUSHendARRIVALseq/*请求满足,清请求标志*/request:=noreadMBDandB1DARRIVALendPUSHGROUPendBUTTON_BODYendBUTTON_2end9.2.2扩充功能性过程图10-2-4给出的系统规格说明图反映了在此步骤完成的所有工作。我们在SHUTTLE_1中嵌入了一个功能,产生开、关发光板的命令,增加了一个功能性过程mcontrol,它除了负责完成BUTTON_2上的交互型功能外,还产生启动、关闭发动机的命令。至于mcontrol过程的内部结构可采用传统的JSP技术导出,关于JSP技术我们将在9.2.4和9.2.5节讨论。图10-2