# 功能点分析法整理
Date: 2020-06-04


由于工作需要，需要在项目立项前都需要进行功能点估算, 为后续计算项目组的的工作效率做准备。目前做了几次估算，在这里整理和总结一下。 我们目前使用的评估的标准参考 `IFPUG: ISO/IEC 20926:2009`

### 概述

定义:

```wiki
The function point is a "unit of measurement" to express the amount of
business functionality an information system (as a product) provides to 
a user.
```

功能点是业务功能的单位, 也就是从用户视角的进行评估， 是可以和用户交流的。对于我现在实施的外包项目来说就是用一种方法和甲方达成共识。相比较与之前的根据经验评估更有依据些。

### 步骤

#### 1\. 功能点应用的分类

- 开发项目: 从无到有
- 升级项目: 功能升级
- 应用项目: 基线评估

#### 2\. 识别应用边界

被测应用与用户间的边界。

#### 3\. 确认功能点

被测应用与用户间的边界。

- 数据功能
    - ILF: 容纳本应用维护的一组业务数据, 控制数据
    - ELF: 容纳外部应用维护的数据， 对于外部数据来说是他的ILF
- 处理功能
    - EI: 处理来自应用外部的的数据， 主要实现ILF的维护, 应用的控制
    - EO: 通过ILF生成新数据， 已报表，数据流形式送到应用以外
    - EQ: 请求来自应用外部, 处理过程包含输入，输出, 但输入不进行ILF文件的维护

### 复杂度

#### 1\. 复杂度评估涉及三种元素 RET & DET & FTR

- DET :用户可识别的，非重复的域
- RET :用户可识别的数据的子集合
- FTR: 引用文件类型

#### 2\. ILF & EIF 的复杂度

- ILF & EIF

|  | 1 to 19 DET | 20 to 50 DET | 51 or more DET |
| --- | --- | --- | --- |
| 1 RET | Low | Low | Average |
| 2 to 5 RET | Low | Average | High |
| 6 or more RET | Average | High | High |

- ILF:

| Functional Complexity Rating | Unadjusted Function Points |
| --- | --- |
| Low | 7 |
| Average | 10 |
| High | 15 |

- EIF:

| Functional Complexity Rating | Unadjusted Function Points |
| --- | --- |
| Low | 5 |
| Average | 7 |
| High | 10 |

#### 3\. EI & EO & EQ 的复杂度

- EI:

|  | 1 to 4 DET | 5 to 15 DET | 16 or more DET |
| --- | --- | --- | --- |
| 0 to 1 FTR | Low | Low | Average |
| 2 FTRs | Low | Average | High |
| 3 or more FTRs | Average | High | High |

- EO & EQ

|  | 1 to 5 DET | 6 to 19 DET | 20 or more DET |
| --- | --- | --- | --- |
| 0 to 1 FTR | Low | Low | Average |
| 2 to 3 FTRs | Low | Average | High |
| 4 or more FTRs | Average | High | High |

- EI & EQ:

| Functional Complexity Rating | Unadjusted Function Points |
| --- | --- |
| Low | 3 |
| Average | 4 |
| High | 6 |

- EO:

| Functional Complexity Rating | Unadjusted Function Points |
| --- | --- |
| Low | 4 |
| Average | 5 |
| High | 7 |

关于复杂度我们实际场景中目前取的都是平均数， 没有对功能点负责度进一步分析，后续会对数据进行统计， 折算出应用的固定的权重。

### 举例

以一个骑行健身器为例子

#### 1\. ILF : 涉及两组信息:

- 骑行信息:

| 序号 | 字段 |
| --- | --- |
| 1 | 平均速度 |
| 2 | 自行车的凉爽系数 |
| 3 | 节奏 |
| 4 | 卡路里燃烧 |
| 5 | 乘车日期 |
| 6 | 乘车距离 |
| 7 | 骑行时间 |
| 8 | 温度 |

- 骑行者信息:

| 序号 | 字段 |
| --- | --- |
| 1 | 年龄 |
| 2 | 体重 |
| 3 | 性别 |

#### 2\. EI

- 骑行信息: 针对 1-8 个 信息 的增删改操作(EI)， 其中卡路里计算需要参考 `骑行者信息` 中的体重 ， 得出一下结论：
    
    - 新增，修改操作 涉及 8 个`DET`, 2个 `FTR`
    - 删除 涉及 8 个`DET`, 1个 `FTR`
- 骑行者信息: 针对 1-3 个 `DET` 的增删改操作(EI)
    

| 交易处理 | DET | FTR | Complexity Rating | FPs |
| --- | --- | --- | --- | --- |
| Ride 增加 | 8 | 2 | Average | 4 |
| Ride 修改 | 8 | 2 | Average | 4 |
| Ride 删除 | 8 | 1 | Low | 3 |
| Rider 新增 | 3 | 1 | Low | 3 |
| Rider 修改 | 3 | 1 | Low | 3 |

#### 3\. EQ

查询骑行信息, 骑行者信息:

| 交易处理 | DET | FTR | Complexity Rating | FPs |
| --- | --- | --- | --- | --- |
| Ride 查询 | 8 | 1 | Low | 4 |
| Ride 查询 | 3 | 1 | Low | 4 |

#### 4\. ILF

| 交易处理 | DET | FTR | Complexity Rating | FPs |
| --- | --- | --- | --- | --- |
| ILF Ride | 8 | 1 | Low | 7 |
| ILF Rider | 3 | 1 | Low | 7 |

#### 5\. EO

假设如下需求: 骑行距离,平均速度，骑行时间,卡路里按 日, 周, 月统计, 支持在线查看和打印

3个报表维度 \* 4个业务数据 \* 2种展示方式 = 24 个 EO

每个EO生成至少需要骑行表中两个数据功能点统计如下:

| 交易处理 | DET | FTR | Complexity Rating | FPs |
| --- | --- | --- | --- | --- |
| EO | 2 | 1 | Low | 4 |

#### 6\. 汇总

| 交易处理 | DET | FTR | Complexity Rating | FPs | # | Total FP |
| --- | --- | --- | --- | --- | --- | --- |
| Ride 增加 | 8 | 2 | Average | 4 | 1 | 4 |
| Ride 修改 | 8 | 2 | Average | 4 | 1 | 4 |
| Ride 删除 | 8 | 1 | Low | 3 | 1 | 3 |
| Rider 新增 | 3 | 1 | Low | 3 | 1 | 3 |
| Rider 修改 | 3 | 1 | Low | 3 | 1 | 3 |
| Ride 查询 | 8 | 1 | Low | 4 | 1 | 4 |
| Rider 查询 | 3 | 1 | Low | 4 | 1 | 4 |
| ILF Ride | 8 | 1 | Low | 7 | 1 | 7 |
| ILF Rider | 3 | 1 | Low | 7 | 1 | 7 |
| EO | 2 | 1 | Low | 4 | 24 | 96 |

功能点: 135

### 参考及引用

[Function point](https://en.wikipedia.org/wiki/Function_point) [functionpoints](https://www.youtube.com/channel/UCJkLRTHcIRcoLSJ8FTte15w) [软件功能点分析法](http://hongyitong.github.io/2018/08/11/%E8%BD%AF%E4%BB%B6%E5%8A%9F%E8%83%BD%E7%82%B9%E5%88%86%E6%9E%90%E6%B3%95/)

