需求开发阶段的主要任务就是分析问题,研究问题所发生的现实世界(即问题域),寻找实现软件系统与现实世界有效互动的办法,并严格描述该互动办法。而软件需求开发是一个连接现实世界与计算机世界的活动,是软件工程的起始阶段,设计、实现等后续阶段的正确性都以它的正确性为前提。如果需求开发过程中有错误未能解决,则其后的所有阶段都会受到影响,因此与需求有关的错误修复代价较高,需求问题对软件成败的影响较大。而我们之所以认识不到需求开发阶段的重要性主要是因为学校时间项目的特殊性,具体来说学校的课程设计或实训:
所以学生在校园实践项目当中就感觉不到需求开发的重要性。
IEEE中的定义:
另一个定义:需求是用户的一种期望,是用户对问题域当中的实体状态或事件的期望描述。
如下图所示,需求可以分为业务需求、用户需求、系统级需求三个层次。
业务需求:
抽象层次最高的需求称为业务需求(business requirement ) ,是系统建立的战略出发点,它描述了组织为什么要开发系统,描述系统高层次的解决方案,定义系统应该具备的特性,说明了系统为用户提供的各项功能,限定了系统的范围,帮助用户和开发者确定系统的边界,属于一个宏观目标。
用户需求:
用户需求(user requirement ) 是执行实际工作的用户对系统所能完成的具体任务的期望,描述了系统能够帮助用户做些什么。用户需求表达了用户对系统的期望,对所有的用户需求,都应该有充分的问题域知识作为背景支持。
系统级需求:
系统级需求( system requirement) 是用户对系统行为的期望,每个系统级需求反映了一次外界与系统的交互行为,或者系统的一个实现细节。系统级需求可以直接映射为系统行为,定义了系统中需要实现的功能,描述了开发人员需要实现什么。需要切记的是: 需求主要是描述用户对系统的期望,它以系统与外界的交互为主,所以即使是系统级需求也尽可能不要涉及系统的内部构造细节。
根据不同的分类标准,可以将软件需求分成不同的种类。在各种软件需求的分类中,最常见的是[IEEE830- l 998] 的分类, [IEEE830-l 998] 将软件需求分成 5 种明确的类别:
功能需求是和系统主要工作相关的需求,即在不考虑物理约束的情况下,用户希望系统所能够执行的活动,这些活动可以帮助用户完成任务。功能需求表现为系统和环境之间的行为交互,是软件需求中最常见、最主要、最重要的需求,也是最复杂的需求。
一方面质量属性需求是隐式的; 另一方面在后续的软件开发活动中,质量属性需求会极大地影响软件体系结构的设计,所以它被归为单独的一种需求类型。常见的质量属性有:
对外接口是指系统和环境中其他系统之间需要建立的接口,包括用户界面、硬件接口、软件接口、网络通信接口等。重要的用户界面接口需要提供界面原型。
约束是指进行系统构造时需要遵守的约定,例如编程语言、硬件设施等。常见的约束主要有三类:
需求工程有以下三个主要任务:
需求工程的基本活动如下图所示:
需求获取的目的是从空白开始建立最初的原始需求。需求分析的目的是保证需求的完整性和一致性。需求规格说明的目的是将完整、一致的软件解决方案以文档的方式固定下来。描述的结果文档是软件需求规格说明文档。需求验证的目的是保证软件需求规格说明文档的质撮,它要求文档内的需求正确地反映用户的真实意图,并保证整个文档的完整性和一致性。
需求获取是从人、文档或者环境中获取需求的过程,需求工程师必须利用各种方法和技术来”发现“需求。需求工程师需要执行的重要任务有以下两方面。
目标分析:
用户需求获取:
在目标的指导下,可以使用合适的需求获取方法从用户那里获得用户需求。常见的需求获取方法有:面谈、集体获取方法、头脑风暴、原型。
需求分析的主要工作是通过建模来整合各种信息, 以使得人们更好地理解问题。同时需求分析工作还会为问题定义出一个需求集合,这个集合能够为问题界定一个有效的解决方案。需求分析还需要检查需求当中存在的错误、遗漏、不一致等各种缺陷,并加以修正。需求工程师需要执行的重要任务有以下两方面。
边界分析:
系统的边界定义了项目的范围。系统边界之内定义的是系统需要对外提供的功能,系统边界之外标识的是对系统有功能要求的外部实体或者对系统有所限制的环境要素。系统用例图和上下文图通常用来定义系统的边界。
需求建模:
需求建模是需求分析中最为重要和基础的一项任务。它将大量信息以清晰、条理的方式集成到一个模型当中,让需求工程师对问题形成更为深刻的理解。常用的技术包括数据流图、实体关系图、状态转换图、类图等半形式化建模技术。
获取的需求需要编写成文档,编写文档的主要目的是在系统用户之间交流需求信息,因此编写的文档应该具有一定的质量。最重要的质量要求是简洁、精确、一致和易于理解。
定制文档模板:
开发团队通常都会在其内部为各种需要编写的文档维护一些文档模板,模板为记录功能说明和其他与需求相关的信息提供了统一的结构。
编写文档:
有了定制的文档模板,就可以开始编写需求文档。在编写的过程中, 一方面要选择最准确的表达方式; 另一方面要注意保证文档的良好结构和易读性。通常,人们会同时使用模型语言(图形、表达式等)和自然语言(文本)两种表达方式。
需求规格说明文档至少要满足下面几个标准:
执行验证的方法有很多,同级评审是其中最通用、最有效的一个。在有些情况下,也需要使用原型或模拟等代价相对较高的验证方法。
需求的影响力贯穿于整个软件产品的生命周期,而不是单纯的需求开发阶段。需求管理保证需求作用的持续、稳定和有效发挥,需求管理会进行变更控制,纳入和实现合理的变更请求,拒绝不合理的变更请求,控制变更的成本和影响范围。
需求获取中,需求工程师可以得到需求和问题域信息,但这些信息都是用户对现实世界的理解与描述,使用的是实际业务的表达方式。所以,需求工程师需要在需求获取之后进行需求分析,以解决获取信息与软件系统解决方案之间的差距,需求分析的任务是 :
模型是对事物的抽象,帮助人们在创建一个事物之前可以有更好的理解。建立模型的过程被称为建模,它是对系统进行思考和推理的一种方式。建模的目标是建立系统的一个表示,这个表示以精确一致的方式描述系统,使得系统的使用更加容易。
抽象和分解是建模最为常用的两种手段:
常见的需求分析模型:
结构化分析方法把现实世界描绘为数据在信息系统中的流动,以及在数据流动过程中数据向信息的转化。它帮助开发人员定义系统需要做什么(处理需求),系统需要存储和使用哪些数据(数据需求), 需要什么样的输入和输出,以及如何把这些功能结合在一起来完成任务。
数据流图将系统看做过程的集合,其中一些由人来执行,另一些由软件系统来执行。过程的执行就是对数据的处理,它接收数据输入,进行数据转换,输出数据结果。过程执行时可能需要和软件系统外的实体尤其是人进行交互,会要求外界提供数值输入或者将数据结果提供给外部实体。
基本元素:
语法规则:
分层结构:
在分层结构中, DFD 定义了三个层次类别:上下文图(context diagram)、0 层图( level-0 diagram) 和N 层图(level-N diagram ,
>0) 。
层图的过程分解后产生的子图称为
层图。在低与 0 层图的子图上通常不显示外部实体。父过程的输入输出数据流称为子图的接口流,在子图中从空白区域引出。如果父过程连接到某个数据存储,则子图可以不包括该数据存储,也可以包括该数据存储。子图中过程的编号需要以父过程的编号为前缀。
过程分解的平衡原则:要求DFD 子图的输入流、输出流必须和父过程的输入流、输出流保持一致。
实体关系图(Entity Relationship Diagram, ERD) 是能够弥补 DFD 在数据说明方面的缺陷,描述数据的定义、结构和关系等特性的技术。实体关系图使用实体、属性和关系三个基本元素来描述数据模型,它最常见的两个图形表示法是Peter Chen 表示法和 James Martin 表示法。下图是 James Martin 表示法:
Peter Chen 表示法如下:
面向对象分析方法认为系统是对象的集合,这些对象之间相互协作,共同完成系统的任务。面向对象分析方法有儿个主要的优点,其中包括自然性和可复用性。统一建模语言( Unified Modeling Language, UML ) 是面向对象分析的主要模型技术。UML 其实是很多种技术的综合体,而非一种单一的技术。
面向对象分析方法主张使用用例作为需求获取和组织的主要手段,用例有多种定义:
用例图 (Use-Case Diagram ) 的基本元素有4 种: 用例、参与者、关系和系统边界。用例是用例模型最重要的元素,使用一个水平的椭圆来表示。发起或参与一个用例的外部用户以及其他软件系统等角色被称为参与者。它的图示是一个小人。系统边界是指一个系统所包含的系统成分与系统外事物的分界线。用例图使用一个矩形框来表示系统边界,以显示系统的上下文环境。
在画用例图时,可以根据下面几点确定用例:
参与者的UML表示方法有图标表示法和标签表示法两种,参与者具备的基本特征为:
用例图的关系:
仅做参考,文字描述不完整。
用例规约就是以用例为核心来组织需求内容的需求规约,用例通过前置条件(precondition)、后置条件(postcondition)以契约的形式表达需求。
在进行系统分析时,开发人员关注系统与外界的交互,而不是软件系统的内部构造机制,所以分析阶段的类图与设计阶段的类图有所不同,它关注用户的业务领域,称为概念类图,又称为领域模型。类型、方法、可见性等复杂的软件构造细节都不会在概念类图中出现。
对象:
对象的概念是面向对象分析方法的基础。在面向对象分析模型中,对象是对具体问题域事物的抽象,有三个方面的内容:标识符、状态、行为。状态是对象的特征描述,包括对象的属性和属性的取值,属性是描述对象时使用的特征选项。行为是对象在其状态发生改变或者接收到外界消息时所采取的行动。
类:
对象是类的实例,每个类都有能够唯一标识自己的名称,同时包含有属性和行为方法。概念类图中的类大多是概念类,,概念类会显式地描述自己的一些重要属性,但不是全部的详细属性,而且概念类的属性通常没有类型的约束。概念类不会显式地标记类的行为,即概念类不包含明确的方法。
属性的描述方法为:[可见性] 属性名 [: 类型] [ [多重性] ] [ =初始值 ] [{特性串,特性串}],其中 [ ]
内的为可选内容。
[可见性] 操作名称 ([参数列表]) [: 返回类型] [{属性字符串}]
( )
中,定义语法为: [方向] 参数名:类型 [= 默认值],这里的方向指的是操作调用时该参数的传递方向,有如下几种:
系统中的对象不是孤立存在的,它们需要互相协作完成任务。对象之间的这种互相协作的关系称为链接,它描述了对象之间的物理或业务联系。链接通常是单向的,也可以是双向的。如果一个对象a 存在指向b 的链接,那就意味着a能够在链接的指引下,正确地找到并将消息发送给b 。
类之间的关系被称为关联,它指出了类之间的某种语义联系。类是对象集合的抽象,关联则是对象之间链接的抽象。对象依据关联所带有的信息进行链接的建立和撤销,如果两个类之间没有关联,那么两个类的对象实例之间就不存在链接,就无法实现相互协作。UML 使用类(对象)之间的直线来表示关联(链接),它可以是单向的(带有方向箭头),也可以是双向的(无方向箭头)。另外,如果类之间的关联关系也拥有一些属性和操作,那么可以把这个操作独立出来写成一个关联类,如下图所示就是一个关联类的示例。
另外,关联之间也存在多重性,可以用上下限表示法来表达关系之间的多重性,下图表示5到多名球员可对应1个球队:
关联存在自身关联,为了表达清晰可以写出两端的角色,如下示例:
一个类可以继承另外一个类的属性和操作,即子类继承父类,继承的识别可以通过子类是否为父类的一种来判断,如蜂鸟是一种鸟,所以蜂鸟继承鸟。在UML中有泛化的概念,它和继承类似,泛化指一般化的过程,示例如下:
接口是一组操作的集合,这组操作用于描述类或者构件的一个服务,需要描述这些操作的特征标记(可见性、参数、范围)
棒糖图:
下图所示的是类的表示方式和棒糖图的表示方法
依赖: 类 A 使用类 B 的信息和服务,类 B 的变化会影响到类 A,则称A依赖B,这种关系可能是偶然性的、临时性的,属于比较弱的关系,如下:
接口: 接口中仅仅定义操作的归约(即操作的特征标记),而不给出操作的实现,抽象方法:只有归约没有实现的操作,如下:
实现: 类对接口中的操作(抽象方法)给出具体实现,类在实现接口的抽象方法时,方法规格的定义与接口中必须完全相同,如下:
聚合: 描述整体-部分之间的关系,如下示例:
组合: 在某一时刻,部分类的实例只属于一个整体,表示整体拥有部分,比如桌腿和桌子。如果整体对象被销毁了,那么部分对象也会被销毁,或者依附于其他对象,画法如下:
对象需要相互协作才能完成任务, 交互图( Interaction Diagram ) 就是描述对象协作的技术。顾名思义,交互图用于描述在特定上下文环境中一组对象的交互行为,这个上下文环境通常被指定为用例的场景。所以,交互图通常描述的是单个用例的典型场景,它也因此被称为“用例的实现“ 。交互图有顺序图、通信图、交互概述图和时间图4 种类型,其中顺序图是最为常用的一种。在此主要讲述顺序图。
顺序图将交互表示成一个二维图表。纵向是时间轴,时间沿纵轴向下延伸。横轴表示了参与协作的对象。图的内容以交互行为中的消息序列为主,消息以时间顺序在图中从上到下排列。
顺序图的基本概念包括:对象、生命线、控制焦点和消息
生命线(Lifeline)是一条垂直的虚线,用于表示顺序图中的对象在一段时间内的存在。对象与生命线结合在一起称为对象的生命线。
控制焦点(Focus of Control,也称为激活)是对象操作的执行,表明对象正在进行交互。它表示一个对象直接或通过从属操作完成操作的过程。控制焦点在顺序图中用一个细长的矩形框表示,它的顶端与激活时间对齐,而底端与完成时间对齐。一个被激活的对象要么执行自己的代码,要么等待另一个对象的返回结果。对象在完成自己的工作后,被去激活,对象就处于空闲状态。
消息(Message)是从一个对象(发送者)向另一个或几个其他对象(接收者)发送信号,或由一个对象(发送者或调用者)调用另一个对象(接收者)的操作。消息主要包括编号、名称、类型等组成部分。类型由不同形式的带箭头的线段表示,线段上方标注“编号:名称”格式的消息文本。通常一个顺序图的消息流从左上方开始,消息按照先后顺序从上到下排列。
消息的编号可以进行嵌套,表示包含关系,把属于同一个对象发送和接受的消息放在同一层进行编号:
消息的名称: [守卫条件] [序列表达式] [返回值 := ] 消息名 [(参数列表)]
2 : [x<0] invert(x,y)
状态图常用的简单元素包括状态、开始状态、结束状态、事件、监护条件、活动和转换。
按照下列步骤可以建立一个状态图:
用例文档和软件需求规格说明文档是最为常见的两种需求文档,用例文档从用户的角度以用例文本为主描述软件系统与外界的交互,软件需求规格说明文档则从软件产品的角度以系统级需求列表的方式描述软件系统解决方案。软件需求规格说明文档描述了软件系统的解决方案,有很多不同的格式类型。
简洁:技术文档与文学作品的最大区别是技术文档必须简洁。技术文档很少会使用各种修辞手法,都是平铺直叙。技术文档的书写主要使用简单语句,主要由动词、名词和一些辅助词组成,尽量不要使用复杂长句,避免使用形容词和副词。
精确:精确文档的书写不能使用模糊和歧义词汇,尤其是那些比较常用的模糊和歧义词汇。
易读(查询):技术文档被使用的主要目的是进行交流与沟通,所以它必须具有易读性。主要有两个特点:有效使用引言、目录、索引等能够增强文档易读性的方法。使用系统化的方式组织内容信息,提供文档内容的可读性。
易修改: 技术文档通常会随着开发工作的持续而被不断修改,所以技术文档还要易于修改。能够增强技术文档易读性的目录、索引和系统化表达方式都能有效提高文档的可修改性,使得技术文档易修改的另一个注意事项是用引用代替重复。
使用用户术语:需求文档有一个极其重要、不可忽视的读者一用户,他们要验证需求文档的内容是否符合自己的最初意图。因此,在书写需求时,要首先保证能够对用户易读,尽量使用用户的语言和问题域的概念。
可验证:需求应该是可验证的,通过分析、检查、模拟或者测试等方法能够判断需求是否被满足。在进行需求的描述时要让需求具体化,小心形容词和副词的使用,避免程度词的使用。
可行性: 需求必须能够在系统及其运行环境的已知条件和约束下实现。需求可行性不仅要考虑理论上的技术实现可能性,更要考虑在限定的成本、时间和人员约束内,实现需求的可能性。
评审是进行需求验证与确认的主要方法,原则上每一条需求都应该进行评审。进行软件需求规格说明文档评审时,要注意以下事项:
在需求开发完成之后,测试人员就可以以需求为基础开发系统测试用例(主要是功能测试)了。在为需求开发测试用例的过程中可以发现软件需求规格说明文档的缺陷与问题。以需求为基础开发系统测试用例有两个步骤:
以需求列表为线索,可以开发测试用例套件。测试用例套件是测试用例的集合,它将相关的测试用例组织在一起,通常每个测试用例套件是目标明确的一项功能。原则上, 除测试代价过高或者测试难度过大的需求之外 ,所有的需求都应该有测试用例套件覆盖。使用用例描述的正常流程和异常流程作为线索可以很好地满足这一点。
对确定的测试用例套件,使用软件测试技术,主要是基千规格的技术, 设计测试场景的输入与输出数据,建立测试用例。
在完成需求开发之后,要及时地将需求阶段的重要制品纳入配置管理。这些重要的制品包括:
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有