第1页:软件工程第5章结构化分析与设计
软件工程第5章结构化分析与设计
第2页:结构化方法
结构化方法
- 一种面向数据流的传统软件开发方法
- 以数据流为中心构建软件的分析模型和设计模型
- 分为:
- 结构化分析(Structured Analysis简称SA)
- 结构化设计(Structuresd Design简称SD)
- 结构化程序设计(Structured Programmin简称SP)
第3页:内容摘要
内容摘要
- 结构化分析方法概述
- 数据流图
- 分层数据流图的审查
- 数据字典
- 描述基本加工的小说明
- 结构化设计概述
- 数据流图到软件体系结构的映射
- 初始结构图的改进
- 小结
第4页:内容摘要(续)
内容摘要
- 结构化分析方法概述
- 数据流图
- 分层数据流图的审查
- 数据字典
- 描述基本加工的小说明
- 结构化设计概述
- 数据流图到软件体系结构的映射
- 初始结构图的改进
- 小结
第5页:结构化分析方法
结构化分析方法
- 发展历史
- 提出:20世纪60年代末到70年代初
- 成熟:20世纪70年代末到80年代中期
- 主要思想:抽象与自顶向下的逐层分解(控制复杂性的两个基本手段)
- 抽象:在每个抽象层次上忽略问题的内部复杂性,只关注整个问题与外界的联系
- 分解:将问题不断分解为较小的问题,直到每个最底层的问题都足够简单为止
第6页:结构化分析方法中的抽象与分解
结构化分析方法中的抽象与分解
- 抽象:从作为整体的软件系统开始(第一层),每一抽象层次上只关注于系统的输入输出
- 分解:将系统不断分解为子系统、模块……
- 随着分解层次的增加,抽象的级别越来越低,也越接近问题的解(算法和数据结构)2.42.32.22.121431.31.21.1X
第7页:结构化分析过程
结构化分析过程
- 理解当前的现实环境,获得当前系统的具体模型(物理模型)
- 从当前系统的具体模型抽象出当前系统的逻辑模型
- 分析目标系统与当前系统逻辑上的差别,建立目标系统的逻辑模型
- 为目标系统的逻辑模型作补充
第8页:结构化分析模型的描述
结构化分析模型的描述
- 数据字典是模型的核心,它包含了软件使用和产生所有数据的描述
- 数据流图:用于功能建模,描述系统的输入数据流如何经过一系列的加工变换逐步变换成系统的输出数据流
- 实体
- 关系图:用于数据建模,描述数据字典中数据之间的关系实体-关系图数据流图状态转换图控制规约数据字典加工规约数据对象描述
- 状态转换图:用于行为建模,描述系统接收哪些外部事件,以及在外部事件的作用下的状态迁移情况
第9页:内容摘要
内容摘要
- 结构化分析方法概述
- 数据流图
- 分层数据流图的审查
- 数据字典
- 描述基本加工的小说明
- 结构化设计概述
- 数据流图到软件体系结构的映射
- 初始结构图的改进
- 小结
第10页:数据流图
数据流图
- Data Flow Diagram(简称DFD):描述输入数据流到输出数据流的变换(即加工)过程,用于对系统的功能建模,基本元素包括:数据流(data flow):由一组固定成分的数据组成,代表数据的流动方向加工(process):描述了输入数据流到输出数据流的变换,即将输入数据流加工成输出数据流文件(file):使用文件、数据库等保存某些数据结果供以后使用源或宿(source or sink):由一组固定成分的数据组成,代表数据的流动方向
第11页:源或宿
源或宿
- 存在于软件系统之外的人员或组织,表示软件系统输入数据的来源和输出数据的去向,因此也称为源点和终点
- 考生向系统提供报名单(输入数据流),所以考生是考试系统(软件)的一个源
- 考务处理系统要将考试成绩的统计分析表(输出数据流)传递给考试中心,所以考试中心是该系统的一个宿
- 源或宿用相同的图形符号表示
- 当数据流从该符号流出时表示是源
- 当数据流流向该符号时表示是宿
- 当两者皆有时表示既是源又是宿
第12页:加工和文件
加工和文件
- 加工:描述输入数据流到输出数据流的变换
- 每个加工用一个定义明确的名字标识
- 至少有一个输入数据流和一个输出流
- 可以有多个输入数据流和多个输出数据流
- 文件:保存数据信息的外部单元
- 每个文件用一个定义明确的名字标识
- 由加工进行读写
- DFD中称为文件,但在具体实现时可以用文件系统实现也可以用数据库系统等实现
第13页:数据流
数据流
- 每个数据流用由一组固定成分的数据组成并拥有一个定义明确的名字标识
- 如:运动会管理系统中,报名单(数据流)由队名、姓名、性别、参赛项目等数据组成
- 数据流的流向
- 从一个加工流向另一个加工
- 从加工流向文件(写文件)
- 从文件流向加工(读文件)
- 从源流向加工
- 从加工流向宿
第14页:数据流(续)
示例:图书订购系统DFD图书库存入库单图书代理商书库管理收费制作财务报表财务报表经理帐务数据库制作发书单图书订购核准的订购单发书单订购单顾客顾客收费数据帐单
第15页:数据流图的扩充符号
数据流图的扩充符号
- 描述一个加工的多个数据流之间的关系
- 所有输入数据流同时存在时,才能进行加工处理
- 或加工处理的结果是同时产生所有输出数据流
- 至少存在一个输入数据流时才能进行加工处理
- 或加工处理的结果是至少产生一个输出数据流
- 异或(⊕):表示数据流之间存在“异或”(互斥)关系
- 必须存在且仅存在一个输入数据流时,才能进行加工处理
- 或加工处理的结果是产生且仅产生一个输出数据流
第16页:对数据流图进行分层
对数据流图进行分层
- George Miller在著名的论文“神奇的数字7加减2:我们处理信息的能力的某种限制”中指出:人们在一段时间内的短期记忆似乎限制在5~9件事情之内
- 根据自顶向下逐层分解的思想将数据流图画成层次结构
- 每个层次画在独立的数据流图中,加工个数可大致控制在“7加减2”的范围中
第17页:数据流图的各个层次
数据流图的各个层次
- 顶层图只有代表整个软件系统的1个加工,描述了软件系统与外界(源或宿)之间的数据流
- 顶层图中的加工经分解后的图称为0层图(只有1张)
- 中间层图中至少有一个加工(也可以有多个)在下层图中分解成一张子图
- 处于最底层的图称为底层图,其中所有的加工不再分解成新的子图
第18页:图和加工的编号
图和加工的编号
- 顶层图只有一个代表整个软件系统的加工,该加工不必编号。
- 0层图中的加工编号分别为1,2,3,…
- 子图号:若父图中的加工号x分解成某一子图,则该子图号记为“图x”
- 子图中加工的编号:若父图中的加工号为x的加工分解成某一子图,则该子图中的加工编号分别为x.1、x.2、x.3…
第19页:分层数据流图示例——资格和水
分层数据流图示例——资格和水平考试的考务处理系统
- 简化的资格和水平考试的考务处理系统
- 分成多个级别,如初级程序员、程序员、高级程序员、系统分析员等,凡满足一定条件的考生都可参加某一级别的考试
- 考试的合格标准将根据每年的考试成绩由考试中心确定
- 考试的阅卷由阅卷站进行,因此,阅卷工作不包含在软件系统中
第20页:资格和水平考试的考务处理系统—功能需求
资格和水平考试的考务处理系统—功能需求
- 1.对考生送来的报名单进行检查
- 2.对合格的报名单编好准考证号后将准考证送给考生,并将汇总后的考生名单送给阅卷站
- 3.对阅卷站送来的成绩清单进行检查,并根据考试中心制订的合格标准审定合格者
- 4.制作考生通知单送给考生
- 5.进行成绩分类统计(按地区、年龄、文化程度、职业、考试级别等分类)和试题难度分析,产生统计分析表
第21页:资格和水平考试的考务处理系统
资格和水平考试的考务处理系统—部分数据流的组成
- 报名单=地区+序号+姓名+文化程度+职业+考试级别+通信地址
- 正式报名单=准考证号+报名单
- 准考证=地区+序号+姓名+准考证号+考试级别+考场
- 考生名单={准考证号+考试级别}其中{w}表示w重复多次
- 考生名册=正式报名单
- 统计分析表=分类统计表+难度分析表
- 考生通知单=准考证号+姓名+通信地址+考试级别+考试成绩+合格标志
第22页:系统的输入输出
系统的输入输出(顶层图)
- 确定源或宿:考生、阅卷站和考试中心
- 顶层图唯一的加工:软件系统(考务处理系统)
- 确定数据流:系统的输入/输出信息
- 输入数据流:报名单(来自考生)、成绩清单(来自阅卷站)、合格标准(来自考试中心)
- 输出数据流:准考证(送往考生)、考生名单(送往阅卷站)、考生通知书(送往考生)、统计分析表(送往考试中心)
- 额外的输出流(考虑系统的健壮性):不合格报名单(返回给考生),错误成绩清单(返回给阅卷站)
- 顶层图通常没有文件
第23页:考务处理系统顶层图考务处理系
考务处理系统顶层图考务处理系统考试中心考生不合格报名单阅卷站错误成绩清单成绩清单考生名单合格标准报名单准考证考生通知单统计分析表
第24页:系统内部
系统内部(0层图)-1
- 以下确定加工、数据流、文件、源或宿的一般方法适用于0层图及其各层子图
- 确定加工:将父图中某加工分解而成的子加工
- 根据功能分解来确定加工:将一个复杂的功能分解成若干个较小的功能,较多应用于高层DFD中的分解
- 根据业务处理流程确定加工:分析父图中待分解加工的业务处理流程,业务流程中的每一步都可能是一个子加工
- 特别要注意在业务流程中数据流发生变化或数据流的值发生变化的地方,应该存在一个加工,例如:编制准考证号正式报名单合格报名单
第25页:系统内部(续)
系统内部(0层图)-2
- 确定数据流
- 在父图中某加工分解而成的子图中,父图中相应加工的输入/输出数据流都是且仅是子图边界上的输入/输出数据流
- 分解后的子加工之间应增添相应的新数据流表示加工过程中的中间数据
- 如果某些中间数据需要保存以备后用,那么可以成为流向文件的数据流
- 同一个源或加工可以有多个数据流流向一个加工,如果它们不是一起到达和一起加工的,那么可以将它们分成若干个数据流,例如:读取银行卡信息客户银行卡数据密码
第26页:系统内部
系统内部(0层图)-3
- 确定文件
- 如果父图中该加工存在读写文件的数据流,则相应的文件和数据流都应画在子图中
- 在分解子图中,如果需要保存某些中间数据以备后用,则可以将这些数据组成一个新的文件
- 新文件(首次出现的文件)至少应有一个加工为其写入记录,同时至少存在另一个加工来读该文件的记录
- 注意:从父图中继承下来的文件在子图中可能只对其进行读,或只进行写
第27页:系统内部(续)
系统内部(0层图)-4
- 确定源和宿
- 0层图和其它子图中通常不必画出源和宿
- 有时为了提高可读性,可以将顶层图中的源和宿画在0层图中
- 最终得到考务处理系统0层图
- 根据功能分解方法识别出两个加工:考试报名、统计成绩
- 数据流
- 继承顶层图中的输入数据流和输出数据流
- 定义二个加工之间的数据流:由于这二个加工分别在考试前后进行,因此登记报名单所产生的结果“考生名册”应作为文件保存以便考试后由统计成绩加工引用
第28页:考务处理系统0层图考生名册1
考务处理系统0层图考生名册1考试报名报名单考生名单不合格报名单准考证2统计成绩统计分析表合格标准考生通知单错误成绩清单成绩清单
第29页:加工内部
加工内部(1…n层图)
- 复杂的加工可以继续分解成1张DFD子图
- 分解方法
- 将该加工看作一个小系统,该加工的输入/输出数据流就是这个假设的小系统的输入/输出数据流
- 然后采用画0层图的方法,画出该加工的子图
- 以0层图中加工1(考试报名)为例
- 根据业务处理流程来确定由加工1的分解
- 与加工1相关的业务流程:首先检查考生送来的报名单,然后编准考证号,并产生准考证,最后产生考生名单和考生名册(文件)
第30页:考务处理系统加工1子图
考务处理系统加工1子图
- 3个子加工:检查报名单、编准考证号、登记考生
- “合格报名单”和“正式报名单”是新增加的数据流,其它数据流都是加工1原有的
- 在加工1的分解中没有新的文件产生1.3登记考生考生名单1.2编准考证号准考证正式报名单1.1检查报名单合格报名单报名单不合格报名单考生名册
第31页:考务处理系统加工2子图2
考务处理系统加工2子图2.5分析试题难度难度分析表2.4分类统计成绩分类统计表考生名册2.3制作通知单考生通知单2.2审定合格者正式成绩清单合格标准试题得分清单2.1检查成绩清单成绩清单正确成绩清单错误成绩清单
第32页:考务处理系统加工2子图2(续)
总结:画分层数据流图的步骤
- 1.画系统的输入和输出
- 2.画系统内部
- 3.画加工内部
- 4.重复第3步,直至每个尚未分解的加工都足够简单(即不必再分解)
第33页:内容摘要
内容摘要
- 结构化分析方法概述
- 数据流图
- 分层数据流图的审查
- 数据字典
- 描述基本加工的小说明
- 结构化设计概述
- 数据流图到软件体系结构的映射
- 初始结构图的改进
- 小结
第34页:分层数据流图的审查
分层数据流图的审查
- 检查图中是否存在错误或不合理(不理想)的部分
- 一致性:分层DFD中不存在矛盾和冲突
- 完整性:分层DFD本身的完整性,即是否有遗漏的数据流、加工等元素
- 本节将从分层DFD的一致性和完整性、构造分层DFD时需注意的问题以及分解程度等几个方面来说明如何审查分层DFD的合理性
第35页:分层数据流图的一致性
分层数据流图的一致性
- 父图与子图平衡
- 任何一张DFD子图边界上的输入/输出数据流必须与其父图中对应的加工的输入/输出数据流保持一致
- 数据守恒
- 一个加工所有输出数据流中的数据,必须能从该加工的输入数据流中直接获得,或者能通过该加工的处理而产生
- 多余的数据流:加工未使用其输入数据流中的某些数据项
- 局部文件
- 一个加工的输出数据流不能与该加工的输入数据流同名
第36页:父图与子图不平衡的实例
父图与子图不平衡的实例
- 加工2的输入数据流有M和N,输出数据流是T
- 而子图(右图)边界上的输入数据流是N,输出数据流是S和T123ABCMNT2.12.22.3NPSTQ
第37页:父图与子图平衡的实例
父图与子图平衡的实例
- 注意:如果父图某加工的一个数据流,对应于子图中几个数据流,而子图中组成这些数据流的数据项全体正好等于父图中的这个数据流,那么它们仍算是平衡的e2.52.42.32.22.1b2b1acdb21acde(a)父图(b)子图a:考生通知单;b:统计分析表;b1:分类统计表;b2:难度分析表;c:错误成绩清单;d成绩清单;e合格标准。
第38页:数据不守恒的实例由于“正式成
数据不守恒的实例由于“正式成绩清单”中缺少“考生通知单”中的姓名、通信地址等数据,这些数据也无法由加工2.3自己产生,因此,加工2.3不满足数据守恒的条件考生名册2.5分析试题难度难度分析表2.4分类统计成绩分类统计表2.3制作通知单考生通知单2.2审定合格者正式成绩清单合格标准试题得分清单2.1检查成绩清单成绩清单正确成绩清单错误成绩清单由此可见:1.数据流的组成对DFD是有影响的2.构建DFD与建立数据字典应交替进行,以便于对分层DFD的校验
第39页:局部文件
局部文件
- 考虑分层数据流中一个文件应画在哪些DFD中,而不该画在哪些DFD中
- 任何一个文件都应同时包含读和写该文件的数据流,除非该文件是当前系统与另一个软件系统所共享(应在需求说明中指明)
- 在一张DFD中当一个文件作为若干个加工之间的交界面(一个写另一个读)时该文件应画出
- 在一张DFD中当一个文件仅与一个加工进行读写操作,并且在该DFD的父(祖先)图中未出现过该文件则该文件是相应加工的内部文件,在当前DFD中不应画出
- 一个文件一旦在某张DFD中画出,那么在它的子孙图中应根据父图与子图平衡的原则画出该文件
- 在子孙图中,这个文件可能只有读或写文件中的一种数据流
第40页:局部文件示例“试题得分清单”
局部文件示例“试题得分清单”文件是加工2的局部文件,根据抽象原则不应该将这类表示加工细节的局部文件画在其父图(如图c)中,正确的画法是图a和b21(a)父图考生名册(b)子图2.52.42.32.22.1试题得分清单考生名册(c)含局部文件的父图21试题得分清单考生名册
第41页:加工的输出数据流不能与该加工
加工的输出数据流不能与该加工的输入数据流同名
- 同一个加工的输出数据流和输入数据流即使组成成份相同,仍应对它们取不同的名字,以表示它们是不同数据流
- 允许一个加工有二个相同的数据流分别流向二个不同的加工
第42页:分层数据流图的完整性
分层数据流图的完整性
- 每个加工至少有一个输入数据流和一个输出数据流
- 在整套分层数据流中,每个文件应至少有一个加工读该文件,有另一个加工写该文件
- 分层数据流图中的每个数据流和文件都必须命名(除了流入或流出文件的数据流),并保持与数据字典的一致
- 分层DFD中的每个基本加工(即不再分解子图的加工)都应有一个加工规约
第43页:其它需注意的问题
其它需注意的问题-1
- 适当命名:每个数据流、加工、文件、源和宿都应被适应地命名,名字应符合被命名对象的实际含义
- 名字应反映整个对象(如数据流、加工),而不是仅反映它的某一部分
- 避免使用空洞的、含义不清的名字,如数据、信息、处理、统计等
- 如果发现某个数据流或加工难以命名时,往往是DFD分解不当的征兆,此时应考虑重新分解
- 画数据流而不是画控制流
第44页:其它需注意的问题(续)
其它需注意的问题-2
- 避免一个加工有过多的数据流
- 当一个加工存在许多数据流时往往意味着分解不合理
- 解决办法:重新分解
- 1)把需要重新分解的某张图(含有该复杂加工的图)的所有子图连接成一张图
- 2)把连接后的图重新划分成几个部分,使各部分之间的联系最小
- 3)重新定义父图,即第2)步中的每个部分作为父图中的一个加工
- 4)重新建立各子图,即第2)步中的每个部分都是一张子图
- 5)为所有的加工重新命名和编号
第45页:数据流图重新分解示例
数据流图重新分解示例( b )原加工2子图2.22.12.32.42.5HJICKLEMN(d)重新分解后的父图452′32″1ABHGJICKLDEMFPN( a )原父图34512HABJICKLDEMFPNG(c)合并4532.42.52.22.12.31FABHJICKLDEMPNG
第46页:其它需注意的问题
其它需注意的问题-3
- 分解尽可能均匀
- 理想目标:任何两个加工的分解层数之差不超过1
- 应尽可能使分解均匀,对于分解不均匀的情况应重新分解
- 先考虑稳定状态,忽略琐碎的枝节
- 先考虑稳定状态下的各种问题,暂时不考虑系统如何启动、如何结束、出错处理以及性能等问题
- 随时准备重画
- 对于一个复杂的软件系统,往往要经过反复多次的重画和修改才能构造出完整、合理、满足用户需求的分层DFD
- 分析阶段遗漏下来的一个错误,到开发后期要化费几百倍代价来纠正这个错误
第47页:分解的程度
分解的程度
- 可参照以下几条与分解有关的原则:
- 7加减2
- 分解应自然,概念上合理、清晰
- 只要不影响DFD的易理解性,可适当多分解几个加工,以减少层数
- 一般说来,上层分解得快些(即多分解几个加工),下层分解得慢些(即少分解几个加工)
- 分解要均匀
第48页:内容摘要
内容摘要
- 结构化分析方法概述
- 数据流图
- 分层数据流图的审查
- 数据字典
- 描述基本加工的小说明
- 结构化设计概述
- 数据流图到软件体系结构的映射
- 初始结构图的改进
- 小结
第49页:数据字典
数据字典
- 数据流图与数据字典是密不可分的,两者结合起来构成软件的逻辑模型(分析模型)
- 数据字典由字典条目组成,每个条目描述DFD中的一个元素
- 数据字典条目包括:数据流、文件、数据项(组成数据流和文件的数据)、加工、源或宿
- 加工逻辑的详细说明可以用“小说明”来描述(5.5节)
第50页:数据字典的描述符号举例名称符
数据字典的描述符号举例名称符号x=…表示x由…组成定义为=a+b表示a和b与+[a,b]表示a或b或[…,…][a│b]表示a或b或[…│…]{a}表示a重复0或多次重复{…}{a}表示a重复3到8次重复{…}(a)表示a重复0或1次可选(…)″a″表a是基本数据基本数据元素″…″
第51页:字典条目
字典条目
- 不同的开发组织或团队可以根据项目的需要定义字典条目的描述内容
- 字典条目中的描述内容主要包括
- DFD元素的基本信息(名称、别名、简述、注解)
- 定义(数据类型、数据组成)
- 使用特点(取值范围、使用频率、激发条件)
- 控制信息(来源、去向、访问权限)等
第52页:数据流条目的描述内容
数据流条目的描述内容
- 名称:数据流名(可以是中文名或英文名)
- 别名:名称的另一个名字
- 简述:对数据流的简单说明
- 数据流组成:描述数据流由哪些数据项组成
- 数据流来源:描述数据流从哪个加工或源流出
- 数据流去向:描述数据流流入哪个加工或宿
- 数据量:系统中该数据流的总量
- 如考务处理系统中“报名单”的总量是100000张
- 或者单位时间处理的数据流数量,如80000张/天
- 峰值:某时段处理的最大数量
- 如每天上午9:00至11:00处理60000张表单
- 注解:对该数据流的其它补充说明
第53页:数据流组成
数据流组成
- 数据流组成是数据流条目的核心,它列出组成该数据流的各数据项,例如:
- 培训报名单=姓名+单位+课程
- 运动员报名单=队名+姓名+性别+{参赛项目}
- 当一个数据流的组成比较复杂时,可以将其分解成几个数据流,例如:
- 课程=课程名+任课教师+教材+时间地点
- 时间地点={星期几+第几节+教室}31
第54页:数据流组成示例
数据流组成示例(发票)发票=单位名称+{商品名+数量+单价+金额}+总金额+日期+(营业员)单位名称金额单价数量商品名总金额日期营业员51
第55页:文件条目的描述内容
文件条目的描述内容
- 名称:文件名
- 别名:同数据流条目
- 简述:对文件的简单说明
- 文件组成:描述文件的记录由哪些数据项组成(与数据流条目中的文件组成描述方法相同)
- 写文件的加工:描述哪些加工写文件
- 读文件的加工:描述哪些加工读文件
- 文件组织:描述文件的存储方式(顺序、索引),排序的关键字
- 使用权限:描述各类用户对文件读、写、修改的使用权限
- 数据量:文件的最大记录个数
- 存取频率:描述对该文件的读写频率
- 注解:对该文件的其它补充说明
第56页:数据项条目的描述内容
数据项条目的描述内容
- 名称:数据项名
- 别名:同数据流条目
- 简述:对数据项的简单描述
- 数据类型:描述数据项的类型,如整型、实型、字符串等
- 计量单位:指明数据项值的计量单位,如公斤、吨等
- 取值范围:描述数据项允许的值域,如1…100
- 编辑方式:描述该数据项外部表示的编辑方式,如23,345.67
- 与其它数据项的关系:描述该数据项与数据字典中其它数据项的关系
- 注解:对数据项的其它补充说明
第57页:加工条目的描述内容
加工条目的描述内容
- 名称:加工名
- 别名:同数据流条目
- 加工号:加工在DFD中的编号
- 简述:对加工的功能的简要说明
- 输入数据流:描述加工的输入数据流,包括读哪些文件名
- 输出数据流:描述加工的输出数据流,包括写哪些文件名
- 加工逻辑:简要描述加工逻辑,或者对加工规约的索引
- 基本加工的加工逻辑用小说明描述,在加工条目中可填写对加工规约的索引
- 非基本加工分解而成的DFD子图已反映了它的加工逻辑,不必书写小说明
- 异常处理:描述加工处理过程中可能出现的异常情况,及其处理方式
- 加工激发条件:描述执行加工的条件,如,“身份认证正确”,“收到报名单”
- 执行频率:描述加工的执行频率,如,每月执行一次,每天0点执行
- 注解:对加工的其它补充说明
第58页:源或宿条目的描述内容
源或宿条目的描述内容
- 名称:源或宿的名(外部实体名)
- 别名:同数据流条目
- 简要描述:对源或宿的简要描述(包括指明该外部实体在DFD中是用作“源”,还是“宿”,还是“既是源又是宿”)
- 输入数据流:描述源向系统提供哪些输入数据流
- 输出数据流:描述系统向宿提供哪些输出数据流
- 注解:对源或宿的其它补充说明
第59页:别名条目的描述内容只有那些有
别名条目的描述内容只有那些有必要补充说明的别名才给出相应的别名条目
- 别名:别名的名字
- 类型:指出别名属于那个种类(数据流、文件、数据、加工、源或宿)
- 基本名:别名的正式名称(原名)
- 简述:同正式名称的简述
- 说明:对别名的补充说明示例原始的数据项条目如下:数据项名称:开户日期别名:开设日期简述:客户建立帐户的日期类型:日期注解:年≥1949其别名条目如下:别名:开设日期类型:数据项基本名:开户日期简述:客户建立帐户的日期说明:1986年以后不再使用此别名
第60页:数据字典的实现
数据字典的实现
- 提倡采用专用的软件工具或者常用的实用程序(如,正文编辑程序、电子表格)来建立数据字典的电子文档,其好处是便于字典条目的检索,字典的管理和维护
- 如果数据字典由辅助绘制DFD的工具自动产生的话,那么可以利用数据字典来检查DFD的一致性和完整性,并保持数据字典与DFD的一致
- 如果数据字典是由人工制作的,我们可以为每个字典条目制作一张卡片,所有卡片按字典条目的种类(数据流、文件、加工等)分类成册,每类卡片按某种约定排序
第61页:内容摘要
内容摘要
- 结构化分析方法概述
- 数据流图
- 分层数据流图的审查
- 数据字典
- 描述基本加工的小说明
- 结构化设计概述
- 数据流图到软件体系结构的映射
- 初始结构图的改进
- 小结
第62页:基本加工的小说明
基本加工的小说明
- 小说明是基本加工的规约说明,应精确地描述用户要求一个加工“做什么”
- 包括加工的激发条件、加工逻辑、优先级、执行频率、出错处理等
- 最基本的部分是加工逻辑,即该加工的输出数据流与输入数据流之间的逻辑关系
- 加工逻辑不是对加工的设计,不涉及数据结构、算法实现、编程语言等与设计和实现有关的细节
第63页:加工逻辑的描述方法
加工逻辑的描述方法
- 结构化语言:介于自然语言和形式语言之间的一种半形式语言
- 判定表:适用于加工逻辑包含多个条件,而不同的条件组合需做不同的动作
- 判定树:判定表的变种,它本质上与判定表是相同的,只是表示形式不同
第64页:结构化语言
结构化语言
- 没有严格的语法
- 加工规约分为若干个段落,每个段落可分为内外两层:
- 如结构化英语中可使用if_then_else、while_do、repeat_until、for_do、case等结构
- 允许使用嵌套结构
第65页:“计算信用度”的结构化英语描
“计算信用度”的结构化英语描述Case 1(No Bounced-Checks in Customer Record):Write Exemplary-Customer―Citation to Annual―Summary.Case 2(One Bounced-check):If Yearly―Average―Balance exceeds $ 1000.Remove Bounced―Check from Customer―Record.Otherwise.Recuce Credit―Limit by 10%.Case 3(Multiple Bounced-Checks):For each Bounced―Check.Recuce Credit―Limit by 15%.Set Credit―Rating to Deadbeat.Write Scathing―Comment to Annual―Summary.Write Customer―Name―and―Address to IRS―Enemies―List.
第66页:结构化语言书写加工规约注意事项
结构化语言书写加工规约注意事项
- 语句力求精炼
- 语句必须易读、易理解、无二义
- 主要使用祈使句,祈使句中的动词要明确表达要执行的动作
- 所有名字必须是数据字典中有定义的名字
- 不使用形容词、副词等修饰语
- 不使用含义相同的动词,如“修改”、“修正”等
- 可以使用常用的算术和关系运算符
- 总之要尽可能精确、无二义、简明扼要、易理解
第67页:判定表
判定表
- 判定表的组成元素
- 条件桩(Condition Stub):列出各种条件的对象,如发货单金额,赊欠天数等,每行写一个条件对象
- 条件条目(Conditien entry):列出各条件对象的取值,条件条目的每一列表示了一个可能的条件组合
- 动作桩(action stub):列出所有可能采取的动作,如发出发货单等,每行写一个动作
- 动作条目(action eutry):列出各种条件组合下应采取的动作“审批发货单”加工的判定表≤500≤500>500>500发货单金额≤60>60≤60>60赊欠天数√发不批准通知√√√发出批准书√√√发出发货单√发出赊欠报告
第68页:判定表的其它形式-≤500>
判定表的其它形式-≤500>500发货单金额≤60>60>60赊欠天数√发不批准通知√√发出批准书√√发出发货单√发出赊欠报告1100发货单金额≤5000011发货单金额>5001010赊欠天数≤600101赊欠天数>60√发不批准通知√√√发出批准单√√√发出发货单√发出赊欠报告“审批发货单”加工的简化判定表“审批发货单”加工的另一种判定表
第69页:判定树
判定树
- 本质上与判定表是相同的,只是表示形式不同
- 例如“审批发货单”加工逻辑的判定树描述入下:
第70页:内容摘要
内容摘要
- 结构化分析方法概述
- 数据流图
- 分层数据流图的审查
- 数据字典
- 描述基本加工的小说明
- 结构化设计概述
- 数据流图到软件体系结构的映射
- 初始结构图的改进
- 小结
第71页:结构化设计
结构化设计
- 结构化设计(Structured Design,简称SD)是将结构化分析得到的数据流图映射成软件体系结构的一种设计方法
- 强调模块化、自顶向下逐步求精、信息隐蔽、高内聚低耦合等设计准则
- 分为概要设计和详细设计两大步骤
- 概要设计是对软件系统的总体设计,采用结构化设计方法,其任务是:将系统分解成模块,确定每个模块的功能、接口(模块间传递的数据)及其调用关系,并用模块及其对模块的调用来构建软件的体系结构
- 详细设计是对模块实现细节的设计,采用结构化程序设计(Structured Programming,简称SP)方法
- SA、SD和SP构成完整的结构化方法体系
第72页:结构图
结构图
- 用结构图(Structure Chert)来描述软件系统的体系结构
- 描述一个软件系统由哪些模块组成,以及模块之间的调用关系
- 结构图的基本成分有:模块、调用和数据OQNRUVaa,cbccda,da,dMSffjPTSWghi
第73页:结构图(续)
模块(module)
- 模块是指具有一定功能的可以用模块名调用的一组程序语句,如函数、子程序等
- 它们是组成程序的基本单元
- 一个模块具有其外部特征和内部特征
- 外部特征包括:模块的接口(模块名、输入/输出参数、返回值等)和模块的功能
- 内部特征包括:模块的内部数据和完成其功能的程序代码
- 在SD中,我们只关注模块的外部特征,而忽略其内部特征
第74页:调用和数据
调用和数据
- 调用(call):用从一个模块指向另一个模块的箭头来表示,其含义是前者调用了后者
- 为了方便,有时常用直线替代箭头,此时,表示位于上方的模块调用位于下方的模块
- 数据(data):模块调用时需传递的参数可通过在调用箭头旁附加一个小箭头和数据名来表示
第75页:结构图中的辅助符号DBCA图5
结构图中的辅助符号DBCA图5.20条件调用DBCA图5.21循环调用图5.22递归调用
第76页:结构图的几个概念
结构图的几个概念
- 深度:程序结构图中控制的层数,例如图中所示的结构图的深度是5
- 宽度:程序结构图中同一层次上模块总数的最大值,例如图中所示的结构图的宽度为7
- 扇出(fan out):该模块直接调用的模块数目。例如,例如图中模块M的扇出是3,模块A的是2,模块B的扇出是1
- 扇入(fan in):能直接调用该模块的模块数目。例如图中模块G的扇入是1,模块I的扇入是2,模块R的扇入是4WBKAEHJDGFILCMNOPQR深度宽度扇入扇出
第77页:相关指标的含义
相关指标的含义
- 深度和宽度在一定程序上反映了程序的规模和复杂程度
- 相对而言,如果程序结构图的深度和宽度较大,则说明程序的规模和复杂程度都较大。
- 模块的扇入扇出会影响结构图的深度和宽度,例如减少模块的扇出,可能导致宽度变小而深度增加
- 一个模块的扇出过大通常意味着该模块比较复杂,然而扇出太少,可能导致深度的增加
- 一个模块的扇入表示有多少模块可直接调用它,它反映了该模块的复用(reuse)程度,因此模块的扇入越大越好
第78页:启发式设计策略-1按照模块化设计原则
启发式设计策略-1按照模块化设计原则,相应的启发式设计策略如下:
- 改造程序结构图,降低耦合度,提高内聚度
- 避免高扇出,并随着深度的增加,力求高扇入
- 避免如图a那样的“平铺”形态,较好的结构图形态是如图b那样的“椭圆”型(a)平铺形态(b)椭圆形态
第79页:启发式设计策略
启发式设计策略-2
- 模块的影响范围应限制在该模块的控制范围内,例如下图中
- 图a中,模块B2的影响范围(模块A)不在其控制范围(模块B2)内
- 决策控制是在顶层模块,其影响范围(A、B2)在控制范围内,但是从决策控制模块到被控模块之间相差多个层次
- c和d较合适,d为最好(c)TopXBB1AYB2TopXYABB2B1(d)XBB1YTopXBB1YAB2(a)(b)ATopB2
第80页:启发式设计策略(续)
启发式设计策略-3
- 降低模块接口的复杂程度和冗余程度,提高一致性
- 模块接口上应尽可能传递简单数据,而且传递的数据应保持与模块的功能相一致,即不传递与模块功能无关的数据
- 模块的功能应是可预测的,避免对模块施加过多的限制
- 模块功能可预测是指该模块对相同的输入能产生相同的输出
- 限制一个模块只处理单一的功能,那么,这个模块体现出高内聚
- 尽可能设计单入口和单出口的模块
第81页:结构化设计的步骤
结构化设计的步骤
- 建立初始结构图
- 将整个软件看作一个大的功能模块,通过功能分解不断将其分解成若干个较小的功能模块,直至得到一组不必再分解的模块(结构图中的底层模块)
- 对结构图进行改进
- 可根据设计准则和启发式设计策略对初始结构图进行改进
- 书写设计文档
- 书写设计规格说明,特别要为每个模块书写模块的功能、接口、约束和限制等
- 设计评审
第82页:内容摘要
内容摘要
- 结构化分析方法概述
- 数据流图
- 分层数据流图的审查
- 数据字典
- 描述基本加工的小说明
- 结构化设计概述
- 数据流图到软件体系结构的映射
- 初始结构图的改进
- 小结
第83页:数据流图到软件体系结构的映射
数据流图到软件体系结构的映射
- 结构化设计是将结构化分析的结果(数据流图)映射成软件的体系结构(结构图)
- 信息流:变换流和事务流
- 将数据流图分为变换型数据流图和事务型数据流图,对应的映射分别称为变换分析和事务分析
第84页:变换流
变换流
- 特征:数据流图可明显地分成输入、变换、输出三部分
- 信息沿着输入路径进入系统,并将输入信息的外部形式经过编辑、格式转换、合法性检查、预处理等辅助性加工后变成内部形式
- 内部形式的信息由变换中心进行处理
- 然后沿着输出路径经过格式转换、组成物理块、缓冲处理等辅助性加工后变成输出信息送到系统外外部表示内部表示信息时间变换流输入流输出流
第85页:事务流
事务流
- 特征:数据流沿着输入路径到达一个事务中心,事务中心根据输入数据的类型在若干条动作路径中选择一条来执行
- 事务中心的任务是:接收输入数据(即事务);分析每个事务的类型;根据事务类型选择执行一条动作路径动作路径事务中心输入路径T
第86页:数据流图映射到结构图的步骤
数据流图映射到结构图的步骤
- 复审和精化数据流图
- 确定数据流图的类型(变换型、事务型)
- 将DFD映射成初始结构图:采用变换分析(5.7.3节)或事务分析(5.7.4节)技术,将DFD映射成初始结构图
- 改进初始结构图(5.8节)
第87页:变换分析
变换分析
- 变换分析的任务是将变换型的DFD映射成初始的结构图,步骤如下:
- 划定输入流和输出流的边界,确定变换中心
- 进行第一级分解:将DFD映射成变换型的程序结构
- 进行第二级分解:将DFD中的加工映射成结构图中的一个适当的模块
- 标注输入输出信息:根据DFD,在初始结构图上标注模块之间传递的输入信息和输出信息
第88页:确定输入/出流边界和变换中心
确定输入/出流边界和变换中心-1
- 相关概念:
- 物理输入:指系统输入端的数据流
- 物理输出:指系统输出端的数据流
- 逻辑输入:指变换中心的输入数据流
- 逻辑输出:指变换中心的输出数据流
- 划分可能因人而异,但差别不会太大并可通过以后的结构图改进进行调整
- 有的时候物理输入无须预处理而直接用于系统的加工处理,此时物理输入就是逻辑输入(同样也存在物理输出就是逻辑输出的情况)
第89页:确定输入/出流边界和变换中心(续)
确定输入/出流边界和变换中心-2
- 基本步骤
- 确定逻辑输入:根据DFD从物理输入端开始,一步步向系统的中间移动,可找到离物理输入端最远的,但仍可被看作系统输入的那个(或那些)数据流,就是逻辑输入
- 确定逻辑输出:根据DFD,从物理输出端开始,一步步向系统的中间移动,可找到离物理输出端最远的,但仍可被看作系统输出的那个(或那些)数据流,就是逻辑输出
- 确定变换中心:确定了所有的逻辑输入和逻辑输出后,位于逻辑输入和逻辑输出之间的部分就是变换中心
第90页:确定输入/出流边界和变换中心(续)
示例:统计成绩子图的输入、输出流边界2.7打印难度分析表2.5分析试题难度难度分析结果难度分析表2.6打印分类统计表2.4分类统计成绩分类统计结果分类统计表考生名册2.2审定合格者2.8打印考生通知单2.3产生考生通知信息考生通知信息考生通知单正式成绩清单合格标准2.1检查成绩清单成绩清单正确成绩清单试题得分清单错误成绩清单
第91页:进行第一级分解
进行第一级分解
- 将DFD映射成变换型的程序结构
- 大型的软件系统第一级分解时可多分解几个模块,以减少最终结构图的层次数
- 例如,每条输入或输出路径画一个模块,每个主要变换功能各画一个模块变换型的结构图输入控制模块主控模块输出控制模块变换控制模块“统计成绩”第一级分解的结构图统计成绩输入控制统计成绩统计成绩输出控制统计成绩处理模块
第92页:进行第二级分解
进行第二级分解
- 将DFD中的加工映射成结构图中的一个适当的模块
- 分解步骤如下
- 输入控制模块的分解:从变换中心的边界开始,沿着输入路径向外移动,把输入路径上的每个加工映射成结构图中受输入控制模块控制的一个低层模块
- 输出控制模块的分解:从变换中心的边界开始,沿着输出路径向外移动,把输出路径上的每个加工映射成结构图中受输出控制模块控制的一个低层模块
- 变换控制模块的分解:把变换中心的每个加工映射成结构图中受变换控制模块控制的一个低层模块
第93页:“统计成绩”第二级分解的结构图
“统计成绩”第二级分解的结构图
第94页:事务分析
事务分析
- 将事务型DFD映射成初始的结构图
- 实例:银行业务中有存款、取款、查询余额、开户、转帐等多种事务,这种软件通常是接收一个事务,然后根据事务的类型执行一个事务处理的功能
- 事务型的结构图如图所示,包括:
- 主控模块:完成整个系统的功能
- 接收模块:接收输入数据(事务)
- 发送模块:根据输入事务的类型,选择一个动作路径控制模块
- 动作路径控制模块:完成相应的动作路径所执行的子功能动作路径1控制模块发送模块动作路径n控制模块动作路径2控制模块┄接收模块主控模块
第95页:事务分析的步骤
事务分析的步骤
- 确定事务中心:事务中心位于数条动作路径的起点,这些动作路径呈幅射状从该点流出
- 将DFD映射成事务型的结构图
- 分解每条动作路径所对应的结构图
- 接收模块的分解:从事务中心开始,沿着输入路径向外移动,把输入路径上的每个加工映射成结构图中受接收模块控制的一个低层模块
- 动作路径控制模块的分解:首先确定每条动作路径的流类型(变换流或事务流),然后,运用变换分析或事务分析,将每条动作路径映射成与其流特性相对应的以动作路径控制模块为根模块的结构图
第96页:分层DFD的映射
分层DFD的映射
- 0层图反映了系统由哪些子系统组成,此时可先将0层图映射成下图中的结构
- 0层图每个加工的DFD子图可映射成以相应模块为根模块的结构子图
- 如果DFD子图中的加工还可分解成一张子图,则再将其映射成以相应模块为根模块的结构子图
- 依次一层一层分解下去得到最终的初始结构图
- 如果初始结构图太大,我们也可以将它组织成分层的结构图子系统1系统子系统n子系统2┄
第97页:“考务处理系统”的初始结构图
“考务处理系统”的初始结构图
第98页:内容摘要
内容摘要
- 结构化分析方法概述
- 数据流图
- 分层数据流图的审查
- 数据字典
- 描述基本加工的小说明
- 结构化设计概述
- 数据流图到软件体系结构的映射
- 初始结构图的改进
- 小结
第99页:初始结构图的改进
初始结构图的改进
- 对结构图改进的依据就是观察这种改进是否符合软件设计的准则和启发式设计策略
- 因此结构图的改进没有明显的步骤,也很难定义终止条件
- 设计改进往往伴随着折中
- 例如提取多个模块中的相同功能可以提高模块的独立性和复用程度,但会增加模块间的联系
- 改进往往不是一次完成的,需要进行多次的反复,有时还需要在多个改进方案进行选择
第100页:“考试报名”结构图的改进
“考试报名”结构图的改进-1
- “考试报名”部分的结构图:
- “输入报名单”模块比较简单,可以和“检查报名单”合并
- 将“打印报名单出错信息”模块合并到“检查报名单”模块,降低模块间的耦合度
- 最终三者合并为“输入并检查报名单”输入控制输入并检查报名单10考试报名11,13101011,13输出控制输出考生名单打印准考证1113报名处理编准考证号登记考生1011,121213
第101页:“考试报名”结构图的改进(续)
“考试报名”结构图的改进-2
- 准考证在“编准考证号”模块产生,一直要到“打印准考证”模块才使用,因此可以将二者合并成“编制并打印准考证”
- “登记考生”和“输出考生名单”也可合并成“登记并输出考生名单”输入控制输入并检查报名单10考试报名1010输出控制报名处理编制并打印准考证登记并输出考生名单101212
第102页:“考试报名”结构图的改进
“考试报名”结构图的改进-3
- “输出控制”模块的作用是调用三个输出模块,现在这三个输出模块都合并到其它模块中去了,因此,“输出控制”可以删去
- 对于“输入控制模块”和“报名处理”模块,它们除了调用低层模块并传递参数外,没有其它实质性的工作,这种模块称为管道模块,可以将其删除,其低层模块改由其上层模块调用输入并检查报名单考试报名10登记并输出考生名单编制并打印准考证121012
第103页:“统计成绩”结构图的改进
“统计成绩”结构图的改进-1
- 先将一些比较简单的模块合并到与其功能相一致的模块中,以减少耦合度
- 将“输入成绩清单”、“检查成绩清单”、“打印成绩单出错信息”合并成“输入并检查成绩清单”
- 将“输入合格标准”与“审定合格者”合并,仍取名“审定合格者”,但它包含读入合格标准功能
- 将“产生考生通知单”与“打印考生通知单”合并成“产生并打印考生通知单”统计成绩统计成绩输入控制输入并检查成绩清单226,7统计成绩处理模块审定合格者产生并打印通知单4分析试题难度分类统计成绩267统计成绩输出控制打印分类统计表打印难度分析表676,72
第104页:“统计成绩”结构图的改进(续)
“统计成绩”结构图的改进-2
- 降低模块间的耦合程度
- 将“打印难度分析表”模块和“打印分类统计表”模块分别作为“分析试题难度”模块和“分类统计成绩”模块的下属模块2统计成绩统计成绩输入控制读入并检查成绩清单2统计成绩输出控制2打印分类统计表打印难度分析表统计成绩处理模块审定合格者产生并打印通知单4分析试题难度分类统计成绩267
第105页:“统计成绩”结构图的改进
“统计成绩”结构图的改进-3
- 删去“统计成绩输出控制”
- “统计成绩输入控制”模块和“统计成绩处理模块”均为“管道”模块,也可删去统计成绩22输入并检查成绩清单打印分类统计表打印难度分析表审定合格者产生并打印通知单4分析试题难度分类统计成绩67
第106页:局部改进后的“考务处理系统”
局部改进后的“考务处理系统”结构图考试报名输入并检查报名单10登记并输出考生名单编制并打印准考证121012统计成绩22输入并检查成绩清单打印分类统计表打印难度分析表审定合格者产生并打印通知单4分析试题难度分类统计成绩67考务处理系统
第107页:“考务处理系统”结构图的整体改进
“考务处理系统”结构图的整体改进
- 考虑到分析试题难度和分类统计成绩是相对独立的功能,因此将它们移到主控模块下
- “考试报名”模块和“统计成绩”模块似乎是管道模块,但删去后主控模块“考务处理系统”的扇出就比较大,因此可不删除考试报名输入并检查报名单10登记并输出考生名单编制并打印准考证121012统计成绩22读入并检查成绩清单审定合格者产生并打印通知单4打印分类统计表打印难度分析表分析试题难度分类统计成绩67考务处理系统
第108页:结构图改进技巧
结构图改进技巧
- 减少模块间的耦合度
- 消除重复功能
- 消除“管道”模块
- 模块的大小适中
- 避免高扇出
- 应尽可能研究整张结构图,而不是只考虑其中的一部分高扇出时重新分解(a)高扇出(b)重新分解
第109页:内容摘要
内容摘要
- 结构化分析方法概述
- 数据流图
- 分层数据流图的审查
- 数据字典
- 描述基本加工的小说明
- 结构化设计概述
- 数据流图到软件体系结构的映射
- 初始结构图的改进
- 小结
第110页:内容摘要(续)
小结
- 结构化方法是一种传统的面向数据流开发方法
- 以数据流为中心构建软件的分析模型和设计模型
- 在结构化分析方面,本章介绍结构化分析的基本思想和分析过程,详细介绍了分层数据流图的画法,分层数据流图的审查,数据字典各条目的描述内容以及基本加工小说明的描述方法
- 在结构化设计方面,本章介绍如何将分析的结果(DFD)映射成初始的程序结构图,包括变换分析和事务分析,并介绍对初始结构图的优化