
目录
[数据流图(Data Flowing Diagram,DFD)](#数据流图(Data Flowing Diagram,DFD))
软件的发展

软件项目目标的三要素
- 功能、性能
- 成本
- 时间
好的需求特征
- 可靠性
- 可移植性
- 可维护性
- 可配置(少编程)
需求工程的目的
- 解决目标系统"做什么?"的问题
- 准确地定义未来系统的目标,确定了为了满足用户的需求,系统必须做什么
- 《需求规格说明书》规范的形式准确表达了用户的需求
软件危机、需求错误的代价
- 浪费了资源
- 影响了软件的成功
- 降低用户的满意度
- 增加成本
产生不合格需求的原因有哪些
- 没有足够的用户参与
- 用户的需求不断增加,导致不可控
- 没有进行用户分类
- 需求具有二义性
- 需求规格说明过于精简
需求层次的构成

需求基础
需求的内涵
- 实体和状态构成了解决问题的基本范围,称作该问题的问题域
- 软件系统通过影响问题域,帮助人们解决问题,称作解系统
- 问题域和解系统直接交互的点叫做共享对象
需求的定义
- 需求是用户对现实生活中实体状态或事件的期望描述
- 直接需求:用户直接提出需要满足的需求(如,系统的功能)
- 间接需求:为了满足直接需求、或为了软件正常运行所需满足的正常功能
需求的分类
- 功能需求(Functional Requirement)
- 性能需求(Performance Requirement)
- 质量属性(Quality Attribute)
- 对外接口(External Interface)
- 约束
- 系统需求(System Requirement)
功能需求的层次性

- 业务需求:描述了高层次的系统解决方案
- 用户需求:描述了用户对系统任务的期望
- 系统需求:描述了系统的开发人员应该做什么(系统中应该实现什么)

质量属性

需求工程过程
过程一系列活动的集成,通过这些活动的执行,能够完成一个任务或者达成一个目标。
需求工程过程是系发中需求开发活动的集成,它的模板是通过一系列活动,生成一个在用户环境下解决用户业务问题的系统方案。
需求工程过程可能会出现较大的差异,但是在 一般情况下,需求工程过程是比较固定的。

需求工程过程的活动

并发性与迭代性

软件开发过程模型
- 瀑布式模型
- 快速原型模型
- 螺旋式模型
需求规格文档
需求分析
结构化需求分析方法
结构化需求分析的核心是数据。数据包括在分析、设计、实现过程中涉及到的概念、属性、术语等所有内容,并把这些内容定义在数据字典中,然后围绕数据字典进行功能/过程模型、数据模型、行为模型的建模过程。
结构化建模包括:过程建模、数据建模
过程建模
过程建模是结构化建模的核心方法:
- 系统是过程的集合
- 所有系统都是由过程构成的
- 过程可以分解为子过程
- 最终所有的子过程都可以被映射为计算实体(函数)
数据流图(Data Flowing Diagram,DFD)
是一种流行的结构化需求分析的工具,DFD描述了数据输入、数据转换、数据输出的全过程。
四种图形分别表示:
- 数据加工过程,实现数据变换。其中要注明加工的名字。

- 过程,是施与数据的状态或者行为,使得数据发生变化(被转换、被储存、被分布)
- 可能是由软件系统控制的,也可能是人为执行的,但是重在于数据变化的效果,而不是执行者
- 过程可以有不同的抽象层次,能够直接对数据进行编码的叫做原始过程
- 外部实体,即数据源或外部系统。其中要注明数据源或外部系统的名字。

- 外部实体是待构建系统之外的人、组织、软件系统,它们不受系统的控制,开发者不能以任何方式操纵他们
- 需要建模的外部实体,是与待构建系统存在数据交互的外部实体,他们是待构建系统的数据源或者数据目的地
- 所有外部实体联合起来就构成了软件系统的外部上下文环境
- 数据存储,其中注明数据存储名字或编号。

- 数据流,描述变换的加工数据及数据流方向。箭头上部要注明数据流的名字。

- 数据流是指数据的流动,是系统与环境或者系统内部的两个过程之间的通信形式
- 数据流是可以分割和组合的
- 数据字典和ERD图是用来更详细的描述数据流图
实例:
DFD构建规则
- 过程是对数据的处理,应该有输入和输出,并且输入和输出数据应该有差异
- 数据流一定要和过程产生关联,要么是过程的输入,要么是过程的输出
- 数据流图中的对象都应该有一个用来唯一标识自己的名称(过程用动词,外部实体、数据流、数据储存使用名词)
DFD的层次结构
上下文图
上下文图将整个系统看做一个过程,这个过程实现所有的系统功能,是系统功能的最高抽象
- 上下文图只能包含一个过程,编号为0
- 要包括所有与软件系统有交互的外部实体,并且描述数据流
- 上下文图中不会出现数据储存的实例
0层图(顶层图)
- 位于上下文图的下面一层,是对上下文图单一过程的细节描述,是对该单一过程的第一次功能分解
- 0层图是对整个系统的功能概述
- 0层图要被描述的简洁、清晰。需求工程师要根据系统的复杂程度来决定顶层图的抽象程度
N层图
- 1层图是对0层图的再一次功能分解,对N层图在进行功能分解就得到了(N+1)层图,功能分解是可以持续进行的,最终的子图都是原始DFD图
- 原始DFD图的扩展形式:微规格说明、数据字典
- 一般来说,低于0层图的子图上不会出现外部实体
数据建模
数据模型是用来描述数据的定义、结构、关系等特性的模型
说明了问题域和解系统的共享事物、对共享事物的描述、共享事物之间的关系
实体关系图(ERD)
核心是分析系统中实体、实体属性、实体间的关系
实体(Entity)
-
实例:系统需要收集的现实事物
-
实体:具有相同属性、特征的实例集合类别描述
实体的分类:
概念实体
逻辑实体
进程实体
属性
- 属性是用来描述实体特征的
- 属性可以是文字、符号、短语乃至声音
- 一系列属性的集合就构成了实体的一个实例
属性的数据的特征,并不是数据,属性以一种形式存在,这种存在才是数据,被称为属性的值。
标识符:
- 又称键(Key),用来唯一确定和标识每个实例或者属性组合
- 一个实例可以有很多个键,都被称为候选键(人们一般从中选择或者固定某一个键对实例进行标识,被选中的成为主键,没有选中的叫做替代键)
属性的分类:
单值属性 多值属性
简单属性 组合属性
储存属性 导出属性

关系
- 关系是存在于一个实体或者多个实体间的自然业务联系
- 所有的关系都是隐含的双向的
- 关系表示的不是实体的物理连接,而是一种逻辑上的连接
度数:
参与关系的实体数量
基数:
最大基数,与关系中的其他实体实例,该实体可能参与的最大关系数量
最小基数,与关系中的其他实体实例,该实体可能参与的最小关系数量

面向对象分析方法
任何系统都可以看作一个对象,能够完成一系列目标和任务
- 对象在完成任务目标时,会调用其他对象来完成子目标
- 其他对象为了完成子任务,会请求将子任务划分成子子任务,并请求其他对象一起完成
对子目标的划分,将会一直持续到最后的子目标能够被映射到计算实体
- 计算实体:对象
- 层次关系:聚合(组合)、继承、关联
- 组合接口:一个对象暴露在外的接口
面向对象基本思想
- 一切都是对象
- 对象都是独立的
- 对象是原子性
- 对象是可抽象的
- 对象都有层次
面向对象基本概念
类
- 类是抽象和分类的概念(分类:将共性事物划分为一类、抽象:忽略事物的非本质特征)
- 数据抽象:就是将有相同特征的数据以及数据集上的操作定义为一个数据类型
- 过程抽象:将明确的功能定义为一个单一的实体
对象
- 对象是类的实例
- 显示生活中,具有相同属性和操作的对象属于一个类
封装
就是将类的内部属性和一些操作隐藏,只将公共的操作暴露在外
消息
消息必须发给指定的对象,消息应该有必要的请求信息
对象可以是消息的接受者,同样可以是消息的发送者
继承
类可以有子类,子类继承父类的所有属性和操作,并且子类可以添加自己的属性和操作
- 继承允许多重性,子类可以有多个父类
- 继承允许多层
- 继承的本质是提高代码复用率
多态性
- 在继承类结构时,允许定义同名操作;一个消息的响应可以执行不同的行为
- 多态更好的体现了操作语句的一致性
- 多态的实现机制
- 静态联编:在编译时就确定好访问对象的操作地址
- 动态联编:编译时不确定访问对象的操作地址,在运行时在根据操作对象的不同再确定
面向对象方法目标及其实现机制
高维护性:
- 类封装了操作的一个"代码级复用"的程序模板,类的对象是系统的可构造元素
- 采用消息机制实现操作的调用,回避了操作调用的过程性
可复用性:
- 对象语义一致性,功能的复用依赖于对功能的理解,但是对功能的描述又是复杂多义的,没有对象语义更可能实现复用
- 全方位复用,功能复用是代码级的,但是系统的复用不仅需要代码级的复用,还需要源程序级的复用,而继承机制就是源程序级的复用
机器无关性:
- 类的多态绑定技术,使得能够将程序的"机器相关部分"提取出来,为程序无关性提供了基础