880 likes | 1.03k Views
软件工程. 第九章 面向数据流的设计方向 授课教师 : 李梁 联络电话: 68668334 电子邮件: iliang@cqit.com.cn. 第九章 面向数据流的设计方法. 基本概念和设计过程 变换分析(重点) 事务分析(重点) 启发式设计策略 数据逻辑模型设计 通用化设计. A. 1. $ 变化的部分. D. 6. B. 变化部分. 2. 3. C. E. A. D. 1. 4. 6. B. 2. 3. 5. C. §9.1 基本概念和设计过程. 1 、 SD 法设计过程
E N D
软件工程 第九章 面向数据流的设计方向 授课教师:李梁 联络电话:68668334 电子邮件:iliang@cqit.com.cn
第九章 面向数据流的设计方法 • 基本概念和设计过程 • 变换分析(重点) • 事务分析(重点) • 启发式设计策略 • 数据逻辑模型设计 • 通用化设计
A 1 $变化的部分 D 6 B 变化部分 2 3 C E A D 1 4 6 B 2 3 5 C §9.1 基本概念和设计过程 1、SD法设计过程 ①首先研究、分析和审查数据流图。 从软件的需求规格说明中弄清数据流加工的过程,修改数据流图,明确新系统做什么?确定新系统的逻辑模型(要点) • 去除掉非本质的因素 • 这个处理逻辑是否必须这样? • 这个数据存储是否一定需要?这个数据的流向是否合理? • 确定新系统在DFD中变化部分 • 将DFD分解成没有变化的部分,和将有变化的部分 • 重新分析将有变化的部分DFD • (需凭经验重新分解该处理) • 确定人机边界
2、系统结构图 • 传入模块─ 从下属模块取得数据,经过某些处理,再将其传送给上级模块。它传送的数据流叫做逻辑输入数据流。 • 传出模块─ 从上级模块获得数据,进行某些处理,再将其传送给下属模块。它传送的数据流叫做逻辑输出数据流。 • 变换模块─ 它从上级模块取得数据,进行特定的处理,转换成其它形式,再传送回上级模块。它加工的数据流叫做变换数据流。 • 协调模块─ 对所有下属模块进行协调和管理的模块。
3、变换型系统结构图 • 变换型数据处理问题的工作过程大致分为三步,即取得数据,变换数据和给出数据。 • 相应于取得数据、变换数据、给出数据,变换型系统结构图由输入、中心变换和输出等三部分组成。
4、事务型系统结构图 • 它接受一项事务,根据事务处理的特点和性质,选择分派一个适当的处理单元,然后给出结果。 • 在事务型系统结构图中,事务中心模块按所接受的事务的类型,选择某一事务处理模块执行。各事务处理模块并列。每个事务处理模块可能要调用若干个操作模块,而操作模块又可能调用若干个细节模块。
§9.2变换分析 • 重画数据流图; • 区分有效(逻辑)输入、有效(逻辑)输出和中心变换部分; • 进行一级分解,设计上层模块; • 进行二级分解,设计输入、输出和中心变换部分的中、下层模块。
①在选择模块设计的次序时,必须对一个模块的全部直接下属模块都设计完成之后,才能转向另一个模块的下层模块的设计。①在选择模块设计的次序时,必须对一个模块的全部直接下属模块都设计完成之后,才能转向另一个模块的下层模块的设计。 ②在设计下层模块时,应考虑模块的耦合和内聚问题,以提高初始结构图的质量。 ③ 使用“黑箱”技术: 在设计当前模块时,先把这个模块的所有下层模块定义成“黑箱”,在设计中利用它们 时,暂时不考虑其内部结构和实现。在这一步定义好的“黑箱”,在下一步就可以对它们进行设计和加工。这样,又会导致更多的“黑箱”。最后,全部“黑箱”的内容和结构应完全被确定。
④在模块划分时,一个模块的直接下属模块一般在5个左右。如果直接下属模块超过10个,可设中间层次。④在模块划分时,一个模块的直接下属模块一般在5个左右。如果直接下属模块超过10个,可设中间层次。 ⑤如果出现了以下情况,就停止模块的功能分解: • 当模块不能再细分为明显的子任务时; • 当分解成用户提供的模块或程序库的子程序时; • 当模块的界面是输入/输出设备传送的信息时; • 当模块不宜再分解得过小时。 • §9.3事务分析 • 在很多软件应用中,存在某种作业数据流,它可以引发一个或多个处理,这些处理能够完成该作业要求的功能。这种数据流就叫做事务。 • 与变换分析一样,事务分析也是从分析数据流图开始,自顶向下,逐步分解,建立系统到结构图。
① 识别事务源利用数据流图和数据词典,从问题定义和需求分析的结果中,找出各种需要处理的事务。通常,事务来自物理输入装置。有时,设计人员还必须区别系统的输入、中心加工和输出中产生的事务。 ② 规定适当的事务型结构在确定了该数据流图具有事务型特征之后,根据模块划分理论,建立适当的事务型结构。 ③ 识别各种事务和它们定义的操作。从问题定义和需求分析中找出的事务及其操作所必需的全部信息,对于系统内部产生的事务,必须仔细地定义它们的操作。 ④ 注意利用公用模块在事务分析的过程中,如果不同事务的一些中间模块可由具有类似的语法和语义的若干个低层模块组成,则可以把这些低层模块构造成公用模块。
⑤ 对每一事务,或对联系密切的一组事务,建立一个事务处理模块;如果发现在系统中有类似的事务,可以把它们组成一个事务处理模块。 ⑥ 对事务处理模块规定它们全部的下层操作模块 ⑦ 对操作模块规定它们的全部细节模块变换分析是软件系统结构设计的主要方法。一般,一个大型的软件系统是变换型结构和事务型结构的混合结构。所以,我们通常利用以变换分析为主,事务分析为辅的方式进行软件结构设计。
§9.4 启发式设计策略 1、模块功能的完善化: 一个完整的模块应当有以下几部分:① 执行规定的功能的部分;② 出错处理的部分。当模块不能完成规定的功能时,必须回送出错标志,出现例外情况的原因。③ 如果需要返回数据给它的调用者,在完成数据加工或结束时, 应当给调用者返回一个状态码。2、消除重复功能,改善软件结构①完全相似:在结构上完全相似,可能只是在数据类型上不一致。此时可以采取完全合并的方法。②局部相似:找出其相同部分,分离出去,重新定义成一个独立的下一层模块。还可以与它的上级模块合并。
3、模块的作用范围应在控制范围之内 • 模块的控制范围包括它本身及其所有的从属模块。 • 模块的作用范围是指模块内一个判定的作用范围,凡是受这个判定影响的所有模块都属于这个判定的作用范围。 • 如果一个判定的作用范围包含在这个判定所在模块的控制范围之内,则这种结构是简单的,否则,它的结构是不简单的。
4、尽可能减少高扇出结构,随着深度增大扇入。如果一个模块的扇出数过大,就意味着该模块过分复杂,需要协调和控制过多的下属模块。应当适当增加中间层次的控制模块。4、尽可能减少高扇出结构,随着深度增大扇入。如果一个模块的扇出数过大,就意味着该模块过分复杂,需要协调和控制过多的下属模块。应当适当增加中间层次的控制模块。
5、避免或减少使用病态联接应限制使用如下三种病态联接:①直接病态联接即模块A直接从模块B内部取出某些数据,或者把某些数据直接送到模块B内部。5、避免或减少使用病态联接应限制使用如下三种病态联接:①直接病态联接即模块A直接从模块B内部取出某些数据,或者把某些数据直接送到模块B内部。
②公共数据域病态联接模块A和模块B通过公共数据域,直接传送或接受数据,而不是通过它们的上级模块。这种方式将使得模块间的耦合程度剧增。它不仅影响模块A和模块B,而且影响与公共数据域有关联的所有模块。②公共数据域病态联接模块A和模块B通过公共数据域,直接传送或接受数据,而不是通过它们的上级模块。这种方式将使得模块间的耦合程度剧增。它不仅影响模块A和模块B,而且影响与公共数据域有关联的所有模块。 ③通信模块联接 即模块A和模块B通过通信模块TABLEIT传送数据。从表面看,这不是病态联接,因为模块A和模块B都未涉及通信模块TABLEIT 的内部。然而,它们之间的通信(即数据传送)没有通过它们的上级模块。从这个意义上讲,这种联接是病态的。
6、模块的大小要适中模块的大小,可以用模块中所含语句的数量的多少来衡量。把模块的大小限制在一定的范围之内。通常规定其语句行数在50~100左右,保持在一页纸之内,最多不超过500行。6、模块的大小要适中模块的大小,可以用模块中所含语句的数量的多少来衡量。把模块的大小限制在一定的范围之内。通常规定其语句行数在50~100左右,保持在一页纸之内,最多不超过500行。 7、设计功能可预测的模块,但要避免过分受限制的模块 • 一个功能可预测的模块,不论内部处理细节如何,但对相同的输入数据,总能产生同样的结果。但是,如果模块内部蕴藏有一些特殊的鲜为人知的功能时,这个模块就可能是不可预测的。对于这种模块,如果调用者不小心使用,其结果将不可预测。
如果一个模块的局部数据结构的大小、控制流的选择或者与外界(人、硬软件) 的接口模式被限制死了,则很难适应用户新的要求或环境的变更。 • 为了能够适应将来的变更,软件模块中局部数据结构的大小应当是可控制的,控制流的选择对于调用者来说,应当是可预测的。而与外界的接口应当是灵活的。 8、软件包应满足设计约束和可移植性 为了使得软件包可以在某些特定的环境下能够安装和运行,对软件包提出了一些设计约束和可移植的要求。例如,设计约束有时要求一个程序段在存储器中覆盖自身。当这种情况出现时,设计出来的软件程序结构不得不根据重复程度、访问频率、调用间隔等等特性,重新加以组织。
§9.5 设计的后处理 • 为每一个模块写一份处理说明 • 为每一个模块提供一份接口说明 • 确定全局数据结构和局部数据结构 • 指出所有的设计约束和限制 • 进行概要设计的评审 • 进行设计的优化(如果需要和可能的话)
§9.6 数据逻辑模型设计 R1 R1(R1#,……) key=R1# 1 R3 转换成 1 R2(R2#,……,) key=R2# R2 • 1、E-R图中的每一个l:1的“联系”的实体。 • 分别为它们建立一个“关系”、关系所包含的属性,要包括E-R图中对应实体所具有的全部属性。关系的关键字就是对应实体的标识码。 • 假设两个实体为R1、R2,其间联系为R3。
§9.6 数据逻辑模型设计 R1 R1(R1#,……) key=R1# 1 R3 转换成 n R2(R2#,……,,R1#) key=R2# R2 2、对E-R图中每一个l:n的“联系” 分别让“1”的一方的标识码(即这一方实体的标识码)进入“n”的一方作为外来码(即这一方实体所建立的“关系”增加一个属性)。“联系”本身若具有属性,也让它们进入“n”的一方作为外来码。
§9.6 数据逻辑模型设计 R1 R1(R1#,……) key=R1# m R3 转换成 R3(R1#,R2#….) key= R2#,R2# n R2(R2#,……,,R1#) key=R2# R2 3、每一个m:n的二元、三元或更多元的“联系” 为这些联系分别建立一个“关系”。关系的属性要包括对应联系自身的全部属性(若有的话),还要包括形成该联系的各方实体的标识码。关系的关键字就是该联系的各方实体的标识码组合。
乘客 部门 职工 供应商 职工 零件 1 1 m m 1 n m n 购买 属于 生产 供应 1 n n n k 领导 装配 车票 职工 产品 材料 产品 • 4、每一个同种实体自身1:n的“联系” • 分别在为对应实体所形成的“关系”中多设一个属性。由于同种实体自身1:n的“联系”会在这种实体的不同个体间形成多个级别,这个多设的属性就用来存放上级个体的标识码。如果“联系”本身还具有属性,也应把它们收进为这个实体而形成的“关系”中。
§9.6 数据库物理模型设计 • 5、每一个同种实体自身m:n的“联系” • 为这些“联系”分别建立一个“关系”。关系的属性除了包括对应“联系”的全部属性外(若有的话),还要增加两个属性,用来分别存放对应“联系”的双方个体(同一种实体内部)的标识码。关系的关键字就是新增的表示双方个体标识码的属性组合。 • 6、检查按照以上方法所形成的各个“关系”,如果发现有的“关系”最终只含有一个属性,则把这样的“关系”取消。
科目 凭证类型 外币 往来单位 部门 人员 计划 1 1 1 1 1 1 属于 n 凭证 1 n 记账 记总账 1 1 1 1 1 日记账 明细账 辅助账 总账 科目余额表 m n n 1 1 对账 n 取数 银行对账单 图1-10 账务处理子系统E-R图 会计报表 1
科目:包括科目编码*,科目名称,科目性质,科目类别,科目余额方向等。科目:包括科目编码*,科目名称,科目性质,科目类别,科目余额方向等。 • 凭证类型:凭证类型编号*,凭证类型名称,各种非法对应科目关系(借方必有科目、贷方必有科目、凭证必有科目、凭证必无科目)等。 • 外币类型:外币名称,外币编码*,汇率基数,外币汇率,汇率日期等。 • 往来单位名称:往来单位名称,编码,地址,联系人,邮政编码,银行账号等。 • 凭证:日期(制单日期,复核日期,记账日期),凭证类型*,票据类型,科目*,摘要,发生额,凭证号*,往来单位*、部门编码、人员编码、计划编码、附件数,会计主管,制单人,复核人,记账人,外币编码,外币数量等。 • 科目余额表:日期,会计科目*,期初余额,期末余额,余额方向,借方发生额,贷方发生额等。 • 对账单:日期,账号*,序号*、票据号,摘要,借方发生额,贷方发生额等。 • 会计报表:报表名*,日期,单位名称,项目,行次*,本期额,累积额,年初额、资产合计,权益合计,制表人等。
§9.7 通用化设计 • 具有一定通用性的应用软件是现代软件发展的方向。缺乏通用性的软件影响其推广和增加其维护工作量。 • 设计出能满足各种模式的通用性系统是不现实的,使软件具有一些通用性特点,达到进行少量的自动定义修改后,使之适应新模式下的用户需求是可能的。 • 虽然不同行业、单位的应用系统中有相当部分模块或内容是有一定规律性的。 • 通用性设计的前提是已经具有一个标准的开发规范 • 例:金蝶2000 /K3 天财 用友U8 金算盘
金碟2000软件操作流程 期初建账 新建账套(账套名、数据库名)、核算单位名、选择会计制度、会计科目结构、会计期间范围、建账 初始定义 设置用户及权限、设置外币及汇率、设置会计科目及属性、设置往来单位、设置职员、输入往来未达账、输入期初余额、余额平衡检查、启用账套 凭证处理 设置系统参数、输入凭证、查询凭证、审核凭证、凭证过账、数据备份 银行对账 输入银行未达账、输入企业未达账、设置余额调节表、输入银行对账单、银行账自动/手动核销
期末处理 1、更换操作员为审核人员; 2、使用凭证查询功能对输入的凭证进行审核(单条或批量); 注意:对销售收入有关科目(50101-50104)凭证必须输入数量、单价; 3、使用凭证过账功能对审核后的凭证过账; 4、更换操作员为制单人员; 5、进行汇兑损益结转(10202科目必须定义了进行期末调汇); 6、输入固定资产的汇兑损益调整凭证; 7、更换操作员为审核人员; 8、使用凭证查询功能对调汇凭证进行审核(单条或批量); 9、使用凭证过账功能对审核后的调汇凭证过账; 10、更换操作员为制单人员; 11、定义结转销售成本的自动转帐凭证,并生成凭证(4张);
12、更换操作员为审核人员; 13、使用凭证查询功能对结转销售成本凭证进行审核(单条或批量); 14、使用凭证过账功能对审核后的结转销售成本凭证过账; 15、更换操作员为制单人员; 16、输入其它结转税金等凭证(无本年利润科目的凭证); 17、更换操作员为审核人员; 18、使用凭证查询功能对其它结转凭证进行审核(单条或批量); 19、使用凭证过账功能对审核后的其它结转凭证过账; 20、更换操作员为制单人员; 21、使用结转损益功能产生结转损益凭证(有本年利润科目的凭证); 22、更换操作员为审核人员;
23、使用凭证查询功能对结转损益凭证进行审核(单条或批量);23、使用凭证查询功能对结转损益凭证进行审核(单条或批量); 24、使用凭证过账功能对审核后的结转损益凭证过账; 25、采用自定义报表功能定义“孙益表”及“资产负债表” 26、进行期末结账 注意:审核时出现错误应更换操作员为制单人员进行修改 修改后重新更换操作员为审核人员进行审核 定义报表前应使用查询科目余额表检查科目余额是否正确(综合币) 报表处理 查询余额表是否正确 打开损益表、定义计算公式、计算数据 打开资产负债表、定义计算公式、计算数据
1.建立独立的公共模块 系统管理及维护部分的各种单位信息编码的初始定义、用户及操作权限的设置、系统运行注册、运行日志、数据检查、备份及恢复等。 2.用户自定义内容 采用动态内容设计,给用户提供由用户自己定义软件的功能是提高软件通用性的最主要方法。 动态参数自定义 标准管理模型选择及定义 单位信息代码体系 输入数据结构及界面自定义 输出报表格式及内容 处理计算公式及计算方法
2.1 动态参数自定义 用户的特征信息:如用户单位的名称、行业类型、地区代码、单位主管名称、通讯信息等) 运行操作特征信息:如各种单据复核方法、备份方式、单据输入存盘后是否立刻新增空白单据、表格方式输入时是否自动插入新行、编码输入错误后是否自动打开编码表选择 安装信息:如后台数据库产品、安装路径、网络模式 管理模式信息:如模块间时序指定、会计期间范围、使用的准则等
2.2 标准模型选择及定义 对还不能统一的各种信息处理方法与处理程序,采用按各种标准管理模型的积木式模块供用户根据实际情况选择使用 2.3 单位信息代码体系定义(要考虑这些代码的层次性和可修改性) 国家标准代码群: 单位公共代码群:单位的部门组成结构代码、职员代码、对外往来单位代码、产品结构代码、仓库代码、材料代码、商品代码 专业代码群:医院系统中的门诊及住院科室代码、住院床位代码、住院号代码、药房代码、药品代码
2.4 可能变化的输入数据结构及界面自定义 动态的数据结构要求处理界面和处理方法也是动态的 用“数据结构定义数据表”存储动态输入数据表,由用户定义动态数据结构的可能变化的数据元素的名称、类型、宽度、小数位、处理方式、计算公式、输入属性、界面位置等 自动产生动态的处理界面和处理方法程序。 2.5 输出报表格式及内容定义(最可能变化的部分,软件需求分析时是无法枚举) 设计让用户选择数据源或数据表、汇总方式、汇总条件、输出格式的表处理系统。由用户自定义报表数据来源计算公式、表名、填报单位、填报日期、字体等功能。
2.6 处理计算公式及计算方法定义 尽量将数据处理时可能出现的计算方法的计算公式存储在专门的公式数据表中,或者让用户自己定义,达到数据处理的通用性。如成本的计算公式、各种折旧计算方法公式(如分类折旧、工作量法、年数总和法等)、各种库存商品(产品、材料)结存的计算方法(如先进先出、后进先出、分批认定、加权平均、移动加权平均等)。 3.公开主要输入输出源代码,建立二次开发接口 通用性并不能解决用户所有的问题 二次开发接口需要基础数据结构的数据字典和主要的输入及输出模块的源代码 4.处处考虑“这项功能将来用户是否会要进行改变?”
数据项定义 • 数据项名称:学号 数据项名称:学生类别 • 别名:S-NO 别名: • 描述:本校学生编码 描述:招生类别,统招、 • 定向、委培 • 长度:CHAR(12) 长度:CHAR(8) • 位置:基本信息卡、学籍卡 位置:基本信息卡 • 学籍卡 • 数据项名称:系号 数据项名称:系别 • 别名: 别名:系的名称 • 描述:本校系的编码 描述:本校的系的名称 • 长度:CHAR(2) 长度:CHAR(30) • 位置:基本信息卡、学籍卡 位置:基本信息卡 • 学籍卡