系统架构设计笔记(35)—— 结构化分析与设计
发布日期:2021-06-29 21:04:25 浏览次数:2 分类:技术文章

本文共 5598 字,大约阅读时间需要 18 分钟。

结构化分析与设计方法是一种面向数据流的需求分析和设计方法,它适用于分析和设计大型数据处理系统,是一种简单 、 实用的方法,曾获得广泛的应用。

1 结构化分析

结构化分析方法的基本思想是自顶向下逐层分解。分解和抽象是人们控制问题复杂性的两种基本手段。对于一个复杂的问题,人们很难一下子考虑问题的所有方面和全部细节,通常可以把一个大问题分解成若干个小问题,每个小问题再分解成若干个更小的问题,经过多次逐层分解,每个最底层的问题都是足够简单 、 容易解决的,于是复杂的问题也就迎刃而解了。这个过程就是分解过程。

结构化分析与面向对象分析方法之间的最大差别是:结构化分析方法把系统看作一个过程的集合体,包括人完成的和电脑完成的;而面向对象方法则把系统看成一个相互影响的对象集。

结构化分析方法的特点是利用数据流图来帮助人们理解问题,对问题进行分析。结构化分析一般包括以下工具:数据流图( Data Flow Diagram , DFD ) 、 数据字典( Data Dictionary , DD ) 、 结构化语言 、 判定表 、 判定树。

在接下来的部分将对它们一一做简单介绍。结构化系统分析方法从总体上来看是一种强烈依赖数据流图的自顶向下的建模方法。它不仅是需求分析技术,也是完成需求规格化的有效技术手段。

1.1 结构化分析的工作步骤

在介绍具体的结构化分析方法之前,先对如何进行结构化分析做一个总结性描述,以帮助大家更好地应用该方法。

(1)研究“物质环境”

首先,应画出当前系统(可能是非计算机系统,或是半计算机系统)的数据流图,说明系统的输入 、 输出数据流,说明系统的数据流情况,以及经历了哪些处理过程。在这个数据流图中,可以包括一些非计算机系统中数据流及处理的命名,例如部门名 、 岗位名 、 报表名等。这个过程可以帮助分析员有效地理解业务环境,在与用户的充分沟通与交流中完成。

(2)建立系统逻辑模型

当物理模型建立完成之后,接下来的工作就是画出相对于真实系统的等价逻辑数据流图。在前一步骤建立的数据流图的基础上,将所有自然数据流都转成等价的逻辑流,例如,将现实世界的报表存储在计算机系统中的文件里;又如将现实世界中 “ 送往总经理办公室 ” 改为 “ 报送报表 ” 。

(3)划清人机界限

最后,确定在系统逻辑模型中,哪些将采用自动化完成,哪些仍然保留手工操作。这样,就可以清晰地划清系统的范围。

1.2 数据流图

DFD 是一种图形化的系统模型,它在一张图中展示信息系统的主要需求,即输入 、 输出 、 处理(过程) 、 数据存储。由于从 DFD 中可以很容易地看出系统紧密结合的各个部分,而且整个图形模式只有5个符号需要记忆,所以深受分析人员的喜爱,因而广为流行。如图 1 所示, DFD 中包括以下几个基本元素。

(1)数据流图的层次

正如前面提到的,结构化分析的思路是依赖于数据流图进行自顶而下的分析。这也是因为系统通常比较复杂,很难在一张图上将所有的数据流和加工描述清楚。因此,数据流图提供一种表现系统高层和低层概念的机制。也就是先绘制一张较高层次的数据流图,然后在此基础上,对其中的过程(处理)进行分解,分解成为若干独立的 、 低层次的 、 详细的数据流图,而且可以这样逐一地分解下去,直至系统被清晰地描述出来。数据流图的层次如图 2 所示。

(2)Context 图

Context 图,也就是系统上下文范围关系图。这是描述系统最高层结构的 DFD 图。它的特点是,将整个待开发的系统表示为一个过程,将所有的外部实体和进出系统的数据流都画在一张图中。图 2 就是一个 Context 图的例子。

Context 图用来描述系统有什么输入 、 输出数据流,与哪些外部实体直接相关,可以把整个系统的范围勾画出来。

(3)逐级分解

当完成了 Context 图的建模之后,就可以在此基础上进行进一步的分解。以图 3 为例,进行再分解,在对原有流程了解的基础上,可以得到如图 4 所示的结果。

图 4 是在 Context 图的基础上做的第一次分解,而在 Context 图中只有一个过程,那就是系统,将其编号为 0 。 而接下来对 Context 图进行的分解,其实就是对这个编号为 0 的过程进行更细化的描述,在这里引入了新的过程 、 数据存储,为了能够区分其位置的级别,在这层次上的过程将以1 、 2 、 3为序列进行编号。由于这是对过程 0 的分解,因此也称之为DFD 0 层图。而可以根据需要对DFD 0 层图上的过程(编号为1 、 2 、 3)进行类似的分解,那么就称之为 DFD1 层图,在 DFD1 层图中引入的新过程,其编号规则就是 1.1 , 1.2… ,以及 2.1 , 2.2… ,以此类推,直到完成分析工作。

另外,这里存在一个很关键的要点,那就是 DFD0 层图是 Context 图的细化,因此所有的输入和输出应该与 Context 图完全一致,否则就说明存在错误。

(4)如何画 DFD

DFD 的绘制是一个自顶向下 、 由外到里的过程,通常按照以下几个步骤进行。

  1. 画系统的输入和输出:就是在图的边缘标出系统的输入、输出数据流。这一步其实是决定研究的内容和系统的范围。在画的时候,可以先将尽可能多的输入、输出画出来,然后再删除多余的,增加遗漏的。
  2. 画数据流图的内部:将系统的输入、输出用一系列的处理连接起来,可以从输入数据流画向输出数据流,也可以从中间画出去。
  3. 为每一个数据流命名:命名的好坏与数据流图的可理解性密切相关,应避免使用空洞的名字。
  4. 为加工命名:注意应该使用动宾短语。
  5. 不考虑初始化和终点,暂不考虑出错路径等细节,不画控制流和控制信息。

1.3 细化记录 DFD 部件

为了更好地描述 DFD 的部件,结构化分析方法还引入了数据字典 、 结构化语言及决策树 、 决策表等方法。通过使用这些工具,能对数据流图中描述不够清晰的地方进行有效的补充。

其中数据字典应用最为广泛,下面将详细说明数据字典的相关使用方法。数据字典技术是一种很实用 、 有效的表达数据格式的手段。它是对所有与系统相关的数据元素的一个有组织的列表和精确严格的定义,使得用户和系统分析员对于输入 、 输出 、 存储成分和中间计算机有共同的理解。

通常数据字典的每一个条目中包括以下信息。

① 名称:数据或控制项、数据存储或外部实体的主要名称,如果有别名的还应该将别名列出来。

② 何处使用/如何使用:使用数据或控制项的加工列表,以及如何使用。
③ 内容描述:说明该条目的内容组成,通常采用以下符号进行说明。

符号 说明
= 由…构成。
+ 和,代表顺序连接的关系。
[ | ] 或,代表从中选择一个。
{}* n 次重复。
() 代表可选的数据项。
*…* 表示特定限制的注释。

④ 补充信息:关于数据类型、默认值、限制等信息。

下面就是一个数据字典的实例:

客户基本信息=客户编号+客户名称+身份证号码+手机+家庭电话

客户编号 = {0…9}8
客户名称 = {字}4
身份证号码 = [{0…9}15|{0…9}18]
手机 = [{0…9}11|{0…9}12]
家庭电话 =(区号) +本地号区号 = {0…9}4
本地号 = [{0…9}7|{0…9}8]

2 结构化设计

结构化设计包括架构设计 、 接口设计 、 数据设计和过程设计等任务。它是一种面向数据流的设计方法,是以结构化分析阶段所产生的成果为基础,进一步自顶而下 、 逐步求精和模块化的过程。

2.1 概要设计与详细设计的主要任务

概要设计阶段的主要任务是设计软件的结构 、 确定系统是由哪些模块组成,以及每个模块之间的关系。它采用结构图(包括模块 、 调用 、 数据)来描述程序的结构,此外还可以使用层次图和 HIPO (层次图加输入 / 处理 / 输出图)。

整个过程主要包括:复查基本系统模型 、 复查并精化数据流图 、 确定数据流图的信息流类型(包括交换流和事务流) 、 根据流类型分别实施变换分析或事务分析 、 根据软件设计原则对得到的软件结构图进一步优化。

而详细设计阶段的主要任务则是确定应该如何具体地实现所要求的系统,得出对目标系统的精确描述。它采用自顶向下 、 逐步求精的设计方式和单入口单出口的控制结构。常使用的工具包括程序流程图 、 盒图 、 PAD( Problem Analysis Diagram ,问题分析图) 、 PDL( Program Design Language ,程序设计语言)。

2.2 结构图

结构图的基本成分包括模块 、 调用(模块之间的调用关系)和数据(模块间传递及处理数据信息)。

结构图是在需求分析阶段产生的数据流图的基础上进行进一步的设计。它将 DFD 图中的信息流分为两种类型。

  • 变换流:信息首先沿着输入通路进入系统,并将其转换为内部表示,然后通过变换中心(加工)的处理,再沿着输出转换为外部形式离开系统。具有这种特性的加工流就是变换流。
  • 事务流:信息首先沿着输入通路进入系统,事务中心根据输入信息的类型在若干个动作序列(活动流)中选择一个执行,这种信息流称为事务流。

2.3 程序流程图和盒图

程序流程图和盒图都是用来描述程序的细节逻辑的,程序流程图的符号如图 5 所示。

程序流程图的特点是简单 、 直观 、 易学,但它的缺点也正是由于其随意性而使得画出来的流程图容易成为非结构化的流程图。而盒图正是为了解决这一问题设计的,它是一种符合结构化程序设计原则的图形描述工具。盒图的主要特点是功能域明确 、 无法任意转移控制 、 容易确定全局数据和局部数据的作用域 、 容易表示嵌套关系 、 可以表示模块的层次结构。但它也带来了一个副作用,那就是修改相对比较困难。

2.4 PAD 和 PDL

PAD (Problem Analysis Diagram)是问题分析图的缩写,它符合自顶向下 、 逐步求精的原则,也符合结构化程序设计的思想,它最大的特点在于能够很方便地转换为程序语言的源程序代码 。

PDL (Process Design Language)则是过程设计语言的缩写,它和高级程序语言很相似,也包括数据说明部分和过程部分,还可以带注解等成分,但它是不可执行的 。PDL 是一种形式化语言,其控制结构的描述是确定的,但内部的描述语法是不确定的 。PDL 通常也被称为伪码。

3 模块设计

在结构化方法中,模块化是一个很重要的概念,它是将一个待开发的软件分解成为若干个小的简单部分 —— 模块,每个模块可以独立地开发 、 测试。这是一种复杂问题的 “ 分而治之 ” 原则,其目的是使程序的结构清晰 、 易于测试与修改。

具体来说,模块是指执行某一特定任务的数据结构和程序代码。通常将模块的接口和功能定义为其外部特性,将模块的局部数据和实现该模块的程序代码称为内部特性。而在模块设计时,最重要的原则就是实现信息隐蔽和模块独立。

模块经常具有连续性,也就意味着作用于系统的小变动将导致行为上的小变化,同时规模说明的小变动也将影响到一小部分模块。

3.1 信息隐蔽原则

信息隐蔽是开发整体程序结构时使用的法则,即将每个程序的成分隐蔽或封装在一个单一的设计模块中,并且尽可能少地暴露其内部的处理。通常将难的决策 、 可能修改的决策 、 数据结构的内部连接以及对它所做的操作细节 、 内部特征码 、 与计算机硬件有关的细节等隐蔽起来。通过信息隐蔽可以提高软件的可修改性 、 可测试性和可移植性,它也是现代软件设计的一个关键性原则。

3.2 模块独立性原则

模块独立是指每个模块完成一个相对独立的特定子功能,并且与其他模块之间的联系最简单。保持模块的高度独立性,也是设计过程中的一个很重要的原则。通常用耦合(模块之间联系的紧密程度)和内聚(模块内部各元素之间联系的紧密程度)两个标准来衡量,设计的目标是高内聚 、 低耦合。模

块的内聚类型通常可以分为7种,根据内聚度从高到低排序,如下表所示。

内聚类型 描述
偶然内聚或巧合内聚 指一个模块内的各处理元素之间没有任何联系。
逻辑内聚 指模块内执行若干个逻辑上相似的功能,通过参数确定该模块完成哪一个功能。
时间内聚 把需要同时执行的动作组合在一起形成的模块。
过程内聚 指一个模块完成多个任务,这些任务必须按指定的过程执行。
通信内聚 指模块内的所有处理元素都在同一数据结构上操作,或者各处理使用相同的输入数据或产生相同的输出数据。
顺序内聚 指一个模块中的各个处理元素都密切相关,且各功能且必须顺序执行,前一个功能元素的输出就是下一个功能的输入。
功能内聚 指模块内的所有元素共同作用完成一个功能,缺一不可。

与此相对应的,模块的耦合性类型通常也分为7种,根据耦合度从低到高排序,如下表所示。

耦合类型 说明
无直接耦合 无直接联系,互不依赖。
数据耦合 借助参数表传递简单数据。
标记耦合 一个数据结构的一部分借助于模块接口传递。
控制耦合 传递的是控制变量,例如开关、标志等。
外部耦合 与软件之外的环境有关,比如I/O环境。
公共耦合 多个模块引用的是同一个全局数据区,比如公共数据环境中的数据。
内容耦合 一个模块访问另一个模块的内部数据;一个模块通过特殊入口进入另一个模块内部;两个模块有一部分程序代码重叠;一个模块有多个入口。

除了满足以上两大基本原则之外,通常在模块分解时还需要注意:

  1. 保持模块的大小适中,尽可能减少调用的深度,直接调用该模块的个数应该尽量大,但调用其他模块的个数则不宜过大;
  2. 保证模块是单入口、单出口的;
  3. 模块的作用域应该在控制域之内;
  4. 功能应该是可预测的。

转载地址:https://deniro.blog.csdn.net/article/details/106455933 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:说说 JavaScript 中的冒泡与捕获过程
下一篇:系统架构设计笔记(34)—— 需求分析与软件设计

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年04月26日 08时32分35秒