软件工程之结构化分析与设计

大耗子 2020年03月27日 320次浏览

文章链接:https://codemouse.online/archives/2020-03-27132020

结构化分析方法概述

  • 一种面向数据流的传统软件开发方法,以数据流为中心构建软件的分析模型和设计模型

  • 分为:

    1. 结构化分析(Structured Analysis 简称SA)
    2. 结构化设计(Structuresd Design 简称SD)
    3. 结构化程序设计(Structured Programmin 简称SP)
  • 主要思想:抽象与自顶向下的逐层分解

  • 关系
    关系

数据流图

  • 概念:Data Flow Diagram(简称DFD):描述输入数据流到输出数据流的变换(即加工)过程,用于对系统的功能建模。

  • 基本元素

    数据流:箭头表示,由一组固定成分的数据组成,代表数据的流动方向。

    加工:圆圈表示,描述了输入数据流到输出数据流的变换

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

    源或宿:长方框表示,输入数据的来源输出数据的去向

  • 示例:图书订购系统DFD

    图书订购系统DFD

  • 分层:根据自顶向下逐层分解的思想将数据流图画成层次结构,每个层次画在独立的数据流图中,加工个数可大致控制在“7加减2”的范围中。

  • 示例——资格和水平考试的考务处理系统

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

考务处理系统顶层图:
考务处理系统顶层图

考务处理系统0层图:
考务处理系统0层图

  • 步骤

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

分层数据流图的审查

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

  • 两大特性:

    一致性:分层DFD中不存在矛盾和冲突。

    完整性:是否有遗漏的数据流、加工等。

分层数据流图的一致性

  1. 父图与子图平衡
  2. 数据守恒
  3. 局部文件:在从最外层到内存过程中,第一次出现的时候(父图),一定要有读和写,而在后面的子图中,只会出现读或者写。
  4. 一个加工的输出数据流不能与该加工的输入数据流同名
  • 父图与子图不平衡的实例
    父图与子图不平衡的实例

  • 父图与子图平衡的实例
    父图与子图平衡的实例

  • 数据不守恒的实例
    数据不守恒的实例

  • 局部文件示例
    局部文件示例

  • 加工的输出/输入数据流不能同名

    • 同一个加工的输出数据流和输入数据流即使组成成份相同,仍应对它们取不同的名字,以表示它们是不同数据流

    • 例如,“报名单”和“合格报名单”

    • 允许一个加工有二个相同的数据流分别流向二个不同加工

分层数据流图的完整性

  1. 每个加工至少有一个输入数据流和一个输出数据流。
  2. 在整套分层数据流中,每个文件至少有一个加工读该文件,有另一个加工写该文件。
  3. 分层数据流图中的每个数据流和文件都必须命名(除了流入或流出文件的数据流) 。
  4. 分层DFD中的每个基本加工(即不再分解子图的加工)都应有一个加工规约。
  • 其它需注意的问题

    1. 适当命名

    2. 画数据流而不是画控制流

    3. 避免一个加工有过多的数据流

    4. 分解尽可能均匀

    5. 先考虑稳定状态,忽略琐碎的枝节

    6. 随时准备重画

  • 数据流图重新分解示例
    数据流图重新分解示例

  • 分解的程度

    • 7加减2

    • 分解应自然,概念上合理、清晰

    • 只要不影响DFD的易理解性,可适当多分解几个加工,以减少层数

    • 一般说来,上层分解得快些(即多分解几个加工),下层分解得慢些(即少分解几个加工)

    • 分解要均匀

数据字典

  1. 数据字典条目包括:数据流、文件、数据项、加工、源或宿
  2. 由辅助绘制DFD的工具自动产生
  3. 专用软件工具或者常用程序
  4. 为每个字典条目人工制作一张卡片

结构化设计概述

  • 概念:结构化设计(Structured Design)是将结构化分析得到的数据流图映射成软件体系结构的设计方法
  • SA(分析)、SD(设计)和SP(程序设计)构成完整的结构化方法体系

结构图

  • 结构图(Structure Chart)描述软件系统体系结构,描述系统由哪些模块组成,模块之间的调用关系
  • 结构图的基本成分有:模块、调用和数据
  • 图中的abcd是表示数据,方框是表示模块,调用关系是通过箭头来表示的。
    结构图

启发式设计策略

  • 改造程序结构图,降低耦合度,提高内聚度
  • 避免高扇出,并随着深度的增加,力求高扇入
  • 降低模块接口的复杂程度和冗余程度,提高一致性
  • 模块的功能应是可预测的,避免对模块施加过多限制
  • 尽可能设计单入口和单出口的模块
    启发式设计策略

结构化设计的步骤

  1. 建立初始结构图
  2. 对结构图进行改进
  3. 书写设计文档
  4. 设计评审

初始结构图的映射

数据流图到软件体系结构的映射

  • 概念:结构化设计是将结构化分析的结果(数据流图)映射成软件的体系结构(结构图)
  • 变换型数据流图 ---> 变换分析
  • 事务型数据流图 ---> 事务分析

变换流

  • 特征:数据流图可明显地分成输入、变换、输出
    变换流

事务流

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

数据流图映射到结构图的步骤

  1. 复审和精化数据流图
  2. 确定数据流图的类型(变换型、事务型)
  3. 采用变换分析或事务分析将DFD映射成初始结构图
  4. 改进初始结构图

变换分析

  • 任务:将变换型DFD映射成初始结构图
  • 步骤:
  1. 划定输入流和输出流的边界,确定变换中心
  2. 进行第一级分解:将DFD映射成变换型的程序结构
  3. 进行第二级分解:将DFD中的加工映射成结构图中的一个适当的模块
  4. 标注输入输出信息:根据DFD,在初始结构图上标注模块之间传递的输入和输出

确定输入/出流边界和变换中心

相关概念:

  • 物理输入:指系统输入端的数据流
  • 物理输出:指系统输出端的数据流
  • 逻辑输入:指变换中心的输入数据流
  • 逻辑输出:指变换中心的输出数据流

基本步骤:

  • 确定逻辑输入
  • 确定逻辑输出
  • 确定变换中心

示例:统计成绩子图的输入、输出流边界

统计成绩子图的输入、输出流边界

进行第一级分解

第一级分解

进行第二级分解

第二级分解

  • 分解步骤如下

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

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

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

事务分析

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

    实例:银行业务

  • 事务型的结构图如图所示,包括:
    事务型的结构图

事务分析的步骤

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

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

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

    接收模块的分解
    动作路径控制模块的分解

分层DFD的映射

  • 0层图
  • 0层图每个加工层层分解
    0层图每个加工层层分解

初始结构图的改进

  • 依据:软件设计准则和启发式设计策略,很难定义终止条件
  • 设计改进伴随折中

“考试报名”初始结构图

考试报名初始结构图

“考试报名”结构图的改进-1

由于检查报名和输入报名可以一起完成,而打印报名单出错信息可以在检查报名单后干,直接合并在一起,变成输入并检查报名单。

  • “考试报名”部分的结构图:
    “考试报名”结构图的改进-1

“考试报名”结构图的改进-2

因为编准考试可以直接打印,登记考生后也是直接输出,所以直接将他们直接合并。

“考试报名”结构图的改进-2

“考试报名”结构图的改进-3

输入控制,报名处理和输出控制没有实质作用,应该作为管道模块 可以直接融合进考试报名中。

“考试报名”结构图的改进-3

局部改进后的“考务处理系统”结构图

局部改进后的结构图

“考务处理系统”结构图的整体改进

由于分析试题难度和分类统计跟统计成绩没有特别大的联系,所以可以直接提出来做一个菜单,属于自己判断,可以放,可以不放。

结构图的整体改进

结构图改进技巧

  1. 减少模块间的耦合度:高内聚,低耦合。
  2. 消除重复功能
  3. 消除“管道”模块
  4. 模块的大小适中:控制在几十条,太大不好控制内聚度。
  5. 避免高扇出:避免像(a)这样的平铺形式,最后是和(b)这样的。
    高扇分解
  6. 应尽可能研究整张结构图,而不是只考虑其中的一部分