结构化分析方法的概念
「软件开发方法」的含义:软件开发过程所遵循的办法和步骤。
软件开发活动的目的:有效地得到一个运行的系统及其支持文档(程序 + 文档),并且满足有关的质量要求(功能需求 + 非功能需求)。
「软件开发方法学」的含义:规则、方法和工具的集成,即支持开发也支持以后的演化过程(交付运行后,系统还会变化;或者为了改错,或为了功能的递增)。
结构化方法的组成
结构化方法是一种特定的软件开发方法学/一种系统化的软件开发方法,包括:
- 结构化分析方法;
- 结构化设计方法;
- 结构化程序设计方法;
结构化分析
就软件需求分析而言,结构化分析指的是:系统化地使用问题域术语,给出该问题的模型(即“系统必须做什么?”的一个估算)。
-
需求分析的目标
对需求陈述进行分析,解决其中的歧义、不一致等问题,以系统化的形式表达用户的需求,即给出问题的形式化或半形式化的描述(称为系统的概念模型,或系统的需求规约或需求规格说明)。作为开发人员和客户间技术契约的基础,并作为而后开发活动的一个基本输入。
-
实现软件需求分析的目标对方法学的需求
- 提供一组术语(符号),指导需求抽象中需要关注的主要方面,并用于表达分析中所使用的信息。这些术语形成一个特定的抽象层,即需求层。
- 依据这些术语所形成的“空间”,给出表达模型的工具,支持表达系统功能形态。
- 给出指导过程,以支持系统化地使用相关信息建造系统模型。
结构化分析模型
基本术语
一个抽象层是由一组确定的术语定义的,为支持需求分析中有关要使用的那些信息的表达,结构化分析方法给出了以下五个术语/符号:
- 数据流、数据存储——支持数据抽象;
- 加工——支持过程/功能的抽象,用于表达系统内涵;
- 数据源、数据潭——支持系统边界抽象,用于表达系统外延;
模型表达工具
DFD 图(数据流图)——表达系统功能模型的工具
数据流图是一种描述数据变换的图形工具,它包含的元素可以是数据流、数据存储、加工、数据源和数据潭等。
数据字典——定义数据流和数据存储
数据字典用于定义数据流和数据存储的结构,并给出构成所给出的数据流和数据存储的各数据项的基本数据类型。
数据字典还引入了一些逻辑操作符来定义数据结构。
操作符 | 描述 |
---|---|
= | 等价于(定义为) |
+ | 与(顺序结构) |
{} | 重复(循环结构) |
[|] | 或(选择结构) |
( ) | 任选 |
m..n | 界域 |
示例:
-
数据流
销售的商品=商品名称+商品编号+单价+数量+销售时间
现金额=余额=日销售额=非负实数
查询要求=[商品编号|日期]
查询要求1=商品编号
查询要求2=日期
销售情况=商品名称+商品编号+金额
-
数据存储
销售文件={销售的商品}
-
数据项(数据流及数据存储的组成成分)
金额=非负实数
...
判定表或判定树等——定义加工小说明
描述加工“做什么”,即加工逻辑,也包括其它一些与加工有关的信息,如执行条件、优先级、执行频率、出错处理等。
描述一个加工,一般遵循如下模版:
加工编号:给出加工编号
加工名:给出该加工的标识
输入流:给出该加工的所有输入数据流
输出流:给出该加工的所有输出数据流
加工逻辑:采用结构化自然语言、判定树或者判定表等工具,给出该加工输入数据和输出数据之间的关系
1. 结构化自然语言
「结构化自然语言」适用于加工的输入数据和输出数据之间的逻辑关系比较简单的加工描述。
示例:
if 20<订单亮
then 订单折扣为10%
else 订单折扣为5%
2. 判定表
「判定表」适用于加工的输入数据和输出数据之间的逻辑关系比较复杂的加工描述。
判定表:
条件类别 | 条件组合 |
---|---|
操作 | 操作执行 |
示例:
考试总分 | >=620 | >=620 | <620 |
---|---|---|---|
单科成绩 | 有满分 | 有不及格 | 有满分 |
发送升级通知书 | Y | Y | N |
发送留级通知书 | N | N | Y |
发送重修通知书 | N | Y | N |
3. 判定树
「判定树」适用于加工的输入数据和输出数据之间的逻辑关系比较复杂的加工描述。
示例:
结构化分析过程
- 使用数据流图建立系统的功能模型;
- 建立系统环境图(顶层数据流图),确定系统边界;
- 自顶向下,逐步求精,建立系统的层次数据流图;
- 使用逻辑操作符建立数据字典,定义数据流、数据存储、数据项...
- 使用判定表、判定树等方式给出加工说明:集中描述一个加工“做什么”,即加工的内部逻辑,也包括其它与加工有关的信息,如执行条件、优先级、执行频率、出错处理等。
顶层数据流图——0层数据流图——1层数据流图——...
结构化设计的概念
「设计」的定义:一种软件开发活动,定义实现需求规约所需的软件结构。
设计目标:依据需求规约,在一个抽象层上建立系统软件模型,包括软件体系结构(数据和程序结构),以及详细的处理算法,产生设计规约说明书。
即:回答如何解决问题——给出软件解决方案。
结构化设计分为:
- 总体设计:确定系统的整体模块结构,即系统实现所需要的软件模块以及这些模块之间的调用关系。
- 体系结构设计(MSD):定义软件模块及其之间的关系,从分析模型(如数据流图)导出。
- 接口设计:包括外部接口设计和内部接口设计。外部接口设计依据分析模型中的顶层数据流图。外部接口包括用户界面、目标系统与其他硬件接口、软件系统的外部接口。内部接口是指系统内部各种元素之间的接口。
- 数据设计:根据数据字典来确定软件涉及的文件系统的结构及数据库的表结构。
- 详细设计:详细描述模块,模块内部设计(算法和数据结构)。
总体设计层概述
在总体设计层:
- 引入了两个术语/符号:
- 模块:一种可独立标识的软件成分。(用矩形方框表示)
- 调用:模块间的一种关系,模块A为了完成其任务必须依赖其他模块。(用线条表示)
- 引入了模块结构图(MSD):用于表达软件系统的静态结构。
- 过程指导:为了实现设计目标,总体设计的具体任务是将 DFD 转化为 MSD。
- 第一步:如何将 DFD 转化为初始的 MSD,变换型数据流图、事务型数据流图、变换设计、事务设计。
- 第二步:如何将初始的 MSD 转换为最终可供详细设计使用的 MSD。
总体设计的三个阶段
第一阶段:初始设计。在对给定的数据流图进行复审和精化的基础上,将其转化为初始的模块结构图。根据穿越系统边界的数据流初步确定系统与外部的接口。
第二阶段:精化设计。依据模块“高内聚低耦合”的原则,精化初始的模块结构图,并设计其中的全局数据结构和每一模块的接口。
第三阶段:设计复审阶段,(设计人员与综合评审团队)对前两个阶段得到的高层软件结构进行复审,必要时还可能需要对软件结构做一些精化工作。
数据流图的分类
- 变换型数据流图:具有较明显的输入部分和变换部分之间的界面、变换部分和输出部分之间的界面的数据流图。
- 事务型数据流图:数据到达一个加工,该加工根据输入数据的值,在其后的若干动作序列(称为一个事务)中选出一个来执行,这类数据流图称为事务型数据流图。
变换设计的基本步骤
- 设计准备——复审并精确化系统模型;
- 为了确保系统的输入数据和输出数据符合实际情况而复审其语境。
- 为了确保是否需要进一步精化系统的DFD图而复审其语境。
- 确定输入、变换、输出这三部分之间的边界;
- 根据加工的语义和相关的数据流,确定系统的逻辑输入和逻辑输出。
- 第一级分解——系统模块结构图顶层和第一层的设计。
- 主模块;
- 输入模块部分;
- 变换模块部分;
- 输出模块部分;
- 第二级分解——自顶向下,逐步求精;
事务设计的基本步骤
- 设计准备——复审并精确化系统模型;
- 确定事务处理中心;
- 第一级分解——系统模块结构图顶层和第一层的设计;
- 首先,为事务中心设计一个主模块;
- 然后,为每一条活动路径设计一个事务处理模块;
- 对其输入部分设计一个输入模块;
- 如果一个事务数据流图的活动路径集中于一个加工,则设计一个输出模块,否则第一层不设计输出模块;
- 第二级分解——自顶向下,逐步求精;
初始化模块结构图精化的原则
基于模块化原理——高内聚、低耦合;
模块化的概念和基本原则(略)。
耦合:不同模块之间相互依赖程度的度量。
内聚:一个模块之内各成分之间相互依赖程度的度量。
初始化模块结构图精化的启发式规则
启发式规则:根据设计准则,从长期的软件开发实践中,总结出来的规则。
- 改进软件结构,提高模块独立性:通过模块的分解和合并,力求降低耦合,提高内聚。
- 模块规模适中,每页60行语句;
- 深度(软件结构中控制的层数)、宽度(软件结构中同一个层次上的模块总数的最大值)、扇入(一个模块直接被多个上级模块共享的数量)和扇出(一个模块直接控制下级模块的数量)适中;
- 模块的作用域力争在控制域之内;
- 降低模块接口的复杂性:使得信息传递简单并且和模块的功能一致。
- 模块功能应该可以预测;
接口设计
接口设计的分类:
- 模块或软件构件间的接口设计;
- 软件与其他软硬件系统之间的接口设计;
- 软件与人(用户)之间的交互设计;
系统的接口设计(包括用户界面设计及与其他系统的接口设计)是由穿过系统边界的数据流定义的。
在最终的系统中,数据流将成为用户界面中的表单、报表或与其他系统进行交互的文件或通信。
用户界面应具有的特性:可使用性、灵活性、可靠性。
数据设计
「数据设计」:在设计阶段必须对要存储的数据及其格式进行设计。
文件设计
文件设计的主要工作:根据使用要求、处理方式、存储的信息量、数据的活动性以及所提供的设备条件等确定文件类型,选择文件媒体,决定文件组织方法,设计文件记录格式,并估算文件的容量。
以下几种情况适合选择文件存储:
- 数据量较大的非结构化数据,如多媒体信息;
- 数据量大、信息松散,如历史记录、档案文件等;
- 非关系层次化数据。如系统配置文件。
- 对数据的存取速度要求极高的情况。
- 临时数据。
数据库设计
- 数据对象的映射
- 关系的映射
详细设计工具
详细设计的任务:定义每一模块。
详细设计中主要引入了三种动作控制结构(顺序、选择、循环)的术语/符号。
结构化程序设计的概念:设计具有如下结构的程序:
一个程序的代码块仅仅通过顺序、选择和循环这三种基本控制结构进行连接,并且每个代码块只有一个入口和一个出口。
伪码(类程序设计语言)
优点:
PDL 不仅可以作为设计工具,而且可作为注释工具,直接插在源程序中间,以保持文档和程序的一致性,提高了文档的质量。
缺点:
- 不如图形工具那样形象直观;
- 当描述复杂的条件组合与动作间的对应关系时,不如判定表和判定树那样清晰简单。
程序流程图(程序框图)
优点:
对控制流程的描绘很直观,便于初学者掌握。
缺点:
- 不是一种逐步求精的工具,程序员过早地考虑程序的控制流程,而不是全局结构;
- 所表达的控制流,可以不受约束随意转移。
- 不易表示数据结构。
PAD 图
优点:
- 支持自顶向下逐步求精的结构化详细设计,可使用“def”符号逐步增加细节;
- PAD图最左边的竖线是程序的主线,随着程序层次的增加,逐步向右延伸,每增加一个层次,图形向右扩展一条竖线,从而使PAD图所表现的处理逻辑易读、易懂和易记。
N-S 图(河图)
优点:支持自顶向下逐步求精的结构化详细设计,并且严格限制了控制从一个处理到另一个处理的转移。
判定表和判定树
当算法中包含多重嵌套的条件选择时,用程序流程图、盒图、PAD图、PDL都不易清楚描述,这时可以选择判断表来表达复杂的条件组合与应做的动作之间的对应关系。
判定树是判定表的变种,也能清晰地表达复杂的条件组合与应做的动作之间的对应关系,形式简单,但简洁性不如判定表,数据元素的同一个值往往需要重复写多次,而且越接近树的叶断重复次数越多。
结构化方法总结
结构化方法的世界观
一切系统都是由信息流构成的(其中包含一些必要的数据变换),每一个信息流都有自己的起点数据源,有自己的归宿数据潭,有驱动信息流动的加工,因此所谓信息处理主要表现为信息的流动。
基本原理和原则
- 自顶向下功能分解;
- 数据抽象;
- 功能/过程抽象;
- 模块化;
结构化方法是一种系统化的软件系统建模方法,从测试的角度看,结构化方法是一种特定的建立验证和确认所需标尺的方法学,包括结构化分析和结构化设计。
结构化方法的抽象层,包括:
- 需求分析层;
- 设计层;
- 实现层;
结构化分析的组成
紧紧围绕自顶向下、过程抽象、数据抽象和模块化等基本原理/原则,给出了:完备的符号、可操作的过程和易于理解的表示工具。并提供了:控制信息组织复杂性的机制,例如逐层分解,数据打包等,以支持将问题空间的一个问题映射为解空间的一个解。
结构化分析的问题
- 捕获的「过程」和「数据」恰恰是客观事物的易变性质。
- 解的结构没有保持原系统的结构,从而造成维护、验证上的苦难。