三、映射阶段
1.映射过程的通用方法
识别功能处理→识别数据组→识别数据属性、识别数据移动
E=输入,X=输出,R=读,W=写
2.识别功能处理-从待度量软件块的功能性用户需求中识别出功能处理集
事件-定义:发生的某事
触发事件-定义:待度量软件的功能性用户需求中可识别的一个事件,此事件使得一个或多个软件功能用户产生一个或多个数据组,每个数据组随后被一个触发输入所移动。一个触发事件不可再拆分,并且要么已经发生,要么没有发生。
注:时钟和定时事件可以作为触发事件。
举例:员工需要将订单录入系统,订单来了是一个触发事件,触发员工去录入订单到系统
功能处理-定义:
- 体现了待度量软件的功能性用户需求基本部件的一组数据移动,该功能处理在这些FUR中是独一无二的,并能独立于这些FUR的其他功能处理被定义
- 一个功能处理可能只有一个触发输入。每个功能处理在接受到其触发输入数据移动所移动的一个数据组后,开始进行处理。
- 一个功能处理的数据移动的集合是响应触发输入的所有可能的功能性需求所需要的集合。
注1:实现时,一个功能处理实例,在收到一个触发输入实例移动的数据组实例时,才开始执行处理。
注2:除了触发输入外,一个功能处理的FUR可能需要一个或多个其他的输入
注3:如果功能用户发送了包含错误的数据组,例如,由于传感器失灵,或者人输入的命令存在错误,通常是由功能处理来判断事件是否确实发生、和/或输入的数据是否有效、以及如何响应。
理解:
- 用户需求的基本部件,独一无二 →→ 对用户有意义的最小功能
- 有触发输入来启动功能处理
- 数的时候,是数一个数据移动的全集
- 要不要识别这个功能处理,要看功能处理本身会不会对用户发送的这个数据去进行相应响应
触发输入-定义:触发输入是一个功能处理的输入数据移动,它移动了功能用户产生的一个数据组,该数据组是功能处理开始执行处理所必需的。
理解:一个触发事件引起功能用户生成一个数据组,该数据组由功能处理的触发输入移动,以启动功能处理。
识别功能处理-方法:
- 从被度量软件的功能用户的领域,识别出必须响应的单个事件——“触发事件”(可以在状态图和实体生命周期图中识别触发事件,因为一些状态迁移和生命周期迁移都对应着软件必须响应的触发事件);
- 识别出软件中每个触发事件必须响应的功能用户
- 识别出每个功能用户为响应该是该事件而发起的触发输入(或输出)
- 识别出被每个触发输入启动的功能处理
功能处理-规则:
- 一个功能处理应该完全属于某层且仅属于某一层的一个软件块的度量范围
- 被度量软件块的任何一个触发输入可能仅触发该软件的一个功能处理
- 一个功能处理至少包含两个数据移动,一个输入加上一个输出或写。一个功能处理中数据移动的数量没有上限
- 一个执行中的功能处理,当其响应了触发输入并满足FUR时,则功能处理结束。由技术原因导致处理出现暂停时,不能认为功能处理结束了
理解:先分层,找触发输入;一个功能处理的功能点数=2或∞;一个功能处理必须处理了所有情况才算结束。
案例1:在一家公司里,收到一个订单(触发事件),引发以为员工(功能用户)录入订单数据(触发输入传递了关于兴趣对象“订单”的数据,这就是“订单录入”功能处理的第一个数据移动)
案例2:一个功能用户输入顾客购买一件复杂工业设备的订单,并随后确认顾客订单的接收情况。在输入及验收订单的过程中,用户可能会查询新订单能否在要求的配送日送达以及顾客的信用度等等。尽管输入了订单后才可以验收订单,在本场景中用户必须做出独立的决策来验收订单。这意味着输入订单与验收订单是两个独立的功能处理(并且查询新订单与已配送的订单也要区分为不同的功能处理)
3.识别兴趣对象和数据组
兴趣对象-定义:从功能性用户需求中识别出来、存在于功能用户世界中的任何事物,软件要为之处理和/或存储数据。可能是具体的事物,也可能是概念性对象或其一部分。
(比如订单和订单信息,订单信息是描述订单的数据组,订单就是兴趣对象)
注1:在以上定义中,“处理”可以是任何移动和/或运算数据的操作
注2:COSMIC方法中,才用“兴趣对象”术语,以避免与特定的软件工程方法相关。该术语并不意味着是面向对象方法中的“对象”
数据组-定义:一个唯一的、非空的、无序的数据属性的集合,包含的每个数据属性描述了同一个兴趣对象的一个互补的侧面。
数据组-原则:通过它的唯一的数据属性的集合,每个被识别的数据组必须是唯一的和可区别的。
4.识别数据移动
数据移动-定义:移动单个数据组类型的基本功能构件。
注1:数据移动类型有四种子类型,即:输入、输出、读、写
注2:基于度量目的,每种数据移动被认为负责了某些与之相关的数据运算
注2:更准备的说,是一次数据移动(而不是数据移动类型)实际移动了一个数据组的实例(不是类型)
输入E-定义:输入是一种数据移动,将一个数据组从功能用户一侧跨越边界移动给需要它的功能处理
输出X-定义:输出是一种数据移动,将一个数据组从功能处理侧跨越边界移动给需要他的功能用户
读R-定义:读是一种数据移动,将一个数据组从持久存储介质移动到需要他的功能处理
写W-定义:写是一种数据移动,将一个数据组从功能处理内部移动到持久存储介质中
原则:
#输入:
1)有两种情况:通知(不包含其他数据)、通知+相关数据输入
2)时钟节拍不作为输入,而是触发时间
3)从系统获得的时间不认为是输入
4)特定兴趣对象的不同属性子集输入只作为一个输入
5)帮助用户理解输入数据的字段标题等不作为输入
#输出:
1)固定文本的输出,识别为一个输出,如条款声明
2)特定兴趣对象的不同属性子集输出只作为一个输出
3)帮助用户理解输出数据的字段标题等不作为输出
#读:
1)不跨越边界接收和输出数据,也不向持久性存储介质中写数据
2)计算或移动常量、功能处理内部只能由程序员更改的变量、计算过程的中间结果、并非来自用户功能需求而产生的功能处理并存储均不计入读
3)临时存储非持久化数据的读不计入
#写:
1)移动到持久存储介质的每个数据组分别单独计入一个写操作
2)跨越边界接收和输出数据,也不向持久性存储介质中写数据
3)删除数据识别为写
5、控制命令:功能用户控制软件使用,比如:上一页、下一页、菜单等