软件工程导论05-结构化分析与设计

结构化分析与设计

(这章内容多但都不算难理解,能与前面融一下)

结构化分析与设计方法是一种面向数据流的传统软件开发方法

它以数据流为中心,构建软件的分析模型和设计模型

结构化方法分为:

  1. 结构化分析(Structured Analysis,SA)
  2. 结构化设计(Structured Design,SD)
  3. 结构化程序设计(Structured Programmin,SP)

结构化分析方法概述

结构化分析方法

发展历史

  1. 提出:20世纪60年代末到70年代初
  2. 成熟:20世纪70年代末到80年代中期

主要思想

抽象和自顶向下的分解(控制复杂性的两个基本手段)

  1. 抽象概念:在每个抽象层次上忽略问题的内部复杂性,只关注整个问题与外界的联系
  2. 分解概念:将问题不断分解为较小的问题,直到每个最底层的问题都足够简单为止

抽象与分解

抽象做法:从作为整体软件的软件系统开始(第一层),每一抽象层次只关注于系统的输入和输出

分解做法:将系统不断分解为子系统、模块……

随着分解层次的增加,抽象的级别越来越低,也越接近问题的解(算法和数据结构)

结构化分析过程

  1. 理解当前的现实环境,获得当前系统的具体模型(物理模型
  2. 从当前系统的具体模型抽象出当前系统的逻辑模型
  3. 分析目标系统当前系统逻辑上的差别,建立目标系统的逻辑模型
  4. 为目标系统的逻辑模型作补充

结构化分析模型的描述

箭头:代表数据流(data flow),由一组固定成分的数据组成,代表数据流动的方向

双杠:代表文件(file),使用文件、数据库等保存某些数据结果供以后使用

数据流图的扩充符

描述一个加工的多个数据流之间的关系

  1. 星 (*):表示数据流之间存在“与”关系
    所有输入数据流同时存在时,才能进行加工处理
    或加工处理的结果是同时产生所有输出数据流
  2. 加 (+):表示数据流之间存在“或”关系
    至少存在一个输入数据流时才能进行加工处理
    或加工处理的结果是至少产生一个输出数据流
  3. 异或(⊕):表示数据流之间存在“异或”(互斥)关系
    必须存在且仅存在一个输入数据流时,才能进行加工处理
    或加工处理的结果是产生且仅产生一个输出数据流

对数据流图进行分层

George Miller在著名的论文“神奇的数字7加减2:我们处理信息的能力的某种限制”中指出:人们在一段时间内的短期记忆似乎限制在5~9件事情之内

根据自顶向下逐层分解的思想,将数据流图画成层次结构

每个层次画在独立的数据流图中,加工个数可大致控制在“7加减2”的范围中

分层数据流图示例——资格和水平考试的考务处理系统

总体要求

  1. 简化的资格和水平考试的考务处理系统
  2. 考试分成多个级别,如初级程序员、程序员、高级程序员、系统分析员等,凡满足一定条件的考生都可参加某一级别的考试
  3. 考试的合格标准将根据每年的考试成绩由考试中心确定
  4. 考试的阅卷由阅卷站进行,因此,阅卷工作不包含在软件系统中

资格和水平考试的考务处理系统—功能需求

  1. 对考生送来的 名单进行检查
  2. 对合格的 名单编好准考证 后将准考证送给考生,并将汇总后的考生名单送给阅卷站
  3. 对阅卷站送来的成绩清单进行检查,并根据考试中心制订的合格标准审定合格者
  4. 制作考生通知单送给考生
  5. 进行成绩分类统计(按地区、年龄、文化程度、职业、考试级别等分类)和试题难度分析,产生统计分析表

资格和水平考试的考务处理系统—部分数据流的组成

  • 名单=地区+序 +姓名+文化程度+职业+考试级别+通信地址
  • 正式 名单=准考证 + 名单
  • 准考证=地区+序 +姓名+准考证 +考试级别+考场
  • 考生名单={准考证 +考试级别}
    其中{w}表示w重复多次
  • 考生名册={正式 名单}
  • 统计分析表=分类统计表+难度分析表
  • 考生通知单=准考证 +姓名+通信地址+考试级别+考试成绩+合格标志

系统的输入输出(顶层图)

考务处理系统加工1子图

总结:画分层数据流图的步骤

  1. 画系统的输入和输出
  2. 画系统内部
  3. 画加工内部
  4. 重复第3步,直至每个尚未分解的加工都足够简单(即不必再分解)

分层数据流图的审查

检查图中是否存在错误或不合理(不理想)的部分

  1. 一致性:分层DFD中不存在矛盾和冲突
  2. 完整性:分层DFD本身的完整性,即是否有遗漏的数据流、加工等元素

分层数据流图的一致性

父图与子图平衡

任何一张DFD子图边界上的输入/输出数据流,必须与其父图中对应的加工的输入/输出数据流保持一致。

数据守恒

  1. 一个加工所有输出数据流中的数据,必须能从该加工的输入数据流中直接获得,或者通过该加工的处理而产生
  2. 多余的数据流:加工未使用其输入数据流中的某些数据项

局部文件

一个加工的输出数据流,不能与该加工的输入数据流同名。

考虑分层数据流中一个文件应画在哪些DFD中:

  1. 任何一个文件都应同时包含读和写该文件的数据流,除非该文件是当前系统与另一个软件系统所共享(应在需求说明中指明)
  2. 在一张DFD中,当一个文件作为若干个加工之间的交界面(一个写另一个读)时该文件应画出
  3. 在一张DFD中,当一个文件仅与一个加工进行读写操作,并且在该DFD的父(祖先)图中未出现过,则该文件是相应加工的内部文件,在当前DFD中不应画出
  4. 一个文件一旦在某张DFD中画出,那么在它的子孙图中应根据父图与子图平衡的原则画出该文件

在子孙图中,这个文件可能只有读或写文件中的一种数据流

局部文件实例

文件条目的描述内容

  1. 名称:文件名
  2. 别名:同数据流条目
  3. 简述:对文件的简单说明
  4. 文件组成:描述文件的记录由哪些数据项组成(与数据流条目中的文件组成描述方法相同)
  5. 写文件的加工:描述哪些加工写文件
  6. 读文件的加工:描述哪些加工读文件
  7. 文件组织:描述文件的存储方式(顺序、索引),排序的关键字
  8. 使用权限:描述各类用户对文件读、写、修改的使用权限
  9. 数据量:文件的最大记录个数
  10. 存取频率:描述对该文件的读写频率
  11. 注解:对该文件的其它补充说明

数据项条目的描述内容

  1. 名称:数据项名
  2. 别名:同数据流条目
  3. 简述:对数据项的简单描述
  4. 数据类型:描述数据项的类型,如整型、实型、字符串等
  5. 计量单位:指明数据项值的计量单位,如公斤、吨等
  6. 取值范围:描述数据项允许的值域,如1…100
  7. 与其它数据项的关系:描述该数据项与数据字典中其它数据项的关系
  8. 注解:对数据项的其它补充说明

加工条目的描述内容

  1. 名称:加工名
  2. 别名:同数据流条目
  3. 加工 : 加工在DFD中的编
  4. 简述:对加工的功能的简要说明
  5. 输入数据流:描述加工的输入数据流,包括读哪些文件名
  6. 输出数据流:描述加工的输出数据流,包括写哪些文件名
  7. 加工逻辑:简要描述加工逻辑,或者对加工规约的索引
  8. 异常处理:描述加工处理过程中可能出现的异常情况,及其处理方式
  9. 加工激发条件:描述执行加工的条件,如,“身份认证正确”,“收到 名单”
  10. 执行频率:描述加工的执行频率,如,每月执行一次,每天几点执行
  11. 注解:对加工的其它补充说明

源或宿条目的描述内容

  1. 名称:源或宿的名(外部实体名)
  2. 别名:同数据流条目
  3. 简要描述:对源或宿的简要描述(包括指明该外部实体在DFD中是用作“源”,还是“宿”,还是“既是源又是宿”)
  4. 输入数据流:描述源向系统提供哪些输入数据流
  5. 输出数据流:描述系统向宿提供哪些输出数据流
  6. 注解:对源或宿的其它补充说明

别名条目的描述内容

只有那些有必要补充说明的别名才给出相应的别名条目

  • 别名:别名的名字
  • 类型:指出别名属于那个种类(数据流、文件、数据、加工、源或宿)
  • 基本名:别名的正式名称(原名)
  • 简述:同正式名称的简述
  • 说明:对别名的补充说明

示例

原始的数据项条目如下:
数据项名称:开户日期
别名:开设日期
简述:客户建立帐户的日期
类型:日期
注解:年≥1949
其别名条目如下
别名:开设日期
类型:数据项
基本名:开户日期
简述:客户建立帐户的日期
说明:1986年以后不再使用此别名

数据字典的实现

  • 如果数据字典由辅助绘制DFD的工具自动产生的话,那么可以利用数据字典来检查DFD的一致性和完整性,并保持数据字典与DFD的一致。
  • 如果数据字典是由人工制作的,我们可以为每个字典条目制作一张卡片,所有卡片按字典条目的种类(数据流、文件、加工等)分类成册,每类卡片按某种约定排序。

结构化设计概述

结构化设计(Structured Design,简称SD)是将结构化分析得到的数据流图映射成软件体系结构的一种设计方法

强调模块化、自顶向下逐步求精、信息隐蔽、高内聚低耦合等设计准则

结构化设计分为概要设计详细设计两大步骤:

  1. 概要设计:是对软件系统的总体设计,采用结构化设计方法,其任务是:将系统分解成模块,确定每个模块的功能、接口(模块间传递的数据)及其调用关系,并用模块及其对模块的调用来构建软件的体系结构
  2. 详细设计:是对模块实现细节的设计,采用结构化程序设计(Structured Programming,SP)方法

SA、SD和SP构成完整的结构化方法体系

结构图

用结构图(Structure Chert)来描述软件系统的体系结构

描述一个软件系统由哪些模块组成,以及模块之间的调用关系

结构图的基本成分有:模块、调用和数据

结构图中的辅助符

事务流

特征:数据流沿着输入路径到达一个事务中心,事务中心根据输入数据的类型在若干条动作路径中选择一条来执行

事务中心的任务是:

  1. 接收输入数据(即事务);
  2. 分析每个事务的类型;
  3. 根据事务类型选择执行一条动作路径

进行第二季分解

将DFD中的加工映射成结构图中的一个适当的模块

分解步骤

  1. 输入控制模块的分解:从变换中心的边界开始,沿着输入路径向外移动,把输入路径上的每个加工映射成结构图中受输入控制模块控制的一个低层模块
  2. 输出控制模块的分解:从变换中心的边界开始,沿着输出路径向外移动,把输出路径上的每个加工映射成结构图中受输出控制模块控制的一个低层模块
  3. 变换控制模块的分解:把变换中心的每个加工映射成结构图中受变换控制模块控制的一个低层模块

“统计成绩”第二级分解的结构图

事务分析的步骤

确定事务中心:事务中心位于数条动作路径的起点,这些动作路径呈幅射状从该点流出

将DFD映射成事务型的结构图

分解每条动作路径所对应的结构图

  1. 接收模块的分解:从事务中心开始,沿着输入路径向外移动,把输入路径上的每个加工映射成结构图中受接收模块控制的一个低层模块
  2. 动作路径控制模块的分解:首先确定每条动作路径的流类型(变换流或事务流),然后,运用变换分析或事务分析,将每条动作路径映射成与其流特性相对应的以动作路径控制模块为根模块的结构图

分层DFD的映射

  • 0层图反映了系统由哪些子系统组成,此时可先将0层图映射成下图中的结构
  • 0层图每个加工的DFD子图可映射成以相应模块为根模块的结构子图
  • 如果DFD子图中的加工还可分解成一张子图,则再将其映射成以相应模块为根模块的结构子图
  • 依次一层一层分解下去得到最终的初始结构图
  • 如果初始结构图太大,我们也可以将它组织成分层的结构图

软件工程导论05-结构化分析与设计

初始结构图的改进

  • 对结构图改进的依据就是观察这种改进是否符合软件设计的准则和启发式设计策略

  • 因此结构图的改进没有明显的步骤,也很难定义终止条件

  • 设计改进往往伴随着折中

    例如提取多个模块中的相同功能可以提高模块的独立性和复用程度,但会增加模块间的联系

  • 改进往往不是一次完成的,需要进行多次的反复,有时还需要在多个改进方案进行选择

结构图改进技巧

  • 减少模块间的耦合度
  • 消除重复功能
  • 消除“管道”模块
  • 模块的大小适中
  • 避免高扇出
  • 应尽可能研究整张结构图,而不是只考虑其中的一部分

小结

  1. 结构化方法是一种传统的面向数据流开发方法
  2. 以数据流为中心构建软件的分析模型和设计模型
  3. 结构化分析方面,本章介绍结构化分析的基本思想和分析过程,详细介绍了分层数据流图的画法分层数据流图的审查数据字典各条目的描述内容以及基本加工说明的描述方法
  4. 结构化设计方面,本章介绍如何将分析的结果(DFD)映射成初始的程序结构图,包括变换分析和事务分析,并介绍对初始结构图的优化

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年2月7日
下一篇 2021年2月7日

相关推荐