软件工程导论05 | 您所在的位置:网站首页 › sd和sp软件的区别 › 软件工程导论05 |
结构化分析与设计
(这章内容多但都不算难理解,能与前面融一下) 结构化分析与设计方法是一种面向数据流的传统软件开发方法 它以数据流为中心,构建软件的分析模型和设计模型 结构化方法分为: 结构化分析(Structured Analysis,SA)结构化设计(Structured Design,SD)结构化程序设计(Structured Programmin,SP) 结构化分析方法概述 结构化分析方法 发展历史 提出:20世纪60年代末到70年代初成熟:20世纪70年代末到80年代中期 主要思想抽象和自顶向下的分解(控制复杂性的两个基本手段) 抽象概念:在每个抽象层次上忽略问题的内部复杂性,只关注整个问题与外界的联系分解概念:将问题不断分解为较小的问题,直到每个最底层的问题都足够简单为止 抽象与分解抽象做法:从作为整体软件的软件系统开始(第一层),每一抽象层次只关注于系统的输入和输出 分解做法:将系统不断分解为子系统、模块…… 随着分解层次的增加,抽象的级别越来越低,也越接近问题的解(算法和数据结构) 结构化分析过程 理解当前的现实环境,获得当前系统的具体模型(物理模型)从当前系统的具体模型抽象出当前系统的逻辑模型分析目标系统与当前系统逻辑上的差别,建立目标系统的逻辑模型为目标系统的逻辑模型作补充 结构化分析模型的描述数据字典:是模型的核心,它包含了软件使用和产生所有数据的描述 数据流图:用于功能建模,描述系统的输入数据如何经过一系列的加工变换逐步变换成系统的输出数据流 实体——关系图:用于数据建模,描述数据字典中数据之间的关系 状态转换图:用于行为建模,描述系统接收哪些外部事件,以及在外部事件的作用下的状态迁移的情况 数据流图Data Flow Diagram(简称DFD):描述输入数据流到输出数据流的变换(即加工)过程,用于对系统的功能建模。 基本元素包括: 箭头:代表数据流(data flow),由一组固定成分的数据组成,代表数据流动的方向 圆圈:代表加工(process),描述了输入数据流到输出数据流的变换,即将输入数据流加工成输出数据流 双杠:代表文件(file),使用文件、数据库等保存某些数据结果供以后使用 方块:代表源或宿(course or sink):表示存在于系统之外的对象,以帮助我们理解系统数据的来源和去向,也称源点和终点 源或宿例如:对一个考务处理系统而言 考生向系统提供报名单(输入数据流),所以考生是考试系统(软件)的一个源考务处理系统要将考试成绩的统计分析表(输出数据流)传递给考试中心,所以考试中心是该系统的一个宿源或宿用相同的图形符号表示: 当数据流从该符号流出时表示是源当数据流流向该符号时表示是宿当两者皆有时表示既是源又是宿 加工和文件加工:描述输入数据流到输出数据流的变换: 每个加工用一个定义明确的名字标识至少有一个输入数据流和一个输出流可以有多个输入数据流和多个输出数据流文件:保存数据信息的外部单元 每个文件用一个定义明确的名字标识由加工进行读写DFD中称为文件,但在具体实现时可以用文件系统实现,也可以用数据库系统等实现 数据流每个数据流用由一组固定成分的数据组成,并拥有一个定义明确的名字标识 如:运动会管理系统中,报名单(数据流)由队名、姓名、性别、参赛项目等数据组成 数据流的流向 从一个加工流向另一个加工从加工流向文件(写文件)从文件流向加工(读文件)从源流向加工从加工流向宿 例:图书订购系统DFD描述一个加工的多个数据流之间的关系 星号(*):表示数据流之间存在“与”关系 所有输入数据流同时存在时,才能进行加工处理 或加工处理的结果是同时产生所有输出数据流加号(+):表示数据流之间存在“或”关系 至少存在一个输入数据流时才能进行加工处理 或加工处理的结果是至少产生一个输出数据流异或(⊕):表示数据流之间存在“异或”(互斥)关系 必须存在且仅存在一个输入数据流时,才能进行加工处理 或加工处理的结果是产生且仅产生一个输出数据流 对数据流图进行分层George Miller在著名的论文“神奇的数字7加减2:我们处理信息的能力的某种限制”中指出:人们在一段时间内的短期记忆似乎限制在5~9件事情之内 根据自顶向下逐层分解的思想,将数据流图画成层次结构 每个层次画在独立的数据流图中,加工个数可大致控制在“7加减2”的范围中 分层数据流图示例——资格和水平考试的考务处理系统 总体要求 简化的资格和水平考试的考务处理系统考试分成多个级别,如初级程序员、程序员、高级程序员、系统分析员等,凡满足一定条件的考生都可参加某一级别的考试考试的合格标准将根据每年的考试成绩由考试中心确定考试的阅卷由阅卷站进行,因此,阅卷工作不包含在软件系统中 资格和水平考试的考务处理系统—功能需求 对考生送来的报名单进行检查对合格的报名单编好准考证号后将准考证送给考生,并将汇总后的考生名单送给阅卷站对阅卷站送来的成绩清单进行检查,并根据考试中心制订的合格标准审定合格者制作考生通知单送给考生进行成绩分类统计(按地区、年龄、文化程度、职业、考试级别等分类)和试题难度分析,产生统计分析表 资格和水平考试的考务处理系统—部分数据流的组成 报名单=地区+序号+姓名+文化程度+职业+考试级别+通信地址正式报名单=准考证号+报名单准考证=地区+序号+姓名+准考证号+考试级别+考场考生名单={准考证号+考试级别} 其中{w}表示w重复多次考生名册={正式报名单}统计分析表=分类统计表+难度分析表考生通知单=准考证号+姓名+通信地址+考试级别+考试成绩+合格标志 系统的输入输出(顶层图)3个子加工:检查报名单、编准考证号、登记考生 “合格报名单”和“正式报名单”是新增加的数据流,其它数据流都是加工1原有的在加工1的分解中没有新的文件产生 考务处理系统加工2子图检查图中是否存在错误或不合理(不理想)的部分 一致性:分层DFD中不存在矛盾和冲突完整性:分层DFD本身的完整性,即是否有遗漏的数据流、加工等元素 分层数据流图的一致性 父图与子图平衡任何一张DFD子图边界上的输入/输出数据流,必须与其父图中对应的加工的输入/输出数据流保持一致。 数据守恒 一个加工所有输出数据流中的数据,必须能从该加工的输入数据流中直接获得,或者通过该加工的处理而产生多余的数据流:加工未使用其输入数据流中的某些数据项 局部文件一个加工的输出数据流,不能与该加工的输入数据流同名。 考虑分层数据流中一个文件应画在哪些DFD中: 任何一个文件都应同时包含读和写该文件的数据流,除非该文件是当前系统与另一个软件系统所共享(应在需求说明中指明)在一张DFD中,当一个文件作为若干个加工之间的交界面(一个写另一个读)时该文件应画出在一张DFD中,当一个文件仅与一个加工进行读写操作,并且在该DFD的父(祖先)图中未出现过,则该文件是相应加工的内部文件,在当前DFD中不应画出一个文件一旦在某张DFD中画出,那么在它的子孙图中应根据父图与子图平衡的原则画出该文件在子孙图中,这个文件可能只有读或写文件中的一种数据流 局部文件实例
“试题得分清单”文件是加工2的局部文件,根据抽象原则不应该将这类表示加工细节的局部文件画在其父图(如图c)中,正确的画法是图a和b 分解的程度可参照以下几条与分解有关的原则: 7加减2分解应自然,概念上合理、清晰只要不影响DFD的易理解性,可适当多分解几个加工,以减少层数一般说来,上层分解得快些(即多分解几个加工),下层分解得慢些(即少分解几个加工)分解要均匀 数据字典数据流图与数据字典是密不可分的,两者结合起来构成软件的逻辑模型(分析模型) 数据字典由字典条目组成,每个条目描述DFD中的一个元素 数据字典条目包括:数据流、文件、数据项(组成数据流和文件的数据)、加工、源或宿.(确实都是DFD的元素- -) 数据字典的描述符号 符 号名 称举 例=定义为x=… 表示x由…组成+与a+b 表示a和b[…,…]或[a,b]表示a或b[…│…]或[a│b]表示a或b{…}重复{a} 表示a重复0或多次{…}n m重复{a}8 3 表示a重复3到8次(…)可选(a) 表示a重复0或1次″…″基本数据元素″a″ 表a是基本数据 字典条目不同的开发组织或团队可以根据项目的需要定义字典条目的描述内容 字典条目中的描述内容主要包括: DFD元素的基本信息(名称、别名、简述、注解)定义(数据类型、数据组成)使用特点(取值范围、使用频率、激发条件)控制信息(来源、去向、访问权限)等 数据流条目的描述内容 名称:数据流名(可以是中文名或英文名)别名:名称的另一个名字简述:对数据流的简单说明数据流组成:描述数据流由哪些数据项(流)组成数据流来源:描述数据流从哪个加工或源流出数据流去向:描述数据流流入哪个加工或宿数据量:系统中该数据流的总量 如考务处理系统中“报名单”的总量是100000张 或者单位时间处理的数据流数量,如80000张/天峰值:某时段处理的最大数量 如每天上午9:00至11:00处理60000张表单注解:对该数据流的其它补充说明 数据流组成数据流组成是数据流条目的核心,它列出组成该数据流的各数据项。 例如: 培训报名单=姓名+单位+课程 运动员报名单=队名+姓名+性别+{参赛项目} 当一个数据流的组成比较复杂时,可以将其分解成几个数据流,例如: 课程=课程名+任课教师+教材+时间地点 时间地点={星期几+第几节+教室} 数据流组成实例(发票)发票=单位名称+{商品名+数量+单价+金额} +总金额+日期+(营业员) 只有那些有必要补充说明的别名才给出相应的别名条目 别名:别名的名字类型:指出别名属于那个种类(数据流、文件、数据、加工、源或宿)基本名:别名的正式名称(原名)简述:同正式名称的简述说明:对别名的补充说明示例: 原始的数据项条目如下: 数据项名称:开户日期 别名:开设日期 简述:客户建立帐户的日期 类型:日期 注解:年≥1949 其别名条目如下: 别名:开设日期 类型:数据项 基本名:开户日期 简述:客户建立帐户的日期 说明:1986年以后不再使用此别名 数据字典的实现 提倡采用专用的软件工具或者常用的实用程序(如,正文编辑程序、电子表格)来建立数据字典的电子文档,其好处是便于字典条目的检索,字典的管理和维护。如果数据字典由辅助绘制DFD的工具自动产生的话,那么可以利用数据字典来检查DFD的一致性和完整性,并保持数据字典与DFD的一致。如果数据字典是由人工制作的,我们可以为每个字典条目制作一张卡片,所有卡片按字典条目的种类(数据流、文件、加工等)分类成册,每类卡片按某种约定排序。 结构化设计概述结构化设计(Structured Design,简称SD)是将结构化分析得到的数据流图映射成软件体系结构的一种设计方法 强调模块化、自顶向下逐步求精、信息隐蔽、高内聚低耦合等设计准则 结构化设计分为概要设计和详细设计两大步骤: 概要设计:是对软件系统的总体设计,采用结构化设计方法,其任务是:将系统分解成模块,确定每个模块的功能、接口(模块间传递的数据)及其调用关系,并用模块及其对模块的调用来构建软件的体系结构详细设计:是对模块实现细节的设计,采用结构化程序设计(Structured Programming,SP)方法SA、SD和SP构成完整的结构化方法体系 结构图用结构图(Structure Chert)来描述软件系统的体系结构 描述一个软件系统由哪些模块组成,以及模块之间的调用关系 结构图的基本成分有:模块、调用和数据 模块是指具有一定功能的可以用模块名调用的一组程序语句,如函数、子程序等 模块是组成程序的基本单元 模块具有其外部特征和内部特征 外部特征包括:模块的接口(模块名、输入/输出参数、返回值等)和模块的功能内部特征包括:模块的内部数据和完成其功能的程序代码**在SD中,我们只关注模块的外部特征,而忽略其内部特征 ** 调用和数据调用(call):用从一个模块指向另一个模块的箭头来表示,其含义是前者调用了后者 为了方便,有时常用直线替代箭头,此时,表示位于上方的模块调用位于下方的模块 数据(data):模块调用时需传递的参数可通过在调用箭头旁附加一个小箭头和数据名来表示 深度和宽度在一定程序上反映了程序的规模和复杂程度 相对而言,如果程序结构图的深度和宽度较大,则说明程序的规模和复杂程度都较大。模块的扇入扇出会影响结构图的深度和宽度,例如减少模块的扇出,可能导致宽度变小而深度增加一个模块的扇出过大通常意味着该模块比较复杂,然而扇出太少,可能导致深度的增加 一般情况,一个模块的扇出以3~9为宜 一个模块的扇入表示有多少模块可直接调用它,它反映了该模块的复用(reuse)程度,因此模块的扇入越大越好 结构化设计的步骤建立初始结构图 将整个软件看成一个大的功能模块,通过功能分解不断将其分解成若干个 对结构图进行改进 可根据设计准则和开发式设计策略对初始结构图进行改进 书写设计文档 书写设计规格说明,特别要为每个模块书写模块的功能、接口、约束和限制等 设计评审 数据流图到软件体系结构的映射结构化设计是将结构化分析的结果(数据流图)映射成软件的体系结构(结构图) 信息流:变换流和事务流 将数据流图分为变换型数据流图和事务型数据流图,对应的映射分别称为变换分析和事务分析 变换流特征:数据流图可明显地分成输入、变换、输出三部分 信息沿着输入路径进入系统,并将输入信息的外部形式经过编辑、格式转换、合法性检查、预处理等辅助性加工后变成内部形式内部形式的信息由变换中心预处理然后沿着输出路径经过格式转换、组成物理块、缓冲处理等辅助性加工后变成输出信息送到系统外特征:数据流沿着输入路径到达一个事务中心,事务中心根据输入数据的类型在若干条动作路径中选择一条来执行 事务中心的任务是: 接收输入数据(即事务);分析每个事务的类型;根据事务类型选择执行一条动作路径变换分析的任务是将变换型的DFD映射成初始的结构图,步骤如下: 划定输入流和输出流的边界,确定变换中心进行第一级分解:将DFD映射成变换型的程序结构进行第二级分解:将DFD中的加工映射成结构图中的一个适当的模块标注输入输出信息:根据DFD,在初始结构图上标注模块之间传递的输入信息和输出信息 确定输入/出流边界和变换中心 相关概念 物理输入:指系统输入端的数据流物理输出:指系统输出端的数据流逻辑输入:指变换中心的输入数据流逻辑输出:指变换中心的输出数据流划分可能因人而异,但差别不会太大并可通过以后的结构图改进进行调整 有的时候物理输入无须预处理而直接用于系统的加工处理,此时物理输入就是逻辑输入(同样也存在物理输出就是逻辑输出的情况) 基本步骤 确定逻辑输入:根据DFD从物理输入端开始,一步步向系统的中间移动,可找到离物理输入端最远的,但仍可被看作系统输入的那个(或那些)数据流,就是逻辑输入确定逻辑输出:根据DFD,从物理输出端开始,一步步向系统的中间移动,可找到离物理输出端最远的,但仍可被看作系统输出的那个(或那些)数据流,就是逻辑输出确定变换中心:确定了所有的逻辑输入和逻辑输出后,位于逻辑输入和逻辑输出之间的部分就是变换中心 进行第一级分解将DFD映射成变换型的程序结构 ,大型的软件系统第一级分解时可多分解几个模块,以减少最终结构图的层次数 例如,每条输入或输出路径画一个模块,每个主要变换功能各画一个模块 将DFD中的加工映射成结构图中的一个适当的模块 分解步骤 输入控制模块的分解:从变换中心的边界开始,沿着输入路径向外移动,把输入路径上的每个加工映射成结构图中受输入控制模块控制的一个低层模块输出控制模块的分解:从变换中心的边界开始,沿着输出路径向外移动,把输出路径上的每个加工映射成结构图中受输出控制模块控制的一个低层模块变换控制模块的分解:把变换中心的每个加工映射成结构图中受变换控制模块控制的一个低层模块 “统计成绩”第二级分解的结构图将事务型DFD映射成初始的结构图 实例:银行业务中有存款、取款、查询余额、开户、转帐等多种事务,这种软件通常是接收一个事务,然后根据事务的类型执行一个事务处理的功能 事务型的结构图如图所示,包括: 主控模块:完成整个系统的功能接收模块:接收输入数据(事务)发送模块:根据输入事务的类型,选择一个动作路径控制模块动作路径控制模块:完成相应的动作路径所执行的子功能确定事务中心:事务中心位于数条动作路径的起点,这些动作路径呈幅射状从该点流出 将DFD映射成事务型的结构图 分解每条动作路径所对应的结构图 接收模块的分解:从事务中心开始,沿着输入路径向外移动,把输入路径上的每个加工映射成结构图中受接收模块控制的一个低层模块动作路径控制模块的分解:首先确定每条动作路径的流类型(变换流或事务流),然后,运用变换分析或事务分析,将每条动作路径映射成与其流特性相对应的以动作路径控制模块为根模块的结构图 分层DFD的映射 0层图反映了系统由哪些子系统组成,此时可先将0层图映射成下图中的结构0层图每个加工的DFD子图可映射成以相应模块为根模块的结构子图如果DFD子图中的加工还可分解成一张子图,则再将其映射成以相应模块为根模块的结构子图依次一层一层分解下去得到最终的初始结构图如果初始结构图太大,我们也可以将它组织成分层的结构图对结构图改进的依据就是观察这种改进是否符合软件设计的准则和启发式设计策略 因此结构图的改进没有明显的步骤,也很难定义终止条件 设计改进往往伴随着折中 例如提取多个模块中的相同功能可以提高模块的独立性和复用程度,但会增加模块间的联系 改进往往不是一次完成的,需要进行多次的反复,有时还需要在多个改进方案进行选择 结构图改进技巧 减少模块间的耦合度消除重复功能消除“管道”模块模块的大小适中避免高扇出应尽可能研究整张结构图,而不是只考虑其中的一部分 小结 结构化方法是一种传统的面向数据流开发方法以数据流为中心构建软件的分析模型和设计模型在结构化分析方面,本章介绍结构化分析的基本思想和分析过程,详细介绍了分层数据流图的画法,分层数据流图的审查,数据字典各条目的描述内容以及基本加工说明的描述方法在结构化设计方面,本章介绍如何将分析的结果(DFD)映射成初始的程序结构图,包括变换分析和事务分析,并介绍对初始结构图的优化 |
CopyRight 2018-2019 实验室设备网 版权所有 |