2、结构化分析
2、结构化分析
概述
核心思想
分析、化简问题;物理与逻辑表示分开;进行数据与逻辑抽象。
具体步骤
五步
发现需求;求精;建模;规格说明;复审
发现需求
与用户交流、提问;参观用户工作过程,观察用户操作;向用户群体发问卷;与同行、专家交谈听取意见;分析现有的同类软件产品提取需求;从行业标准、规则中提取需求;从网上找资料。
求精
对初步需求反复求精多次细化。
建模
建立模型,用图形符号和组织规则系统书面地描述事物,去除文字的二义性。
三种模型
模型核心:数据字典
描述软件使用和产生的所有数据对象。
数据模型:E-R图表达
描述数据对象之间的关系。数据对象属性用“数据对象描述”表达。
功能表达:DFD表达(数据流图)
描绘数据在软件中移动、变换及相应功能。图中功能用“处理规格说明”表达。
行为模型:状态转换图
描绘系统状态在不同状态间转换方式。(额外的用控制规格说明表达)
规格说明
作为分析阶段最终成果。
复审
数据模型
组成
数据对象
是软件必须理解的复合信息表示。复合信息是具有一系列不同性质或属性的事物。
可以理解为需要用到的类。
地点(仓库)、角色(教师,学生)
数据对象间关系
对象间相互连接的方式
1:1, 1:N, N:N
属性
定义数据对象的性质。
学生(学号、姓名、班级)
可以理解为类成员。
实体-关系图(ER图)
有些属性可以直接属于关系。比如成绩属性既不属于学生也不属于课程。
例:
仓库管理系统ER图:
其中供应量和订购量不属于任何一个实体,只属于这两个关系。
功能模型
数据流图(DFD)
描绘系统逻辑模型,图中没有具体的物理元素,只描绘信息在系统中流动处理情况。
符号
正方形、体
表示数据的源点或终点。比如人员、部门、计算机外设或传感器。
圆角矩形或圆
表示变换数据的处理。可能是一个或多个程序、模块,也可能是人工处理过程。
开口矩形或平行线
表示数据存储。可以是文件、数据库、记录或它们的一部分,可以存在任何介质上。不考虑如何实现存储,只知道反正要存。
箭头
表示数据流。在处理之间有向流动的数据项或数据集合。
附加符号
①
②
③
④⑤⑥和上边相似,其实就是对应于、或、异或关系。
范例
简单的例子
学生购书数据流图
工厂订货
需求描述
工厂采购部采购员每天需一张定货报表,按零件编号排序列出所需定货零件。
对定货零件列下述数据:零件编号、名称、定货数量、目前价格,主次要供应者等。
零件入库或出库称事务,通过仓库终端把事务报告定货系统。零件库存量少于库存临界值需订货。
画图步骤
① 先按先后顺序提取四种成分:源、终点;处理;数据流和存储。
源点:仓管;
终点:采购员;
处理:处理事务、产生报表;
数据流:事务、订货信息、报表;
数据存储:订货信息、库存信息。
② 画出基本系统模型(大致图)
这个图只确定了系统边界而忽略了内部细节。
③ 细化基本模型,描绘主要功能
④ 对主要功能进一步细化
在本例中主要功能就是处理事务。
注意
细化不是无限的,数据流图只是逻辑模型,其中只应包含“做什么”,而不应包含“怎么做”。
分层数据流图
概述
分层其实就是不断对上一层细化。顶层流图只包含一个加工项,而底层流图则是加工项不可再细分的数据流图。
需要解决的问题
编号的设置
子图的编号应该是父图中相应处理逻辑的编号,比如上图中底层的2号子图对应的就是其上层的2号处理逻辑。
子图中处理逻辑的编号是
比如第3张子图的第2个局部逻辑就编号为
父图与子图的平衡
子图是对父图处理逻辑的详细描述,子图的输入输出数据流应该与父图中对应部分完全一致(有点类似电子学里结点的概念,把一个系统视作一个点,无论内部多复杂,输入和输出是永远不会变的)。
数据局部存储
子图中出现的数据存储可以不画在父图里,画父图只需画出逻辑之间的联系。
命名规则
数据流和数据存储的命名
① 用名词命名,要和用动词的控制流区分开;
② 要足够概括,代表整个数据流或存储内容,不局限于某些成分;
③ 要具体,不能用“数据”、“信息”等过于笼统的词。
处理逻辑的命名
① 用动宾词组,不能用“加工”、“处理”等过于笼统的词;
② 要足够概括,不局限于某些成分;
③ 通常用一个单独的动词命名,如果命名不了就说明还能拆分。
数据源点、终点命名
采用它们在问题原文中出现的名字:采购员、仓管等。
用途
作为交流信息的工具
作为分析和设计的工具
数据流图可以有自动化边界,每一组边界意味着不同的物理系统:
在这种划分方式中,表示在存储了一定量的事务后,批量地交给右边的系统去更新库存订单。在框出来的系统内部可以自动化完成,而框外则需要手动处理。
在另一种方案中,建议以联机方式更新库存清单。
这表示仓库和采购员办公室的终端是独立的,它们二者需要依靠一个远程订货信息数据库实现协作。
例题
需求描述
工资计算系统包含如下功能:
计算工资:根据人事部门给出的出勤表和业绩表计算奖金和缺勤扣款,通过生成的奖金发放表及工资基本信息库的信息计算应发工资,根据应发工资表计算所得税,根据后勤部门给出的水电扣款及缺勤扣款表和所得税款计算出实发工资,生成实发工资表和工资清单。
打印工资清单:根据工资清单完成工资条的打印,发给职工。
工资转存:根据实发工资表生成职工工资存款清单并将其发送到银行。
画图过程
① 顶层数据流图(这个系统最终谁要进?谁要出?):
② 功能级数据流图
根据题意有三个功能:计算工资、打印工资清单、工资转存。
③ 再细化
由于题目中对工资的计算方法和注意事项给了详细说明,显然计算工资这一块是可以细化并给出一张子图的。
注意,最后不用把所有子图都拼回主图,那样没必要。
行为模型
i
这部分可以结合编译原理中的有限自动机理解。
状态转换图
软件的行为模型分为三部分:状态、事件、行为。
状态:被观察到的系统的行为模式;
事件:引起状态转换的外界事件抽象(发生了肾麽事让系统状态变了?);
行为:进入某状态后所做的动作。
符号
状态
初始状态唯一,最终状态和中间态可能有多个。
事件
箭头上标事件名,后面跟条件(只有当条件为真时,这个事件才会导致状态转换)。
行为
在状态框内有如下格式:
例
电话系统的状态转换图:
数据字典
概述
是对系统用到的所有数据元素定义的集合,用半形式化的方法表达。半形式化就是介于自然语言和符号系统之间的一个东西。
数据字典定义方法
定义谁?
数据流;数据元素;数据存储;处理。
数据流
标准格式:
数据流名:
说明: // 简要介绍它的作用,即它产生的原因和结果
数据流来源: // 哪来的
数据流去向: // 去哪
数据流组成: // 一个数据结构
每个数据量流通量: // 数据量和流量
例:如下的数据流图
数据流名:发票
说明:用作学生已付书款的依据
数据流来源:来自处理“审查并开发票”
数据流去向:流向处理“开领书单”
数据流组成:学号+姓名+书号+单/总价+书费合计
数据元素
标准格式:
数据元素名:
类型:数字(离散or连续?),文字(编码类型)
长度:
取值范围:
相关的数据元素和数据结构: // 谁用了?
例:学号
数据元素名:学号
类型:数字(离散),1,2位表示学院;3,4位表示专业…
长度:10位
取值范围:0000000000-9999999999
相关的数据元素和数据结构:购书单、发票、领书单
数据存储
标准格式:
数据存储名:
简述: // 存的是什么数据?
输入数据:
输出数据:
存储文件构成: // 一种数据结构
存储方式: // 顺序?直接?关键码?
存取频率:
例:各班学生用书表的存储
数据存储名:各班学生用书表
简述:各班学生用书信息
输入数据:各班学生用书信息
输出数据:各班学生用书信息
存储文件构成:班级编号+书号+用量
存储方式:按班级编号从小到大排列
处理
标准格式:
处理名:
处理编号: // 反映该处理的层次
简要描述: // 简述加工逻辑及功能
输入数据流:
输出数据流:
加工逻辑: // 简述加工顺序和流程
数据字典定义符号
定义数据的方法
通过 对数据自顶向下分解 定义数据。把复合的数据分解成简单的数据元素。
数据元素组成数据的方式
① 顺序:以确定的次序连接两个或多个数据元素;
② 选择:从两个或多个可能的元素中选一个;
③ 重复:把指定数据元素重复多次(可以是0次);
④ 可选:一个数据元素是可有可无的。
定义符号
i
这部分其实就是正则表达式。
符号 | 含义 | 举例 |
---|---|---|
= | 等价于、定义为 | |
+ | 与、连接 | |
[ | ] | 或、选择 | $x=[\ a\ |
m { } n | 重复m~n次 | |
( ) | 可选的 | |
" " | 基本数据元素(不可再分) | |
.. | 取值范围 |
例:航空管理系统中的航班信息文件
航班信息文件={航空公司名称+航班号+起点+终点+日期+起飞时间+降落时间}
表示每一条航班信息文件是由后面的数据元素顺序组成的,缺一不可;外面的一组大括号表示每一个文件可以由任意多条航班信息组成。
航空公司名称 = 2 {字母} 8 // 2-8个字母
航班号 = 3 {十进制数字} 3 // 3个数字
字母 = "a" .. "z"
十进制数字 = "0" .. "9"
起点 = 终点 = 1 {汉字} 5
起飞时间 = 降落时间 = 时 + 分
时 = "00" .. "23"
分 = "00" .. "59"
日期 = 年+月+日
年 = [2020 | 2021 | 2022 | 2023]
月 = "01" .. "12"
日 = "01" .. "31"