几类主要的软件开发方法:
结构化方法,即SA、SD方法
面向数据结构的软件开发方法
面向对象的软件开发方法
***重点
数据流图Data Flow Diagram(简称DFD)
描述输入数据流到输出数据流的变换(即加工)过程,用于对系统的功能建模,基本元素包括:
资格和水平考试的考务处理系统
功能需求
1.对考生送来的报名单进行检查
2.对合格的报名单编好准考证号后将准考证送给考生,并将汇总后的考生名单送给阅卷站
3.对阅卷站送来的成绩清单进行检查,并根据考试中心制订的合格标准审定合格者
4.制作考生通知单送给考生
5.进行成绩分类统计(按地区、年龄、文化程度、职业、考试级别等分类)和试题难度分析,产生统计分析表
部分数据流的组成
例如,对一个考务处理系统而言
考生向系统提供报名单(输入数据流),所以老生是考试系统(软件)的一个源;
系统向考生发放准考证、考生通知单,所以考生是考试系统(软件)的一个宿;
考务处理系统要将考试成绩的统计分析表(输出数据流)传递给考试中心,所以考试中心是该系统的一个宿;
系统将考生名单给阅卷站,所以阅卷站是该系统的一个宿;
阅卷站将成绩清单返回给系统,所以阅卷站是该系统的一个源。
确定源或宿:考生、阅卷站和考试中心
它们都既是源又是宿
以下确定加工、数据流、文件、源或宿的一般方法适用于0层图及其各层子图
本节将从分层DFD的一致性和完整性、构造分层DFD时需注意的问题以及分解程度等几个方面来说明如何审查分层DFD的合理性
分层数据流图的审查
检查图中是否存在错误或不合理(不理想)的部分
适当命名:每个数据流、加工、文件、源和宿都应被适应地命名,名字应符合被命名对象的实际含义
画数据流而不是画控制流:判断准则:这条线上是否有数据流过
分解尽可能均匀
理想目标:任何两个加工的分解层数之差不超过1
应尽可能使分解均匀,对于分解不均匀的情况应重新分解
先考虑稳定状态,忽略琐碎的枝节
先考虑稳定状态下的各种问题,暂时不考虑系统如何启动、如何结束、出错处理以及性能等问题
随时准备重画
对于一个复杂的软件系统,往往要经过反复多次的重画和修改才能构造出完整、合理、满足用户需求的分层DFD
分析阶段遗漏下来的一个错误,到开发后期要化费几百倍代价来纠正这个错误
名称:文件名
别名:同数据流条目
简述:对文件的简单说明
文件组成:描述文件的记录由哪些数据项组成(与数据流条目中的文件组成描述方法相同)
写文件的加工:描述哪些加工写文件
读文件的加工:描述哪些加工读文件
文件组织:描述文件的存储方式(顺序、索引),排序的关键字
使用权限:描述各类用户对文件读、写、修改的使用权限
数据量:文件的最大记录个数
存取频率:描述对该文件的读写频率
注解:对该文件的其它补充说明
数据项也称数据元素,是数据的最小组成单位。
名称:数据项名
别名:同数据流条目
简述:对数据项的简单描述
数据类型:描述数据项的类型,如整型、实型、字符串等
计量单位:指明数据项值的计量单位,如公斤、吨等
取值范围:描述数据项允许的值域,如1…100
编辑方式:描述该数据项外部表示的编辑方式,如23,345.67
与其它数据项的关系:描述该数据项与数据字典中其它数据项的关系
注解:对数据项的其它补充说明
名称:加工名
别名:同数据流条目
加工号: 加工在DFD中的编号
简述:对加工的功能的简要说明
输入数据流:描述加工的输入数据流,包括读哪些文件
输出数据流:描述加工的输出数据流,包括写哪些文件
加工逻辑:简要描述加工逻辑,或者对加工规约的索引
基本加工的加工逻辑用小说明描述,在加工条目中可填写对加工规约的索引
非基本加工分解而成的DFD子图已反映了它的加工逻辑,不必书写小说明
异常处理:描述加工处理过程中可能出现的异常情况,及其处理方式
加工激发条件:描述执行加工的条件,如,“身份认证正确”,“收到报名单”
执行频率:描述加工的执行频率,如,每月执行一次,每天0点执行
注解:对加工的其它补充说明
名称:源或宿的名称(外部实体名)
别名:同数据流条目
简要描述:对源或宿的简要描述(包括指明该外部实体在DFD中是用作“源”,还是“宿”,还是“既是源又是宿”)
输入数据流:描述源向系统提供哪些输入数据流
输出数据流:描述系统向宿提供哪些输出数据流
注解:对源或宿的其它补充说明
只有那些有必要补充说明的别名才给出相应的别名条目
别名:别名的名字
类型:指出别名属于那个种类(数据流、文件、数据、加工、源或宿)
基本名:别名的正式名称(原名)
简述:同正式名称的简述
说明:对别名的补充说明
提倡采用专用的软件工具或者常用的实用程序(如,正文编辑程序、电子表格)来建立数据字典的电子文档,其好处是便于字典条目的检索,字典的管理和维护
如果数据字典由辅助绘制DFD的工具自动产生的话,那么可以利用数据字典来检查DFD的一致性和完整性,并保持数据字典与DFD的一致
如果数据字典是由人工制作的,我们可以为每个字典条目制作一张卡片,所有卡片按字典条目的种类(数据流、文件、加工等)分类成册,每类卡片按某种约定排序
• 小说明是基本加工的规约说明,应精确地描述用户要求一个加工“做什么”
• 包括加工的激发条件、加工逻辑、优先级、执行频率、出错处理等
• 最基本的部分是加工逻辑,即该加工的输出数据流与输入数据流之间的逻辑关系
• 加工逻辑不是对加工的设计,不涉及数据结构、算法实现、编程语言等与设计和实现有关的细节
用结构图(Structure Chert)来描述软件系统的体系结构
描述一个软件系统由哪些模块组成,以及模块之间的调用关系
结构图的基本成分有:模块、调用和数据
模块(module):指具有一定功能的可以用模块名调用的一组程序语句,如函数、子程序等
它们是组成程序的基本单元
一个模块具有其外部特征和内部特征
在SD中,我们只关注模块的外部特征,而忽略其内部特征
调用(call):用从一个模块指向另一个模块的箭头来表示,其含义是前者调用了后者
为了方便,有时常用直线替代箭头,此时,表示位于上方的模块调用位于下方的模块
数据(data):模块调用时需传递的参数可通过在调用箭头旁附加一个小箭头和数据名来表示
深度:程序结构图中控制的层数,例如图中所示的结构图的深度是5
宽度:程序结构图中同一层次上模块总数的最大值,例如图中所示的结构图的宽度为7
扇出(fan out):该模块直接调用的模块数目。例如,例如图中模块M的扇出是4,模块A的是2,模块B的扇出是1
扇入(fan in):能直接调用该模块的模块数目。例如图中模块G的扇入是1,模块I的扇入是2,模块R的扇入是4
深度和宽度在一定程序上反映了程序的规模和复杂程度
相对而言,如果程序结构图的深度和宽度较大,则说明程序的规模和复杂程度都较大。
模块的扇入扇出会影响结构图的深度和宽度,例如减少模块的扇出,可能导致宽度变小而深度增加
一个模块的扇出过大通常意味着该模块比较复杂,然而扇出太少,可能导致深度的增加
一般情况,一个模块的扇出以3~9为宜
一个模块的扇入表示有多少模块可直接调用它,它反映了该模块的复用(reuse)程度,因此模块的扇入越大越好
顶层扇出较高,中间扇出较少,低层模块高扇入
根据信息流的特点,可将数据流图分为变换型数据流图和事务型数据流图,其对应的映射分别称为变换分析和事务分析
信息流可分为两类:
变换流(transform)
事务流(transaction)
• 对大型系统可以将上述的一个模块画成多个模块(如每个输入/输出通路画一个模块)
• 分解的原则是在完成控制功能,并保持低耦合高内聚的前提下,尽量减少模块数
输入流控制模块的分解:
从变换中心的边界开始,沿着输入通路向外移动,把输入通路上的每个加工映射成程序结构中输入流控制模块的一个低层模快
输出流控制模块的分解:
从变换中心的边界开始,沿着输出通路向外移动,把输出通路上的每个加工映射成程序结构中输出流控制模块的一个低层模快
变换流控制模块的分解:
把变换中心的每个加工映射成受变换控制模块控制的一个低层模块
程序结构的模块名称已隐含了模块的功能,但仍然有必要为每个模块写一个简要的处理说明,应该包括
模块的接口描述(进出模块的信息)
模块的局部信息(局部数据结构)
处理过程陈述,包括主要的判断点和任务;
约束和限制条件(对有关性质和一些特性的简要说明)
第二级分解后得到软件的初始结构图。然后,根据DFD,在初始结构图上标注模块之间传递的输入信息和输出信息
事务中心位于数条动作路径的起点,这些动作路径呈幅射状从该点流出
事务型的结构图如下图,其中:
1)主控模块:完成整个系统的功能
2)接收模块:接收输入数据(事务)
3)发送模块:根据输入事务的类型,选择一个动作路径控制模块
4)动作路径控制模块:完成相应的动作路径所执行的子功能
(1)接收模块的分解
从事务中心开始,沿着输入路径向外移动,把输入路径上的每个加工映射成结构图中受接收模块控制的一个低层模块
(2)动作路径控制模块的分解
首先确定每条动作路径的流类型(变换流或事务流),然后,运用变换分析或事务分析,将每条动作路径映射成与其流特性相对应的以动作路径控制模块为根模块的结构图
系统流程图:反应主体框架
数据流程图:反应数据走向它不考虑时序关系,是业务分析用的,用作详细设计。图中的有向线段表示了数据流
程序流程图:程序逻辑描述程序中控制流的情祝,即程序中处理的执行顺序和执行序列所依赖的条件,图中的有向线段表示的是控制流从一个处理走到下一个处理
系统结构图:反映的是系统中模块的调用关系和层次关系谁调用谁有个先后次序时序关系。图中的有向线段表示调用时程序的控制从调用模块移到被调用模块,并隐含了当调用结束时控制将交回给调用模块
是描绘系统物理模型的传统工具。它的基本思想,是用图掰号以黑含子形式描绘系统里面的每个部件程序文件、数据库,表格、人工过程等),表挞信息在各个部件之间流动的情
况,而不是表标对信息进行加工处理的控过程
程序流程图
体系结构图
可以通过将功能简单的模块合并到与其关系密切的模块中,或调整模块的位置,来减少模块间的参数传递,或避免参数长距离传输,以降低耦合度。
如果二个模块中存在某一相同的功能,应将这个功能从二个模块中分离出来,作为一个独立的模块被二者调用。
“管道”模块通常是应该删除的,除非删除后上层模块的扇出太大。
如果一个模块太大,要考虑将它分成二个模块;如果一个模块太小,可考虑将它合并在与它功能密切相关的模块中。通常一个模块的大小,以其实现代码可书写在1~2页纸(约50~100行)为宜。
一个模块的扇出不宜过大,一般希望控制在7±2范围内。当一个模块的扇出较大时,应考虑重新分解
结构化方法是一种传统的面向数据流开发方法
以数据流为中心构建软件的分析模型和设计模型
在结构化分析方面,本章介绍结构化分析的基本思想和分析过程,详细介绍了分层数据流图的画法,分层数据流图的审查,数据字典各条目的描述内容以及基本加工小说明的描述方法
在结构化设计方面,本章介绍如何将分析的结果(DFD)映射成初始的程序结构图,包括变换分析和事务分析,并介绍对初始结构图的优化