1、1. 软件工程钱乐秋等 清华大学出版社2.软件工程导论(第四版),张海藩主编,清华大学出版社,2003年。3.面向对象与经典软件工程(第5版)(英文影印版),(美)Stephen R.Schach主编,机械工业出版社,2002年。课 型理论课学时分配复 习 5 分钟主要教具多媒体讲 授 35 分钟教学方法多媒体课件指 导 2 分钟教学手段讲授结合实例总 结 3 分钟备注授课:双周周三34,每周周五34,轻化B507 答疑:每周四78节,机电C415学时分配:指本章节每节课(45分钟)的平均分配情况一、结构化分析概述1. 主要思想: 抽象: 从作为整体的软件系统开始, 每一抽象层次上只关注于系统
2、的输入输出 分解: 自顶向下逐层分解, 不断分解为子系统, 模块 随着分解层次的增加,抽象的级别越来越低,也越接近问题的解( 算法和数据结构)2. 结构化分析过程 获得当前系统的具体模型(物理模型) 抽象出当前系统的逻辑模型 分析建立目标系统的逻辑模型 为目标系统的逻辑模型作补充3. 结构化分析模型 DD:核心,包含所有数据的描述 DFD:用于功能建模,描述系统的输入数据流如何经过一系列的加工变换逐步变换成系统的输出数据流 ERD:用于数据建模,描述DD中数据之间的关系 状态转换图:用于行为建模,描述系统接收哪些外部事件,以及在外部事件的作用下的状态迁移情况二、数据流图1. Data Flow
3、 Diagram(简称DFD): 描述输入数据流到输出数据流的变换(即加工)过程,用于对系统的功能建模。 基本元素包括:p88图示例:图书订购系统DFD 数据流图的扩充符号:描述一个加工的多个数据流之间的关系 星号():表示数据流之间存在“与”关系 加号():表示数据流之间存在“或”关系 异或():表示数据流之间存在“异或”(互斥)关系2. 对数据流图进行分层 George Miller在著名的论文“神奇的数字7加减2:我们处理信息的能力的某种限制”中指出:人们在一段时间内的短期记忆似乎限制在59件事情之内 根据自顶向下逐层分解的思想将数据流图画成层次结构 每个层次画在独立的数据流图中,加工个
4、数可大致控制在“7加减2”的范围中3. 数据流图的各个层次 顶层图只有代表整个软件系统的1个加工,描述了软件系统与外界(源或宿)之间的数据流 顶层图中的加工经分解后的图称为0层图(只有1张) 中间层图中至少有一个加工(也可以有多个)在下层图中分解成一张子图 处于最底层的图称为底层图,其中所有的加工不再分解成新的子图4. 图和加工的编号 顶层图只有一个代表整个软件系统的加工,该加工不必编号。 0层图中的加工编号分别为1,2,3, 子图号:若父图中的加工号x分解成某一子图,则该子图号记为“图x” 子图中加工的编号:若父图中的加工号为x的加工分解成某一子图,则该子图中的加工编号分别为x.1、x.2、
5、x.35. 分层数据流图画法示例资格和水平考试的考务处理系统 简化的资格和水平考试的考务处理系统 分成多个级别,如初级程序员、程序员、高级程序员、系统分析员等,凡满足一定条件的考生都可参加某一级别的考试 考试的合格标准将根据每年的考试成绩由考试中心确定 考试的阅卷由阅卷站进行,因此,阅卷工作不包含在软件系统中资格和水平考试的考务处理系统功能需求1). 对考生送来的报名单进行检查2). 对合格的报名单编好准考证号后将准考证送给考生,并将汇总后的考生名单送给阅卷站3). 对阅卷站送来的成绩清单进行检查,并根据考试中心制订的合格标准审定合格者4). 制作考生通知单送给考生5). 进行成绩分类统计(按
6、地区、年龄、文化程度、职业、考试级别等分类)和试题难度分析,产生统计分析表部分数据流的组成 报名单地区序号姓名文化程度职业考试级别通信地址 正式报名单准考证号报名单 准考证地区序号姓名准考证号考试级别考场 考生名单准考证号考试级别,其中w表示w重复多次 考生名册正式报名单 统计分析表分类统计表难度分析表 考生通知单准考证号姓名通信地址考试级别考试成绩合格标志(1).画系统顶层图确定源或宿 确定加工 确定数据流 顶层图通常没有文件(2).画系统0层图 以下确定加工、数据流、文件、源或宿的一般方法适用于0层图及其各层子图 确定加工:指父图中某加工分解的子加工 根据功能分解来确定加工:将一个复杂的功
7、能分解成若干个较小的功能,较多应用于高层DFD中的分解 根据业务处理流程确定加工:父图中待分解加工的业务处理流程中的每一步都可能是一个子加工,较多应用于低层DFD中的分解 特别要注意在业务流程中数据流发生变化或数据流的值发生变化的地方,应该存在一个加工,例如:图5.6 确定数据流 在父图中某加工分解而成的子图中,父图中相应加工的输入/输出数据流都是且仅是子图边界上的输入/输出数据流 分解后的子加工之间应增添相应的新数据流表示加工过程中的中间数据 如果某些中间数据需要保存以备后用,那么可以成为流向文件的数据流 同一个源或加工可以有多个数据流流向一个加工,如果它们不是一起到达和一起加工的,那么可以
8、将它们分成若干个数据流,例如:图5.7 确定文件 如果父图中该加工存在读写文件的数据流 ,则相应的文件和数据流都应画在子图中 在分解子图中,如需要保存某些中间数据以备后用,则可将这些数据组成一个新文件 新文件( 首次出现的文件) 至少应有一个加工为其写入记录,同时至少存在另一个加工来读该文件的记录 注意:从父图中继承下来的文件在子图中可能只对其进行读,或只进行写 确定源和宿 0层图和其它子图中通常不必画出源和宿 有时为了提高可读性,可以将顶层图中的源和宿画在0层图中 案例分析:最终得到考务处理系统0 层图 根据功能分解方法识别出两个加工:考试报名、统计成绩 数据流 继承顶层图中的输入数据流和输
9、出数据流 定义二个加工之间的数据流:由于这二个加工分别在考试前后进行,因此登记报名单所产生的结果“考生名册”应作为文件保存以便考试后由统计成绩加工引用(3).加工细化(1n层图) 复杂的加工可以继续分解成1张DFD子图,分解方法 将该加工看作一个小系统,该加工的输入/输出数据流就是这个假设的小系统的输入/输出数据流 然后采用画0层图的方法,画出该加工的子图 以0层图中加工1(考试报名)为例 根据业务处理流程 来确定由加工1 的分解 与加工1 相关的业务流程:首先检查考生送来的报名单,然后编准考证号,并产生准考证,最后产生考生名单和考生名册( 文件) 加工1(考试报名)子图 3个子加工:检查报名
10、单、编准考证号、登记考生 “合格报名单”和“正式报名单”是新增加的数据流,其它数据流都是加工1原有的 在加工1的分解中没有新的文件产生 加工2(统计成绩)子图总结:画分层数据流图的步骤 1画系统的输入和输出,得顶层图 2画系统内部,得0层图 3画加工内部,得到各级子图 4重复第3步,直至每个尚未分解的加工都足够简单(即不必再分解)三、分层数据流图的审查 分层数据流图的一致性和完整性 一致性:分层DFD中不存在矛盾和冲突 完整性:分层DFD本身的完整性,即是否有遗漏的数据流、加工等元素 需注意的问题 分解的程度1.分层数据流图的一致性1). 父图与子图平衡:任何一张DFD子图边界上的输入/输出数
11、据流必须与其父图中对应的加工的输入/输出数据流保持一致2). 数据守恒 一个加工所有输出数据流中的数据,必须能从该加工的输入数据流中直接获得,或者能通过该加工的处理而产生 多余的数据流:加工未使用其输入数据流中的某些数据项 3). 局部文件:考虑分层数据流中一个文件应画在哪些DFD中,而不该画在哪些DFD中 任何一个文件都应同时包含读和写该文件的数据流,除非该文件是当前系统与另一个软件系统所共享(应在需求说明中指明) 在一张DFD中当一个文件作为若干个加工之间的交界面(一个写另一个读)时该文件应画出 在一张DFD中当一个文件仅与一个加工进行读写操作,并且在该DFD的父(祖先)图中未出现过该文件
12、则该文件是相应加工的内部文件,在当前DFD中不应画出 一个文件一旦在某张DFD中画出,那么在它的子孙图中应根据父图与子图平衡的原则画出该文件 在子孙图中,这个文件可能只有读或写文件中的一种数据流4). 一个加工的输出数据流不能与该加工的输入数据流同名案例分析: 父图与子图不平衡的实例:加工2的输入数据流有M和N,输出数据流是T;而子图(右图)边界上的输入数据流是N,输出数据流是S和T 父图与子图平衡的实例:如果父图某加工的一个数据流,对应于子图中几个数据流,而子图中组成这些数据流的数据项全体正好等于父图中的这个数据流,那么它们仍算是平衡的 数据不守恒的实例:由于“正式成绩清单”中缺少“考生通知
13、单”中的姓名、通信地址等数据,这些数据也无法由加工2.3自己产生,因此,加工2.3不满足数据守恒的条件 局部文件示例:“试题得分清单”文件是加工2的局部文件,根据抽象原则不应该将这类表示加工细节的局部文件画在其父图(如图c)中,正确的画法是图a和b2.分层数据流图的完整性 每个加工至少有一个输入数据流和一个输出数据流 在整套分层数据流中,每个文件应至少有一个加工读该文件,有另一个加工写该文件 分层数据流图中的每个数据流和文件都必须命名(除了流入或流出文件的数据流),并保持与数据字典的一致 分层DFD中的每个基本加工(即不再分解子图的加工)都应有一个加工规约3.构造分层DFD需注意的问题 适当命
14、名 画数据流而不是画控制流:判断准则:这条线上是否有数据流过 避免一个加工有过多的数据流: 当一个加工存在许多数据流时往往意味着分解不合理 解决办法:重新分解 1)把需重新分解的某张图(含有该复杂加工的图)的所有子图连接成一张图 2)把连接后的图重新划分成几个部分,使各部分之间的联系最小 3)重新定义父图,即第2)步中的每个部分作为父图中的一个加工 4)重新建立各子图,即第2)步中的每个部分都是一张子图 5)为所有的加工重新命名和编号 分解尽可能均匀 理想目标:任何两个加工的分解层数之差不超过1 应尽可能使分解均匀,对于分解不均匀的情况应重新分解 先考虑稳定状态,忽略琐碎的枝节:先考虑稳定状态
15、下的各种问题,暂时不考虑系统如何启动、如何结束、出错处理以及性能等问题 随时准备重画:对于一个复杂的软件系统,往往要经过反复多次的重画和修改才能构造出完整、合理、满足用户需求的分层DFD4.分解的程度 可参照以下几条与分解有关的原则: 7加减2 分解应自然,概念上合理、清晰 只要不影响DFD的易理解性,可适当多分解几个加工,以减少层数 一般,上层分解得快些(即多分解几个加工),下层分解得慢些(即少分解几个加工) 分解要均匀四、数据字典 数据流图与数据字典是密不可分的,两者结合起来构成软件的逻辑模型(分析模型) 数据字典由字典条目组成,每个条目描述DFD中的一个元素 数据字典条目包括:数据流、文
16、件、数据项(组成数据流和文件的数据)、加工、源或宿 加工逻辑的详细说明可以用“小说明”来描述(5.5节)数据字典的描述符号p105各类字典条目 不同的开发组织或团队可以根据项目的需要定义字典条目的描述内容 字典条目中的描述内容主要包括 DFD元素的基本信息(名称、别名、简述、注解) 定义(数据类型、数据组成) 使用特点(取值范围、使用频率、激发条件) 控制信息(来源、去向、访问权限)等五、描述基本加工的小说明 小说明是基本加工的规约说明,应精确地描述用户要求一个加工“做什么” 包括加工的激发条件、加工逻辑、优先级、执行频率、出错处理等 最基本的部分是加工逻辑,即该加工的输出数据流与输入数据流之
17、间的逻辑关系 加工逻辑不是对加工的设计,不涉及数据结构、算法实现、编程语言等与设计和实现有关的细节加工逻辑的描述方法 结构化语言:介于自然语言和形式语言之间的一种半形式语言 判定表:适用于加工逻辑包含多个条件,而不同的条件组合需做不同的动作 判定树:判定表的变种,它本质上与判定表是相同的,只是表示形式不同七、结构化设计概述 结构化设计(Structured Design,简称SD)是将结构化分析得到的数据流图映射成软件体系结构的一种设计方法 强调模块化、逐步求精、信息隐蔽、高内聚低耦合等设计准则 分为概要设计和详细设计两大步骤1. 结构图1)基本知识 用结构图(Structure Chart)
18、来描述软件系统的体系结构 描述一个软件系统由哪些模块组成,以及模块之间的调用关系 结构图的基本成分有:模块、调用和数据2)结构图中的辅助符号3)结构图的几个概念 深度:程序结构图中控制的层数 宽度:程序结构图中同一层次上模块总数的最大值 扇出(fan out):该模块直接调用的模块数目。 扇入(fan in):能直接调用该模块的模块数目。相关指标的含义 深度和宽度在一定程序上反映了程序的规模和复杂程度 深度和宽度较大,说明程序的规模和复杂程度都较大。 模块的扇入扇出会影响结构图的深度和宽度 一个模块扇出过大通常意味着该模块比较复杂 ,然而扇出太少,可能导致深度的增加 一般情况,一个模块的扇出以
19、39为宜 一个模块的扇入表示有多少模块可直接调用它,它反映了该模块的复用(reuse) 程度,因此模块的扇入越大越好2.启发式设计策略按照模块化设计原则,相应的启发式设计策略如下: 改造程序结构图,降低耦合度,提高内聚度 避免高扇出,并随着深度的增加,力求高扇入 模块的影响范围应限制在该模块的控制范围内(p118) 降低模块接口的复杂程度和冗余程度,提高一致性:模块接口上应尽可能传递简单数据,而且传递的数据应保持与模块的功能相一致,即不传递与模块功能无关的数据 模块的功能应是可预测的,避免对模块施加过多的限制 模块功能可预测是指该模块对相同的输入能产生相同的输出 限制一个模块只处理单一的功能,
20、那么,这个模块体现出高内聚 尽可能设计单入口和单出口的模块:单入口和单出口的模块能有效地避免内容耦合 3.结构化设计的步骤 建立初始结构图:将DFD映射到结构图 对结构图进行改进:可根据设计准则和启发式设计策略对初始结构图进行改进 书写设计文档:书写设计规格说明,特别为每个模块书写功能、接口、约束和限制等 设计评审八、数据流图到软件体系结构的映射 结构化设计是将结构化分析的结果(数据流图)映射成软件的体系结构(结构图) 将DFD分为变换型数据流图和事务型数据流图,对应映射分别称为变换分析和事务分析 分层DFD的映射1. 信息流:分为变换流与事务流 变换流特征:数据流图可明显地分成输入、变换、输
21、出三部分 事务流特征:数据流沿着输入路径到达一个事务中心,事务中心根据输入数据的类型在若干条动作路径中选择一条来执行。事务中心的任务是:接收输入数据(即事务);分析每个事务的类型;根据事务类型选择执行一条动作路径。实例:银行业务中有存款、取款、查询余额、开户、转帐等多种事务2.数据流图映射到结构图的步骤 复审和精化数据流图 确定数据流图的类型(变换型、事务型) 将DFD映射成初始结构图:采用变换分析(5.7.3节)或事务分析(5.7.4节)技术,将DFD映射成初始结构图 改进初始结构图(5.8节)3.变换分析 变换分析的任务是将变换型的DFD映射成初始的结构图,步骤如下: 划定输入流和输出流的
22、边界,确定变换中心 进行第一级分解:将DFD映射成变换型的程序结构 进行第二级分解:将DFD中的加工映射成结构图中的一个适当的模块 标注输入输出信息:根据DFD,在初始结构图上标注模块间传递的输入输出信息1.确定输入/出流边界和变换中心 相关概念: 物理输入/出:指系统输入/出端的数据流 逻辑输入/出:指变换中心的输入/出数据流 基本步骤 确定逻辑输入:根据DFD从物理输入端开始,一步步向系统的中间移动,可找到离物理输入端最远的,但仍可被看作系统输入的那个(或那些)数据流,就是逻辑输入 确定逻辑输出:根据DFD,从物理输出端开始,一步步向系统的中间移动,可找到离物理输出端最远的,但仍可被看作系
23、统输出的那个(或那些)数据流,就是逻辑输出 确定变换中心:确定了所有的逻辑输入和逻辑输出后,位于逻辑输入和逻辑输出之间的部分就是变换中心统计成绩子图的输入、输出流边界2.进行第一级分解 将DFD映射成变换型的程序结构 ,p124图5.303.进行第二级分解 将DFD中的加工映射成结构图中的一个适当的模块 分解步骤如下 输入控制模块的分解:从变换中心的边界开始,沿着输入路径向外移动,把输入路径上的每个加工映射成结构图中受输入控制模块控制的一个低层模块 输出控制模块的分解:从变换中心的边界开始,沿着输出路径向外移动,把输出路径上的每个加工映射成结构图中受输出控制模块控制的一个低层模块 变换控制模块
24、的分解:把变换中心的每个加工映射成结构图中受变换控制模块控制的一个低层模块 4.事务分析 任务:将事务型DFD映射成初始的结构图 事务型的结构图如图所示,包括: 主控模块:完成整个系统的功能 接收模块:接收输入数据(事务) 发送模块:根据输入事务的类型,选择一个动作路径控制模块 动作路径控制模块:完成相应的动作路径所执行的子功能事务分析的步骤 确定事务中心:事务中心位于数条动作路径的起点,这些动作路径呈幅射状从该点流出 将DFD映射成事务型的结构图 分解每条动作路径所对应的结构图 接收模块的分解:从事务中心开始,沿着输入路径向外移动,把输入路径上的每个加工映射成结构图中受接收模块控制的一个低层
25、模块 动作路径控制模块的分解:首先确定每条动作路径的流类型(变换流或事务流),然后,运用变换分析或事务分析,将每条动作路径映射成与其流特性相对应的以动作路径控制模块为根模块的结构图5.分层DFD的映射 0层图反映了系统由哪些子系统组成,此时可先将0层图映射成下图中的结构 0层图每个加工的DFD子图可映射成以相应模块为根模块的结构子图 如果DFD子图中的加工还可分解成一张子图,则再将其映射成以相应模块为根模块的结构子图 依次一层一层分解下去得到最终的初始结构图 如果初始结构图太大,我们也可以将它组织成分层的结构图“考务处理系统”的初始结构图如书中图5.35所示九、初始结构图的改进 改进依据:软件
26、设计的准则和启发式设计策略 改进往往不是一次完成的,需要进行多次的反复,有时还需要在多个改进方案进行选择 1.改进实例1).“考试报名”结构图的改进 “考试报名”部分的结构图: “输入报名单”模块比较简单,可以和“检查报名单”合并 将“打印报名单出错信息”模块合并到“检查报名单”模块,降低模块间的耦合度 最终三者合并为“输入并检查报名单” 准考证在“编准考证号”模块产生,一直要到“打印准考证”模块才使用,因此可以将二者合并成“编制并打印准考证” “登记考生”和“输出考生名单”也可合并成“登记并输出考生名单” “输出控制”模块的作用是调用三个输出模块,现在这三个输出模块都合并到其它模块中去了,因
27、此,“输出控制”可以删去 对于“输入控制模块”和“报名处理”模块,它们除了调用低层模块并传递参数外,没有其它实质性的工作,这种模块称为管道模块,可以将其删除,其低层模块改由其上层模块调用 2).“统计成绩 ”结构图的改进 先将一些比较简单的模块合并到与其功能相一致的模块中,以减少耦合度 将“输入成绩清单”、“检查成绩清单”、“打印成绩单出错信息”合并成“输入并检查成绩清单” 将“输入合格标准”与“审定合格者”合并,仍取名“审定合格者”,但它包含读入合格标准功能 将“产生考生通知单”与“打印考生通知单”合并成“产生并打印考生通知单” 降低模块间的耦合程度 将“打印难度分析表”模块和“打印分类统计表”模块分别作为“分析试题难度”模块和“分类统计成绩”模块的下属模块 删去“统计成绩输出控制” “统计成绩输入控制”模块和“统计成绩处理模块”均为“管道”模块,也可删去 局部改进后的“考务处理系统”结构图3).“考务处理系统”结构图的整体改进 考虑到分析试题难度和分类统计成绩是相对独立的功能,因此将它们移到主控模块下 “考试报名”模块和“统计成绩”模块似乎是管道模块,但删去后主控模块“考务处理系统”的扇出就比较大,因此可不删除2.结构图改进技巧 减少模块间的耦合度 消除重复功能 消除“管道”模块 模块的大小适中 避免高扇出 应尽可能研究整张结构图,而不是只考虑其中的一部分_
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1