需求分析和软件建模
软件的发展 软件项目目标的三要素
功能、性能成本时间 好的需求特征
可靠性可移植性可维护性可配置(少编程) 需求工程的目的
解决目标系统“做什么?”的问题准确地定义未来系统的目标,确定了为了满足用户的需求,系统必须做什么《需求规格说明书》规范的形式准确表达了用户的需求 软件危机、需求错误的代价
浪费了资源影响了软件的成功降低用户的满意度增加成本 产生不合格需求的原因有哪些没有足够的用户参与用户的需求不断增加,导致不可控没有进行用户分类需求具有二义性需求规格说明过于精简 需求层次的构成
需求基础 需求的内涵
实体和状态构成了解决问题的基本范围,称作该问题的问题域软件系统通过影响问题域,帮助人们解决问题,称作解系统问题域和解系统直接交互的点叫做共享对象 需求的定义
需求是用户对现实生活中实体状态或事件的期望描述直接需求:用户直接提出需要满足的需求(如,系统的功能)间接需求:为了满足直接需求、或为了软件正常运行所需满足的正常功能 需求的分类
功能需求(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)实例:系统需要收集的现实事物实体:具有相同属性、特征的实例集合类别描述代码语言:javascript复制实体的分类:
概念实体
逻辑实体
进程实体属性属性是用来描述实体特征的属性可以是文字、符号、短语乃至声音一系列属性的集合就构成了实体的一个实例属性的数据的特征,并不是数据,属性以一种形式存在,这种存在才是数据,被称为属性的值。
标识符:又称键(Key),用来唯一确定和标识每个实例或者属性组合一个实例可以有很多个键,都被称为候选键(人们一般从中选择或者固定某一个键对实例进行标识,被选中的成为主键,没有选中的叫做替代键)属性的分类:代码语言:javascript复制单值属性 多值属性
简单属性 组合属性
储存属性 导出属性关系关系是存在于一个实体或者多个实体间的自然业务联系所有的关系都是隐含的双向的关系表示的不是实体的物理连接,而是一种逻辑上的连接度数:参与关系的实体数量
基数:最大基数,与关系中的其他实体实例,该实体可能参与的最大关系数量
最小基数,与关系中的其他实体实例,该实体可能参与的最小关系数量
面向对象分析方法任何系统都可以看作一个对象,能够完成一系列目标和任务
对象在完成任务目标时,会调用其他对象来完成子目标其他对象为了完成子任务,会请求将子任务划分成子子任务,并请求其他对象一起完成对子目标的划分,将会一直持续到最后的子目标能够被映射到计算实体
计算实体:对象层次关系:聚合(组合)、继承、关联组合接口:一个对象暴露在外的接口面向对象基本思想一切都是对象对象都是独立的对象是原子性对象是可抽象的对象都有层次面向对象基本概念 类
类是抽象和分类的概念(分类:将共性事物划分为一类、抽象:忽略事物的非本质特征)数据抽象:就是将有相同特征的数据以及数据集上的操作定义为一个数据类型过程抽象:将明确的功能定义为一个单一的实体 对象
对象是类的实例显示生活中,具有相同属性和操作的对象属于一个类封装就是将类的内部属性和一些操作隐藏,只将公共的操作暴露在外
消息消息必须发给指定的对象,消息应该有必要的请求信息
对象可以是消息的接受者,同样可以是消息的发送者
继承类可以有子类,子类继承父类的所有属性和操作,并且子类可以添加自己的属性和操作
继承允许多重性,子类可以有多个父类继承允许多层继承的本质是提高代码复用率多态性在继承类结构时,允许定义同名操作;一个消息的响应可以执行不同的行为多态更好的体现了操作语句的一致性多态的实现机制静态联编:在编译时就确定好访问对象的操作地址动态联编:编译时不确定访问对象的操作地址,在运行时在根据操作对象的不同再确定面向对象方法目标及其实现机制高维护性:类封装了操作的一个“代码级复用”的程序模板,类的对象是系统的可构造元素采用消息机制实现操作的调用,回避了操作调用的过程性可复用性:对象语义一致性,功能的复用依赖于对功能的理解,但是对功能的描述又是复杂多义的,没有对象语义更可能实现复用全方位复用,功能复用是代码级的,但是系统的复用不仅需要代码级的复用,还需要源程序级的复用,而继承机制就是源程序级的复用机器无关性:类的多态绑定技术,使得能够将程序的“机器相关部分”提取出来,为程序无关性提供了基础