【软考向】结构化开发方法 与 数据流图

结构化方法由 结构化分析、结构化设计、结构化程序设计 构成,它是一种 面向数据流 的开发方法。

  • 结构化分析 是根据 分解与抽象 的原则,按照系统中数据处理的流程,用 数据流图 来建立系统的 功能模型 ,从而完成 需求分析 工作。
  • 结构化设计 是根据模块独立性准则、软件结构优化准则将数据流图转换为软件的体系结构,用 软件结构图 来建立系统的 物理模型 ,实现系统的 概要设计。
  • 结构化程序设计 使用 3 种基本控制结构构造程序,任何程序都可以由 顺序、选择和重复 3 种基本控制结构构造。

结构化方法总的指导思想是 自顶向下、逐层分解,它的 基本原则是功能的分解与抽象。

  • 是软件工程中 最早出现 的开发方法,
  • 特别适合于 数据处理领域 的问题,
  • 不适合解决大规模的、特别复杂的项目,且难以适应需求的变化

1 系统分析

系统分析需要:

收集资料 -> 了解现有组织管理状况、用户对信息系统功能的需求、数据和业务流程等 -> 提出各种设想 -> 对所有设想和方案进行分析、研究、比较、判断和选择,获得一个最优的新系统的逻辑模型 -> 提交系统分析报告,即 系统方案说明书

逻辑模型 反映了系统的功能和性质,而物理模型反映的是系统的某一种具体实现方案。

系统开发的目的是把现有系统的物理模型转化为目标系统的物理模型,而 系统分析阶段的结果是得到目标系统的逻辑模型

2 系统设计

系统设计的基本原理

  1. 抽象 :繁化简,抽出实体的本质,忽略非本质。抽象的最底层就是实现该软件的源程序代码。
  2. 模块化 :分而治之,将一个待开发的软件 分解成若干个小模块,每个模块可 独立 地开发、测试,最后 组装 成完整的程序。
  3. 信息隐蔽 :在设计时先列出一些 可能发生变化的因素 ,在划分模块时将一个可能发生变化的因素 隐蔽在某个模块的内部 ,使 其他模块与这个因素无关。当这个因素发生变化时,只需修改含有这个因素的模块,而与其他模块无关。
  4. 模块独立 :模块独立是指 每个模块完成一个相对独立的特定子功能,并且与其他模块之间的联系简单。衡量模块独立程度的标准有两个:耦合性和内聚性。

在将软件系统划分模块时,应尽量做到 高内聚、低耦合,提高模块的独立性。

耦合是模块之间互相连接 紧密程度 的度量。

耦合类型 定义 典型例子
无直接耦合 两个模块间没有任何调用或数据依赖,完全独立 在同一程序中,一个模块负责"计算税后收入",另一个模块负责"生成贷款合同",两者互不调用,也不共享任何数据或全局变量。
数据耦合 两个模块通过简单数据值 (如整型、字符串等)进行交互,等同于高级语言中的值传递 模块 A 调用 printResult(int result) 将计算结果以整数形式传给模块 B 打印,而不涉及任何复杂结构。
标记耦合 两个模块之间传递的是数据结构(如记录、对象、结构体) 模块 A 将 Student 结构体(含姓名、学号、成绩等)整体传给模块 B,B 只读取其中的学号和姓名进行处理。
控制耦合 模块 A 调用模块 B 时传递控制变量 (如开关或标志),被调用模块哪个功能起作用受调用模块控制 调用 sort(int[] arr, boolean ascending),其中 ascending 控制模块 B 执行升序或降序排序。
外部耦合 模块间通过软件外部的环境耦合,例如共同依赖于某种 I/O 设备、文件格式或通信协议 两个处理模块共同读写同一个 CSV 文件,且严格依赖该文件格式,不通过参数传递任何数据,只通过文件系统交换信息。
公共耦合 模块之间通过共享的全局数据环境(如全局变量、全局配置对象、数据库等)进行交互 多个服务模块都直接访问和修改同一个全局配置对象 GlobalConfig,通过该对象交换信息。
内容耦合 一个模块直接使用或修改另一个模块的内部数据,或通过非正常入口(如跳转、共享代码段)进入对方内部 模块 A 直接操作模块 B 的私有数组 otherModule.internalArray,例如 otherModule.internalArray[0] = 42

内聚是对 一个模块内部各个元素彼此结合的紧密程度 的度量。一个内聚程度高的模块(在理想情况下)应当只做一件事。

内聚类型 定义 典型例子
偶然内聚 模块内的各处理元素彼此无关,只是因为它们被偶然地放在同一个模块中 一个"工具库"模块同时包含文件打印、日志格式化、网络下载等不相关函数。
逻辑内聚 模块内执行若干逻辑上相似的功能,通过一个控制参数决定具体执行哪一个功能 一个 processItem(type, data) 函数,根据 type 值(如 "print""save""send")分别执行打印、保存、发送三种操作。
时间内聚 在同一时间点必须一起执行的操作组合在一个模块中,通常在系统启动、初始化或关机时调用 一个 systemInit() 模块,依次完成配置加载、日志初始化、连接数据库、启动监控等一系列启动时操作。
过程内聚 模块完成多个必须按特定顺序执行的任务,各任务之间有先后依赖但功能上可视为独立步骤 一个 checkoutOrder() 模块,依次执行"计算总价 → 验证库存 → 生成订单记录 → 发送确认邮件"。
通信内聚 模块内所有处理元素都在同一个数据结构或同一份输入/输出数据上操作,关注同一份信息 一个 ReportGenerator 模块,包含读取原始数据、过滤、格式化、生成报表等多个函数,全部以同一个 DataSet 对象为输入/输出。
顺序内聚 模块内的各个处理元素紧密相关,且必须按严格顺序执行前一个元素的输出即为下一个元素的输入 一个 encryptAndSend(data) 模块,先执行 encrypt(data) → compress(encrypted) → transmit(compressed)
功能内聚 模块内的所有元素共同作用完成一个功能,缺一不可 一个 calculateTax(income) 模块,只做一件事:根据收入计算税额,内部可能有各种检查、算法,但都是为"计算税额"这一功能服务。

系统总体结构设计

模块结构图 是结构化设计中描述 系统结构 的图形工具。模块结构图主要关心的是模块的外部属性 ,即上下级模块、同级模块之间的数据传递和调用关系,并不关心模块的内部。

  • 调用箭头总是由调用模块指向被调用模块,但是应该理解被调用模块执行后又返回到调用模块。
  • 判断调用 :一个模块是否调用一个从属模块,取决于调用模块内部的判断条件,用菱形符号表示。
  • 循环调用 :一个模块通过其内部的循环功能来循环调用一个或多个从属模块,用弧形箭头表示。
  • 数据:在模块之间传送的数据,使用与调用箭头平行的带空心圆的箭头表示,并在旁边标上数据名。(a) 表示模块 A 调用模块 B 时,A 将数据 x、y 传送给 B,B 将处理结果数据返回给 A。
  • 控制信息 :控制信息与数据的主要区别是前者 只反映数据的某种状态,不必进行处理。图 (b) 中的"无此职工"就是用来表示送来的职工号有误的控制信息。
  • 转接符号 :当模块结构图在一张纸上画不下,需要转接到另一张纸上,或者为了避免图上线条交叉时,都可以使用转接符号,圆圈内加上标号

3 结构化分析方法

数据流图(DFD)

数据流图 也称数据流程图(Data Flow Diagram, DFD),便于分析系统数据流程 。它摆脱了系统的物理内容,精确地 在逻辑上描述系统的功能、输入、输出和数据存储等,是系统逻辑模型的重要组成部分。

数据流图中的基本图形元素 包括 数据流(Data Flow)、加工(Process)、数据存储(Data Store)和外部实体(External Agent)。

  • 数据流、加工和数据存储 用于构建软件系统内部的数据处理模型;
  • 外部实体 表示存在于系统之外的对象,表明 系统数据的来源和去向

注意,DFD 中描述的是数据流,而不是控制流。

  • 数据流 :表示数据的流向
    • 一个加工流向另一个加工 、从加工流向数据存储 (写)、从数据存储流向加工 (读)、从外部实体流向加工 (输入)、从加工流向外部实体(输出)。
    • 除了流向数据存储或从数据存储流出的数据流不必命名外,每个数据流都必须有一个 合适的名字以反映该数据流的含义
  • 加工 :加工描述了输入数据流到输出数据流之间的变换 ,也就是输入数据流经过什么处理后变成了输出数据流。
    • 每个加工都有一个名字和编号。编号能反映出该加工位于分层 DFD 中的哪个层次和哪张图中,也能够看出它是哪个加工分解出来的子加工。
    • 一个加工至少有一个输入数据流和一个输出数据流
  • 数据存储 :数据存储用来存储数据
  • 外部实体 :指存在于软件系统之外的人员或组织,它指出系统所需数据的发源地(源)和系统所产生的数据的归宿地(宿)
    • 例如,对于一个考务处理系统而言,考生向系统提供报名单(输入数据流),所以考生是考务处理系统的一个源;
    • 而考务处理系统要将考试成绩的统计分析表(输出数据流)传递给考试中心,所以考试中心是该系统的一个宿。

数据流图中的常见错误:

数据流图的扩充符号:

  • 星号( ∗ * ∗) :表示数据流之间存在""关系。如果是输入流则表示所有输入数据流全部到达后才能进行加工处理;如果是输出流则表示加工结束将同时产生所有的输出数据流。
  • 加号( + + +) :表示数据流之间存在""关系。如果是输入流则表示其中任何一个输入数据流到达后就能进行加工处理;如果是输出流则表示加工处理的结果是至少产生其中一个输出数据流。
  • 异或( ⊕ ⊕ ⊕) :表示数据流之间存在"互斥"关系。如果是输入流则表示当且仅当其中一个输入流到达后才能进行加工处理;如果是输出流则表示加工处理的结果是仅产生这些输出数据流中的一个。

根据自顶向下逐层分解,构成一套分层数据流图,每张图中的加工个数可大致控制在"7 加减2"的范围内。

  • 顶层图 :只有一张图,只有一个加工 ,代表整个软件系统,该加工描述了软件系统与外界之间的数据流。该加工不必编号
  • 0 层图 :顶层图中的加工(即系统)经分解后的图,也只有一张。0 层图中的加工编号分别为 1、2、3・・・
  • 底层图:处于分层数据流图最底层的图,所有的加工不再进行分解。
  • 中间层 :分层数据流图中的其他图,其中至少有一个加工(也可以是所有加工)被分解成一张子图。子图号就是父图中被分解的加工号 ,若父图中的加工号为 x x x 的加工分解成某一子图,则该子图中的加工编号分别为 x . 1 x.1 x.1、 x . 2 x.2 x.2、 x . 3 x.3 x.3・・・。

在整套分层数据流图中,凡是不再分解成子图的加工称为基本加工

下面以某 考务处理系统 为例介绍分层数据流图的画法。考务处理系统的功能需求如下。

① 对 考生 送来的 报名单 进行检查。

② 对 合格的报名单 编好准考证号后将 准考证 送给 考生,并将汇总后的 考生名单 送给 阅卷站。

③ 对 阅卷站 送来的 成绩清单 进行检查,并根据 考试中心 指定的 合格标准 审定合格者。

④制作 考生通知单 (内含成绩合格/不合格标志)送给 考生。

⑤ 按地区、年龄、文化程度、职业和考试级别等进行成绩分类统计和试题难度分析,产

统计分析表

部分数据流的组成如下。

报名单 = 地区 + 序号 + 姓名 + 文化程度+ 职业 + 考试级别 + 通信地址

正式报名单 = 准考证号 + 报名单

准考证 = 地区 + 序号 + 姓名 + 准考证号 + 考试级别+考场

考生名单 = {准考证号 + 考试级别 }(其中,{w}表示w重复多次)

考生名册 = 正式报名单

统计分析表 = 分类统计表 + 难度分析表

考生通知单 = 准考证号 + 姓名 + 通信地址 + 考试级别 + 考试成绩 + 合格标志

Step1. 画系统的输入和输出顶层图

描述系统从哪些外部实体接收数据流,以及系统发送数据流到哪些外部实体。上述标黄字体是外部实体,找出它们!

Step2. 画系统的内部分解顶层图的加工

  • 将顶层图的加工分解成若干个加工,并用数据流将这些加工连接起来,使得顶层图中的输入数据经过若干个加工处理后变换成顶层图的输出数据流,这张图称为 0 层图。
  • 在分解的子图中,如果需要保存某些中间数据,以备以后使用,那么可以将这些数据组成一个新的文件。

在考务处理系统的 0 层图中,采用 功能分解方法 来确定加工。分析系统的需求说明,可知系统的功能主要分为 考试报名 及 统计成绩 两大部分,其中,报名工作在考试前进行,统计成绩工作在考试后进行。

为此,定义两个加工:登记报名表 和 统计成绩 。0 层图中的数据流,除了继承顶层图中的输入/输出数据流外,还应定义这两个加工之间的数据流 。由于这两个加工分别在考试前后进行,并不存在直接关系,因此,"登记报名表"所产生的结果"考生名册"应作为 数据存储,以便考试后由"统计成绩"读取。

Step3. 画加工的内部:分解加工

下面介绍考务处理系统 0 层图中加工 1 的分解,这里 根据业务处理流程 来确定加工 1 的分解。分析考务处理系统的功能需求和 0 层图,将加工 1 分解成 3 个子加工:检查报名表、编准考证号和登记考生。

采用同样的方法画出加工 2 分解的 DFD 子图。重复第 3 步的分解,直到图中尚未分解的加工都足够简单(也就是说,这种加工不必再分解)。

在一套完整的分层 DFD 中,任何一个数据存储 都应有写和读的数据流,否则这个文件就没有存在的必要。除非这个数据存储的建立是为另一个软件系统使用或者这个数据存储是由另一个软件系统产生和维护的。

数据字典(DD)

数据流图描述了系统的分解,但没有对图中各成分进行说明。数据字典 就是 为数据流图中 的每个数据流、文件、加工,以及组成数据流或文件的数据项 做出说明

数据字典有以下 4 类条目:数据流、数据项、数据存储和基本加工。数据项是组成数据流和数据存储的最小元素。源点、终点不在系统之内,故一般不在字典中说明。


加工逻辑也称为"小说明"。常用的加工逻辑描述方法有 结构化语言、判定表和判定树 3种。

  • 结构化语言 没有严格的语法,它的结构通常可分为内层和外层。外层有严格的语法,内层的语法接近于自然语言的描述。

    • 外层。用来描述控制结构,采用顺序、选择和重复3种基本结构。
      • 顺序结构。一组祈使语句、选择语句、重复语句的顺序排列。祈使语句是指至少包含一个动词及一个名词,指出要执行的动作及接受动作的对象。
      • 选择结构。一般用 IF-THEN-ELSE-ENDIFCASE-OF-ENDCASE 等关键词。
      • 重复结构。一般用 DO-WHILE-ENDDOREPEAT-UNTIL 等关键词。
    • 内层。一般采用祈使语句的自然语言短语,使用数据字典中的名词和有限的自定义词,其动词含义要具体,尽量不用形容词和副词来修饰,还可使用一些简单的算法运算和逻辑运算符号。
  • 判定表 能够清楚地表示复杂的条件组合与应做的动作 之间的对应关系。判定表由4个部分组成,用双线分割成4个区域,

  • 判定树是判定表的变形,一般情况下它比判定表更直观,且易于理解和使用。

4 结构化设计方法

结构化设计方法中用 结构图 (Structure Chart)来描述 软件系统的体系结构,指出一个软件系统由哪些模块组成,以及模块之间的调用关系。

结构化设计大致可以分为两步进行,

  • 第一步是建立一个满足软件需求规约的 初始结构图
  • 第二步是对结构图进行改进。

在概要设计完成之后应书写设计规格说明 ,特别要为每个模块书写模块的功能、接口、约

束和限制等,最后对设计结果及文档进行评审

结构化设计是将 结构化分析的结果(数据流图) 映射成 软件的体系结构(结构图) 。根据信息流的特点,可将数据流图分为变换型数据流图事务型数据流图 ,其对应的映射分别称为变换分析事务分析

DFD 的信息流大体上可以分为两种类型:变换流和事务流。

  • 变换流 。信息沿着输入通路 进入系统,同时将信息的外部形式转换成内部表示,然后通过变换中心(也称主加工)处理 ,再沿着输出通路 转换成外部形式离开系统。变换流型的 DFD 可以明显地分成 输入、变换(主加工)和输出 三大部分。
  • 事务流 。信息沿着输入通路 到达一个事务中心 ,事务中心根据输入信息(即事务)的类型在若干个动作序列(称为活动流)中选择一个来执行 ,这种信息流称为事务流。事务流有
    明显的事务中心,各活动流以事务中心为起点呈辐射状流出。

变换分析

变换分析是从变换流型的 DFD 导出程序结构图

  1. 确定输入流和输出流,分离出变换中心
    • 把 DFD 中系统输入端的数据流称为物理输入 ,系统输出端的数据流称为物理输出
    • 物理输入通常要经过编辑、格式转换、合法性检查、预处理等辅助性的加工才能为主加工的真正输入(称为逻辑输入)。
    • 从物理输入端开始,一步步向系统的中间移动,可找到离物理输入端最远、但仍可被看作系统输入的那个数据流,这个数据流就是逻辑输入
    • 从物理输出端开始,一步步向系统的中间移动,可找到离物理输出端最远、但仍可被看作系统输出的那个数据流,这个数据流就是逻辑输出
    • DFD 中从物理输入到逻辑输入的部分构成系统的输入流,从逻辑输出到物理输出的部分构成系统的输出流,位于输入流和输出流之间的部分就是变换中心
  2. 第一级分解 ,设计模块结构的顶层和第一层。
    • 顶层模块的功能就是整个系统的功能
    • 输入控制模块用来接收所有的输入数据;
    • 变换控制模块用来实现输入到输出的变换;
    • 输出控制模块用来产生所有的输出数据。
  3. 第二级分解 ,设计中、下层模块。
    • 输入控制模块的分解。从变换中心的边界开始,沿着每条输入通路,把输入通路上的每个加工映射成输入控制模块的一个低层模块。
    • 输出控制模块的分解。从变换中心的边界开始,沿着每条输出通路,把输出通路上的每个加工映射成输出控制模块的一个低层模块。
    • 变换控制模块的分解。变换控制模块通常没有通用的分解方法,应根据 DFD 中变换部分的实际情况进行设计。
  4. 事务分析 ,从事务流型 DFD 导出程序结构图。

相关推荐
奔跑吧邓邓子4 天前
【软考中级网络工程师】知识点之网关协议深度剖析
网络工程师·软考·网关协议·中级
奔跑吧邓邓子12 天前
【软考中级网络工程师】知识点之 STP 协议,网络的 “交通协管员”
网络工程师·软考·中级·stp协议
奔跑吧邓邓子14 天前
【软考中级网络工程师】知识点之 RIP 协议
网络工程师·软考·rip协议·中级
奔跑吧邓邓子15 天前
【软考中级网络工程师】知识点之级联
网络工程师·软考·级联·中级
奔跑吧邓邓子15 天前
【软考中级网络工程师】知识点之堆叠
网络工程师·软考·中级
moton20171 个月前
【软件系统架构】系列七:系统性能——路由器性能深入解析
系统架构·路由器·软考·吞吐量·软件系统架构·并发连接数·转发延迟
学习菌子1 个月前
第11章:【系统架构设计师】项目管理
系统架构·项目管理·软考高级·软考·软考系统架构设计师
June bug1 个月前
【软考中级·软件评测师】下午题·面向对象测试之架构考点全析:分层、分布式、微内核与事件驱动
经验分享·分布式·职场和发展·架构·学习方法·测试·软考
红衣女妖仙3 个月前
系统架构设计综合知识与案例分析
系统架构·软考高级·软考·架构设计·高级
谷新龙0013 个月前
软考-系统架构设计师-第七章 软件工程基础知识
系统架构·软件工程·软考·系统架构设计师