📌目录
- [📐 软件工程:面向功能的度量------以用户需求为基准的软件评估方法](#📐 软件工程:面向功能的度量——以用户需求为基准的软件评估方法)
-
- [🎯 一、面向功能度量的概述](#🎯 一、面向功能度量的概述)
- [📋 二、功能点分析(FPA)](#📋 二、功能点分析(FPA))
- [📊 三、用例点方法(UCP)](#📊 三、用例点方法(UCP))
- [🔧 四、其他面向功能的度量方法](#🔧 四、其他面向功能的度量方法)
-
- [(一)特征点(Feature Points)](#(一)特征点(Feature Points))
- (二)COSMIC功能点
- [(三)对象点(Object Points)](#(三)对象点(Object Points))
- (四)NESMA方法
- [📐 五、基于功能点的生产率分析](#📐 五、基于功能点的生产率分析)
- [⚠️ 六、面向功能度量的注意事项](#⚠️ 六、面向功能度量的注意事项)
- [📊 七、实际应用案例](#📊 七、实际应用案例)
- [📝 总结](#📝 总结)

📐 软件工程:面向功能的度量------以用户需求为基准的软件评估方法
面向功能的度量是一种以软件功能(用户可见的业务能力)作为规模基准的度量方法,它从用户视角出发度量软件规模,与编程语言无关,在需求阶段即可进行估算。本文将详细介绍面向功能的度量的概念、方法、指标体系和实际应用。

🎯 一、面向功能度量的概述
(一)面向功能度量的定义
面向功能的度量(Function-Oriented Metrics) 是一种以软件功能规模作为标准化基准的度量方法。它通过度量软件为用户提供的业务功能来确定软件规模,而非依赖代码行数等实现细节,从而实现与编程语言、技术框架无关的客观度量。
面向功能度量在软件度量体系中的位置:
#mermaid-svg-EljArjlySGpr2hE7{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-EljArjlySGpr2hE7 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-EljArjlySGpr2hE7 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-EljArjlySGpr2hE7 .error-icon{fill:#552222;}#mermaid-svg-EljArjlySGpr2hE7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-EljArjlySGpr2hE7 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-EljArjlySGpr2hE7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-EljArjlySGpr2hE7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-EljArjlySGpr2hE7 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-EljArjlySGpr2hE7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-EljArjlySGpr2hE7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-EljArjlySGpr2hE7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-EljArjlySGpr2hE7 .marker.cross{stroke:#333333;}#mermaid-svg-EljArjlySGpr2hE7 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-EljArjlySGpr2hE7 p{margin:0;}#mermaid-svg-EljArjlySGpr2hE7 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-EljArjlySGpr2hE7 .cluster-label text{fill:#333;}#mermaid-svg-EljArjlySGpr2hE7 .cluster-label span{color:#333;}#mermaid-svg-EljArjlySGpr2hE7 .cluster-label span p{background-color:transparent;}#mermaid-svg-EljArjlySGpr2hE7 .label text,#mermaid-svg-EljArjlySGpr2hE7 span{fill:#333;color:#333;}#mermaid-svg-EljArjlySGpr2hE7 .node rect,#mermaid-svg-EljArjlySGpr2hE7 .node circle,#mermaid-svg-EljArjlySGpr2hE7 .node ellipse,#mermaid-svg-EljArjlySGpr2hE7 .node polygon,#mermaid-svg-EljArjlySGpr2hE7 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-EljArjlySGpr2hE7 .rough-node .label text,#mermaid-svg-EljArjlySGpr2hE7 .node .label text,#mermaid-svg-EljArjlySGpr2hE7 .image-shape .label,#mermaid-svg-EljArjlySGpr2hE7 .icon-shape .label{text-anchor:middle;}#mermaid-svg-EljArjlySGpr2hE7 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-EljArjlySGpr2hE7 .rough-node .label,#mermaid-svg-EljArjlySGpr2hE7 .node .label,#mermaid-svg-EljArjlySGpr2hE7 .image-shape .label,#mermaid-svg-EljArjlySGpr2hE7 .icon-shape .label{text-align:center;}#mermaid-svg-EljArjlySGpr2hE7 .node.clickable{cursor:pointer;}#mermaid-svg-EljArjlySGpr2hE7 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-EljArjlySGpr2hE7 .arrowheadPath{fill:#333333;}#mermaid-svg-EljArjlySGpr2hE7 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-EljArjlySGpr2hE7 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-EljArjlySGpr2hE7 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-EljArjlySGpr2hE7 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-EljArjlySGpr2hE7 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-EljArjlySGpr2hE7 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-EljArjlySGpr2hE7 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-EljArjlySGpr2hE7 .cluster text{fill:#333;}#mermaid-svg-EljArjlySGpr2hE7 .cluster span{color:#333;}#mermaid-svg-EljArjlySGpr2hE7 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-EljArjlySGpr2hE7 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-EljArjlySGpr2hE7 rect.text{fill:none;stroke-width:0;}#mermaid-svg-EljArjlySGpr2hE7 .icon-shape,#mermaid-svg-EljArjlySGpr2hE7 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-EljArjlySGpr2hE7 .icon-shape p,#mermaid-svg-EljArjlySGpr2hE7 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-EljArjlySGpr2hE7 .icon-shape .label rect,#mermaid-svg-EljArjlySGpr2hE7 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-EljArjlySGpr2hE7 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-EljArjlySGpr2hE7 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-EljArjlySGpr2hE7 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 软件度量方法
面向规模的度量
面向功能的度量
面向人员的度量
面向过程的度量
LOC代码行数
KLOC千行代码
功能点分析FPA
用例点UCP
对象点OOP
特征点FP
人均产出
人月成本
CMMI度量
过程能力
以代码量为基准
以功能为基准
以人力为基准
以过程为基准
核心特征:
| 特征 | 说明 |
|---|---|
| 用户视角 | 从用户可见的功能出发度量 |
| 语言无关 | 与编程语言和技术无关 |
| 早期可得 | 需求确定后即可计算 |
| 业务导向 | 反映软件为用户提供的实际价值 |
| 标准化 | 国际标准(ISO/IEC 20926) |
(二)面向功能度量的目的
度量目的体系:
#mermaid-svg-AVaBmbInz5zqDdxu{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-AVaBmbInz5zqDdxu .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-AVaBmbInz5zqDdxu .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-AVaBmbInz5zqDdxu .error-icon{fill:#552222;}#mermaid-svg-AVaBmbInz5zqDdxu .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-AVaBmbInz5zqDdxu .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-AVaBmbInz5zqDdxu .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-AVaBmbInz5zqDdxu .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-AVaBmbInz5zqDdxu .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-AVaBmbInz5zqDdxu .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-AVaBmbInz5zqDdxu .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-AVaBmbInz5zqDdxu .marker{fill:#333333;stroke:#333333;}#mermaid-svg-AVaBmbInz5zqDdxu .marker.cross{stroke:#333333;}#mermaid-svg-AVaBmbInz5zqDdxu svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-AVaBmbInz5zqDdxu p{margin:0;}#mermaid-svg-AVaBmbInz5zqDdxu .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-AVaBmbInz5zqDdxu .cluster-label text{fill:#333;}#mermaid-svg-AVaBmbInz5zqDdxu .cluster-label span{color:#333;}#mermaid-svg-AVaBmbInz5zqDdxu .cluster-label span p{background-color:transparent;}#mermaid-svg-AVaBmbInz5zqDdxu .label text,#mermaid-svg-AVaBmbInz5zqDdxu span{fill:#333;color:#333;}#mermaid-svg-AVaBmbInz5zqDdxu .node rect,#mermaid-svg-AVaBmbInz5zqDdxu .node circle,#mermaid-svg-AVaBmbInz5zqDdxu .node ellipse,#mermaid-svg-AVaBmbInz5zqDdxu .node polygon,#mermaid-svg-AVaBmbInz5zqDdxu .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-AVaBmbInz5zqDdxu .rough-node .label text,#mermaid-svg-AVaBmbInz5zqDdxu .node .label text,#mermaid-svg-AVaBmbInz5zqDdxu .image-shape .label,#mermaid-svg-AVaBmbInz5zqDdxu .icon-shape .label{text-anchor:middle;}#mermaid-svg-AVaBmbInz5zqDdxu .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-AVaBmbInz5zqDdxu .rough-node .label,#mermaid-svg-AVaBmbInz5zqDdxu .node .label,#mermaid-svg-AVaBmbInz5zqDdxu .image-shape .label,#mermaid-svg-AVaBmbInz5zqDdxu .icon-shape .label{text-align:center;}#mermaid-svg-AVaBmbInz5zqDdxu .node.clickable{cursor:pointer;}#mermaid-svg-AVaBmbInz5zqDdxu .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-AVaBmbInz5zqDdxu .arrowheadPath{fill:#333333;}#mermaid-svg-AVaBmbInz5zqDdxu .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-AVaBmbInz5zqDdxu .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-AVaBmbInz5zqDdxu .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-AVaBmbInz5zqDdxu .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-AVaBmbInz5zqDdxu .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-AVaBmbInz5zqDdxu .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-AVaBmbInz5zqDdxu .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-AVaBmbInz5zqDdxu .cluster text{fill:#333;}#mermaid-svg-AVaBmbInz5zqDdxu .cluster span{color:#333;}#mermaid-svg-AVaBmbInz5zqDdxu div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-AVaBmbInz5zqDdxu .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-AVaBmbInz5zqDdxu rect.text{fill:none;stroke-width:0;}#mermaid-svg-AVaBmbInz5zqDdxu .icon-shape,#mermaid-svg-AVaBmbInz5zqDdxu .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-AVaBmbInz5zqDdxu .icon-shape p,#mermaid-svg-AVaBmbInz5zqDdxu .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-AVaBmbInz5zqDdxu .icon-shape .label rect,#mermaid-svg-AVaBmbInz5zqDdxu .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-AVaBmbInz5zqDdxu .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-AVaBmbInz5zqDdxu .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-AVaBmbInz5zqDdxu :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 面向功能度量目的
需求阶段估算
跨技术对比
生产率评估
合同定价依据
项目基准比较
过程改进
需求确定即可估算
无需等待编码完成
不同语言项目可比
不同技术栈可比
FP/人月生产率
组织基准建立
基于功能点报价
基于功能点验收
行业基准对标
识别改进领域
度量改进效果
目的详解:
| 目的 | 说明 | 实践意义 |
|---|---|---|
| 需求阶段估算 | 在编码前就能估算项目规模和工作量 | 提前规划资源和预算 |
| 跨技术对比 | 不同语言、不同框架的项目可对比 | 统一度量标准 |
| 生产率评估 | 度量团队交付功能的能力 | 评估真实效率 |
| 合同定价 | 以功能点作为软件定价基准 | 公平合理 |
| 基准比较 | 与行业基准和同类项目对比 | 明确自身水平 |
| 过程改进 | 追踪功能交付效率的变化趋势 | 持续优化 |
(三)面向功能度量与面向规模度量的对比
两种方法对比:
| 对比维度 | 面向规模(LOC) | 面向功能(FP) |
|---|---|---|
| 度量基准 | 代码行数 | 用户功能 |
| 计算时机 | 编码完成后 | 需求确定后即可 |
| 语言独立性 | 否 | 是 |
| 用户相关性 | 低 | 高 |
| 客观性 | 高(自动统计) | 中(需专业分析) |
| 适用阶段 | 编码后 | 需求/设计阶段 |
| 适用场景 | 同语言精确度量 | 跨语言/早期估算 |
| 标准化 | 无统一标准 | ISO/IEC 20926 |
💡 关键理解 :面向功能度量的核心优势在于**"与实现无关"------无论你的软件是用Java、Python还是C++写的,只要提供了相同的功能,功能点就是相同的。这意味着:一个用Python 200行代码实现的"用户登录"功能,和一个用Java 800行代码实现的"用户登录"功能,功能点是一样的**。这正是面向功能度量在合同定价和跨项目比较中的价值所在。
📋 二、功能点分析(FPA)
(一)功能点分析概述
功能点分析发展历史:
#mermaid-svg-xLvQh7Q7wbFbxoCc{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-xLvQh7Q7wbFbxoCc .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-xLvQh7Q7wbFbxoCc .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-xLvQh7Q7wbFbxoCc .error-icon{fill:#552222;}#mermaid-svg-xLvQh7Q7wbFbxoCc .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-xLvQh7Q7wbFbxoCc .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-xLvQh7Q7wbFbxoCc .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-xLvQh7Q7wbFbxoCc .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-xLvQh7Q7wbFbxoCc .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-xLvQh7Q7wbFbxoCc .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-xLvQh7Q7wbFbxoCc .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-xLvQh7Q7wbFbxoCc .marker{fill:#333333;stroke:#333333;}#mermaid-svg-xLvQh7Q7wbFbxoCc .marker.cross{stroke:#333333;}#mermaid-svg-xLvQh7Q7wbFbxoCc svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-xLvQh7Q7wbFbxoCc p{margin:0;}#mermaid-svg-xLvQh7Q7wbFbxoCc .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-xLvQh7Q7wbFbxoCc .cluster-label text{fill:#333;}#mermaid-svg-xLvQh7Q7wbFbxoCc .cluster-label span{color:#333;}#mermaid-svg-xLvQh7Q7wbFbxoCc .cluster-label span p{background-color:transparent;}#mermaid-svg-xLvQh7Q7wbFbxoCc .label text,#mermaid-svg-xLvQh7Q7wbFbxoCc span{fill:#333;color:#333;}#mermaid-svg-xLvQh7Q7wbFbxoCc .node rect,#mermaid-svg-xLvQh7Q7wbFbxoCc .node circle,#mermaid-svg-xLvQh7Q7wbFbxoCc .node ellipse,#mermaid-svg-xLvQh7Q7wbFbxoCc .node polygon,#mermaid-svg-xLvQh7Q7wbFbxoCc .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-xLvQh7Q7wbFbxoCc .rough-node .label text,#mermaid-svg-xLvQh7Q7wbFbxoCc .node .label text,#mermaid-svg-xLvQh7Q7wbFbxoCc .image-shape .label,#mermaid-svg-xLvQh7Q7wbFbxoCc .icon-shape .label{text-anchor:middle;}#mermaid-svg-xLvQh7Q7wbFbxoCc .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-xLvQh7Q7wbFbxoCc .rough-node .label,#mermaid-svg-xLvQh7Q7wbFbxoCc .node .label,#mermaid-svg-xLvQh7Q7wbFbxoCc .image-shape .label,#mermaid-svg-xLvQh7Q7wbFbxoCc .icon-shape .label{text-align:center;}#mermaid-svg-xLvQh7Q7wbFbxoCc .node.clickable{cursor:pointer;}#mermaid-svg-xLvQh7Q7wbFbxoCc .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-xLvQh7Q7wbFbxoCc .arrowheadPath{fill:#333333;}#mermaid-svg-xLvQh7Q7wbFbxoCc .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-xLvQh7Q7wbFbxoCc .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-xLvQh7Q7wbFbxoCc .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-xLvQh7Q7wbFbxoCc .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-xLvQh7Q7wbFbxoCc .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-xLvQh7Q7wbFbxoCc .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-xLvQh7Q7wbFbxoCc .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-xLvQh7Q7wbFbxoCc .cluster text{fill:#333;}#mermaid-svg-xLvQh7Q7wbFbxoCc .cluster span{color:#333;}#mermaid-svg-xLvQh7Q7wbFbxoCc div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-xLvQh7Q7wbFbxoCc .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-xLvQh7Q7wbFbxoCc rect.text{fill:none;stroke-width:0;}#mermaid-svg-xLvQh7Q7wbFbxoCc .icon-shape,#mermaid-svg-xLvQh7Q7wbFbxoCc .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-xLvQh7Q7wbFbxoCc .icon-shape p,#mermaid-svg-xLvQh7Q7wbFbxoCc .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-xLvQh7Q7wbFbxoCc .icon-shape .label rect,#mermaid-svg-xLvQh7Q7wbFbxoCc .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-xLvQh7Q7wbFbxoCc .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-xLvQh7Q7wbFbxoCc .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-xLvQh7Q7wbFbxoCc :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 1979年 IBM Albrecht
1984年 IFPUG成立
1996年 ISO标准 ISO/IEC 20926
2005年 IFPUG 4.3.1
2010年 NESMA方法
2020年 自动化功能点
提出功能点概念
推广标准化
国际认可
AI辅助计数
主要功能点方法:
| 方法 | 机构 | 特点 | 适用场景 |
|---|---|---|---|
| IFPUG方法 | IFPUG(美国) | 最经典、应用最广 | 通用软件 |
| NESMA方法 | NESMA(荷兰) | 简化版,效率更高 | 快速估算 |
| COSMIC方法 | COSMIC组织 | 适合实时/嵌入式 | 实时系统 |
| MK II方法 | 英国 | 事务处理加权 | 事务型系统 |
| FiSMA方法 | 芬兰 | 简化NESMA | 快速评估 |
(二)IFPUG功能点分析流程
IFPUG FPA完整流程:
#mermaid-svg-KJIEzjVrdONR4Ulm{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-KJIEzjVrdONR4Ulm .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-KJIEzjVrdONR4Ulm .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-KJIEzjVrdONR4Ulm .error-icon{fill:#552222;}#mermaid-svg-KJIEzjVrdONR4Ulm .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-KJIEzjVrdONR4Ulm .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-KJIEzjVrdONR4Ulm .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-KJIEzjVrdONR4Ulm .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-KJIEzjVrdONR4Ulm .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-KJIEzjVrdONR4Ulm .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-KJIEzjVrdONR4Ulm .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-KJIEzjVrdONR4Ulm .marker{fill:#333333;stroke:#333333;}#mermaid-svg-KJIEzjVrdONR4Ulm .marker.cross{stroke:#333333;}#mermaid-svg-KJIEzjVrdONR4Ulm svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-KJIEzjVrdONR4Ulm p{margin:0;}#mermaid-svg-KJIEzjVrdONR4Ulm .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-KJIEzjVrdONR4Ulm .cluster-label text{fill:#333;}#mermaid-svg-KJIEzjVrdONR4Ulm .cluster-label span{color:#333;}#mermaid-svg-KJIEzjVrdONR4Ulm .cluster-label span p{background-color:transparent;}#mermaid-svg-KJIEzjVrdONR4Ulm .label text,#mermaid-svg-KJIEzjVrdONR4Ulm span{fill:#333;color:#333;}#mermaid-svg-KJIEzjVrdONR4Ulm .node rect,#mermaid-svg-KJIEzjVrdONR4Ulm .node circle,#mermaid-svg-KJIEzjVrdONR4Ulm .node ellipse,#mermaid-svg-KJIEzjVrdONR4Ulm .node polygon,#mermaid-svg-KJIEzjVrdONR4Ulm .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-KJIEzjVrdONR4Ulm .rough-node .label text,#mermaid-svg-KJIEzjVrdONR4Ulm .node .label text,#mermaid-svg-KJIEzjVrdONR4Ulm .image-shape .label,#mermaid-svg-KJIEzjVrdONR4Ulm .icon-shape .label{text-anchor:middle;}#mermaid-svg-KJIEzjVrdONR4Ulm .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-KJIEzjVrdONR4Ulm .rough-node .label,#mermaid-svg-KJIEzjVrdONR4Ulm .node .label,#mermaid-svg-KJIEzjVrdONR4Ulm .image-shape .label,#mermaid-svg-KJIEzjVrdONR4Ulm .icon-shape .label{text-align:center;}#mermaid-svg-KJIEzjVrdONR4Ulm .node.clickable{cursor:pointer;}#mermaid-svg-KJIEzjVrdONR4Ulm .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-KJIEzjVrdONR4Ulm .arrowheadPath{fill:#333333;}#mermaid-svg-KJIEzjVrdONR4Ulm .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-KJIEzjVrdONR4Ulm .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-KJIEzjVrdONR4Ulm .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-KJIEzjVrdONR4Ulm .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-KJIEzjVrdONR4Ulm .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-KJIEzjVrdONR4Ulm .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-KJIEzjVrdONR4Ulm .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-KJIEzjVrdONR4Ulm .cluster text{fill:#333;}#mermaid-svg-KJIEzjVrdONR4Ulm .cluster span{color:#333;}#mermaid-svg-KJIEzjVrdONR4Ulm div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-KJIEzjVrdONR4Ulm .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-KJIEzjVrdONR4Ulm rect.text{fill:none;stroke-width:0;}#mermaid-svg-KJIEzjVrdONR4Ulm .icon-shape,#mermaid-svg-KJIEzjVrdONR4Ulm .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-KJIEzjVrdONR4Ulm .icon-shape p,#mermaid-svg-KJIEzjVrdONR4Ulm .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-KJIEzjVrdONR4Ulm .icon-shape .label rect,#mermaid-svg-KJIEzjVrdONR4Ulm .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-KJIEzjVrdONR4Ulm .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-KJIEzjVrdONR4Ulm .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-KJIEzjVrdONR4Ulm :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} IFPUG功能点分析
确定计数范围
识别数据功能
识别事务功能
计算未调整功能点UFP
确定价值调整因子VAF
计算调整后功能点
项目边界
应用边界
用户视角
内部逻辑文件ILF
外部接口文件EIF
外部输入EI
外部输出EO
外部查询EQ
各功能加权求和
14个通用系统特征GSC
FP = UFP × VAF
(三)数据功能识别
数据功能分类:
#mermaid-svg-YC64IXz1SfwtIhpW{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-YC64IXz1SfwtIhpW .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-YC64IXz1SfwtIhpW .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-YC64IXz1SfwtIhpW .error-icon{fill:#552222;}#mermaid-svg-YC64IXz1SfwtIhpW .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-YC64IXz1SfwtIhpW .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-YC64IXz1SfwtIhpW .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-YC64IXz1SfwtIhpW .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-YC64IXz1SfwtIhpW .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-YC64IXz1SfwtIhpW .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-YC64IXz1SfwtIhpW .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-YC64IXz1SfwtIhpW .marker{fill:#333333;stroke:#333333;}#mermaid-svg-YC64IXz1SfwtIhpW .marker.cross{stroke:#333333;}#mermaid-svg-YC64IXz1SfwtIhpW svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-YC64IXz1SfwtIhpW p{margin:0;}#mermaid-svg-YC64IXz1SfwtIhpW .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-YC64IXz1SfwtIhpW .cluster-label text{fill:#333;}#mermaid-svg-YC64IXz1SfwtIhpW .cluster-label span{color:#333;}#mermaid-svg-YC64IXz1SfwtIhpW .cluster-label span p{background-color:transparent;}#mermaid-svg-YC64IXz1SfwtIhpW .label text,#mermaid-svg-YC64IXz1SfwtIhpW span{fill:#333;color:#333;}#mermaid-svg-YC64IXz1SfwtIhpW .node rect,#mermaid-svg-YC64IXz1SfwtIhpW .node circle,#mermaid-svg-YC64IXz1SfwtIhpW .node ellipse,#mermaid-svg-YC64IXz1SfwtIhpW .node polygon,#mermaid-svg-YC64IXz1SfwtIhpW .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-YC64IXz1SfwtIhpW .rough-node .label text,#mermaid-svg-YC64IXz1SfwtIhpW .node .label text,#mermaid-svg-YC64IXz1SfwtIhpW .image-shape .label,#mermaid-svg-YC64IXz1SfwtIhpW .icon-shape .label{text-anchor:middle;}#mermaid-svg-YC64IXz1SfwtIhpW .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-YC64IXz1SfwtIhpW .rough-node .label,#mermaid-svg-YC64IXz1SfwtIhpW .node .label,#mermaid-svg-YC64IXz1SfwtIhpW .image-shape .label,#mermaid-svg-YC64IXz1SfwtIhpW .icon-shape .label{text-align:center;}#mermaid-svg-YC64IXz1SfwtIhpW .node.clickable{cursor:pointer;}#mermaid-svg-YC64IXz1SfwtIhpW .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-YC64IXz1SfwtIhpW .arrowheadPath{fill:#333333;}#mermaid-svg-YC64IXz1SfwtIhpW .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-YC64IXz1SfwtIhpW .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-YC64IXz1SfwtIhpW .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-YC64IXz1SfwtIhpW .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-YC64IXz1SfwtIhpW .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-YC64IXz1SfwtIhpW .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-YC64IXz1SfwtIhpW .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-YC64IXz1SfwtIhpW .cluster text{fill:#333;}#mermaid-svg-YC64IXz1SfwtIhpW .cluster span{color:#333;}#mermaid-svg-YC64IXz1SfwtIhpW div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-YC64IXz1SfwtIhpW .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-YC64IXz1SfwtIhpW rect.text{fill:none;stroke-width:0;}#mermaid-svg-YC64IXz1SfwtIhpW .icon-shape,#mermaid-svg-YC64IXz1SfwtIhpW .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-YC64IXz1SfwtIhpW .icon-shape p,#mermaid-svg-YC64IXz1SfwtIhpW .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-YC64IXz1SfwtIhpW .icon-shape .label rect,#mermaid-svg-YC64IXz1SfwtIhpW .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-YC64IXz1SfwtIhpW .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-YC64IXz1SfwtIhpW .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-YC64IXz1SfwtIhpW :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 数据功能
内部逻辑文件ILF
外部接口文件EIF
系统内部维护
逻辑相关的数据组
示例:客户信息表
外部系统维护
本系统仅引用
示例:银行汇率数据
数据功能复杂度与权重:
| 功能类型 | 低复杂度 | 中复杂度 | 高复杂度 |
|---|---|---|---|
| ILF(内部逻辑文件) | 7 FP | 10 FP | 15 FP |
| EIF(外部接口文件) | 5 FP | 7 FP | 10 FP |
复杂度判定因素:
| 因素 | 低 | 中 | 高 |
|---|---|---|---|
| 数据元素类型(DET) | 1-19 | 20-50 | >50 |
| 记录元素类型(RET) | 1 | 2-5 | >5 |
(四)事务功能识别
事务功能分类:
#mermaid-svg-LJ2SHEjoNF0QcdDQ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-LJ2SHEjoNF0QcdDQ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-LJ2SHEjoNF0QcdDQ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-LJ2SHEjoNF0QcdDQ .error-icon{fill:#552222;}#mermaid-svg-LJ2SHEjoNF0QcdDQ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-LJ2SHEjoNF0QcdDQ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-LJ2SHEjoNF0QcdDQ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-LJ2SHEjoNF0QcdDQ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-LJ2SHEjoNF0QcdDQ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-LJ2SHEjoNF0QcdDQ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-LJ2SHEjoNF0QcdDQ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-LJ2SHEjoNF0QcdDQ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-LJ2SHEjoNF0QcdDQ .marker.cross{stroke:#333333;}#mermaid-svg-LJ2SHEjoNF0QcdDQ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-LJ2SHEjoNF0QcdDQ p{margin:0;}#mermaid-svg-LJ2SHEjoNF0QcdDQ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-LJ2SHEjoNF0QcdDQ .cluster-label text{fill:#333;}#mermaid-svg-LJ2SHEjoNF0QcdDQ .cluster-label span{color:#333;}#mermaid-svg-LJ2SHEjoNF0QcdDQ .cluster-label span p{background-color:transparent;}#mermaid-svg-LJ2SHEjoNF0QcdDQ .label text,#mermaid-svg-LJ2SHEjoNF0QcdDQ span{fill:#333;color:#333;}#mermaid-svg-LJ2SHEjoNF0QcdDQ .node rect,#mermaid-svg-LJ2SHEjoNF0QcdDQ .node circle,#mermaid-svg-LJ2SHEjoNF0QcdDQ .node ellipse,#mermaid-svg-LJ2SHEjoNF0QcdDQ .node polygon,#mermaid-svg-LJ2SHEjoNF0QcdDQ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-LJ2SHEjoNF0QcdDQ .rough-node .label text,#mermaid-svg-LJ2SHEjoNF0QcdDQ .node .label text,#mermaid-svg-LJ2SHEjoNF0QcdDQ .image-shape .label,#mermaid-svg-LJ2SHEjoNF0QcdDQ .icon-shape .label{text-anchor:middle;}#mermaid-svg-LJ2SHEjoNF0QcdDQ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-LJ2SHEjoNF0QcdDQ .rough-node .label,#mermaid-svg-LJ2SHEjoNF0QcdDQ .node .label,#mermaid-svg-LJ2SHEjoNF0QcdDQ .image-shape .label,#mermaid-svg-LJ2SHEjoNF0QcdDQ .icon-shape .label{text-align:center;}#mermaid-svg-LJ2SHEjoNF0QcdDQ .node.clickable{cursor:pointer;}#mermaid-svg-LJ2SHEjoNF0QcdDQ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-LJ2SHEjoNF0QcdDQ .arrowheadPath{fill:#333333;}#mermaid-svg-LJ2SHEjoNF0QcdDQ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-LJ2SHEjoNF0QcdDQ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-LJ2SHEjoNF0QcdDQ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-LJ2SHEjoNF0QcdDQ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-LJ2SHEjoNF0QcdDQ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-LJ2SHEjoNF0QcdDQ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-LJ2SHEjoNF0QcdDQ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-LJ2SHEjoNF0QcdDQ .cluster text{fill:#333;}#mermaid-svg-LJ2SHEjoNF0QcdDQ .cluster span{color:#333;}#mermaid-svg-LJ2SHEjoNF0QcdDQ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-LJ2SHEjoNF0QcdDQ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-LJ2SHEjoNF0QcdDQ rect.text{fill:none;stroke-width:0;}#mermaid-svg-LJ2SHEjoNF0QcdDQ .icon-shape,#mermaid-svg-LJ2SHEjoNF0QcdDQ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-LJ2SHEjoNF0QcdDQ .icon-shape p,#mermaid-svg-LJ2SHEjoNF0QcdDQ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-LJ2SHEjoNF0QcdDQ .icon-shape .label rect,#mermaid-svg-LJ2SHEjoNF0QcdDQ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-LJ2SHEjoNF0QcdDQ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-LJ2SHEjoNF0QcdDQ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-LJ2SHEjoNF0QcdDQ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 事务功能
外部输入EI
外部输出EO
外部查询EQ
数据从外部进入系统
维护ILF或改变系统行为
示例:新增客户、修改订单
数据从系统输出到外部
不包含计算或派生
示例:月度报表、统计图表
输入触发数据检索
示例:客户查询、订单搜索
事务功能复杂度与权重:
| 功能类型 | 低复杂度 | 中复杂度 | 高复杂度 |
|---|---|---|---|
| EI(外部输入) | 3 FP | 4 FP | 6 FP |
| EO(外部输出) | 4 FP | 5 FP | 7 FP |
| EQ(外部查询) | 3 FP | 4 FP | 6 FP |
事务功能复杂度判定:
| 因素 | 低 | 中 | 高 |
|---|---|---|---|
| 文件引用类型(FTR) | 0-1 | 2-3 | ≥4 |
| 数据元素类型(DET) | 1-4 | 5-15 | >15 |
(五)价值调整因子(VAF)
14个通用系统特征(GSC):
| 序号 | 特征 | 说明 | 评分(0-5) |
|---|---|---|---|
| 1 | 数据通信 | 协议类型和数量 | 0=批处理,5=多协议 |
| 2 | 分布式数据处理 | 功能分布程度 | 0=无,5=多节点 |
| 3 | 性能要求 | 响应时间约束 | 0=无,5=关键 |
| 4 | 大量使用的配置 | 硬件约束 | 0=无,5=严格 |
| 5 | 事务率 | 处理频率 | 0=批处理,5=实时 |
| 6 | 在线数据输入 | 在线交互程度 | 0=批处理,5=全在线 |
| 7 | 终端用户效率 | 易用性要求 | 评分项数0-5 |
| 8 | 在线更新 | 数据在线更新 | 0=无,5=全部 |
| 9 | 复杂处理 | 逻辑复杂度 | 0=无,5=多种 |
| 10 | 可复用性 | 跨组织复用 | 0=无,5=多组织 |
| 11 | 安装简便性 | 自动安装 | 0=无,5=全自动 |
| 12 | 操作简便性 | 自动恢复 | 0=无,5=全自动 |
| 13 | 多站点 | 多组织使用 | 0=单站点,5=多组织多语言 |
| 14 | 便于变更 | 灵活适应 | 0=无,5=用户可配置 |
VAF计算公式:
| 步骤 | 公式 | 说明 |
|---|---|---|
| 总影响度(TDI) | TDI = Σ(各特征评分) | 14项评分之和 |
| 价值调整因子 | VAF = 0.65 + 0.01 × TDI | 范围0.65-1.35 |
| 调整后功能点 | FP = UFP × VAF | 最终功能点 |
(六)功能点计算实例
计算示例------学生管理系统:
| 功能类型 | 功能名称 | 复杂度 | 功能点 |
|---|---|---|---|
| ILF | 学生信息表 | 中 | 10 |
| ILF | 课程信息表 | 中 | 10 |
| ILF | 成绩记录表 | 高 | 15 |
| EIF | 教师信息(教务系统维护) | 低 | 5 |
| EI | 新增学生 | 低 | 3 |
| EI | 录入成绩 | 中 | 4 |
| EI | 修改课程 | 低 | 3 |
| EO | 成绩单报表 | 中 | 5 |
| EO | 成绩统计分析 | 高 | 7 |
| EQ | 查询学生信息 | 低 | 3 |
| EQ | 查询成绩 | 低 | 3 |
| UFP | 68 | ||
| VAF | 1.15 | ||
| 调整后FP | 78.2 |
💡 关键理解:功能点分析的核心在于**"从用户视角出发"**------不关心你用了多少行代码、什么编程语言、什么数据库,只关心软件为用户提供了多少个数据管理功能和事务处理功能。这使得功能点成为"需求→规模→工作量→成本"这条估算链路中最稳定的锚点。
📊 三、用例点方法(UCP)
(一)用例点概述
用例点方法概述:
#mermaid-svg-N8I1ZT2yd0je2AD6{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-N8I1ZT2yd0je2AD6 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-N8I1ZT2yd0je2AD6 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-N8I1ZT2yd0je2AD6 .error-icon{fill:#552222;}#mermaid-svg-N8I1ZT2yd0je2AD6 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-N8I1ZT2yd0je2AD6 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-N8I1ZT2yd0je2AD6 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-N8I1ZT2yd0je2AD6 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-N8I1ZT2yd0je2AD6 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-N8I1ZT2yd0je2AD6 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-N8I1ZT2yd0je2AD6 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-N8I1ZT2yd0je2AD6 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-N8I1ZT2yd0je2AD6 .marker.cross{stroke:#333333;}#mermaid-svg-N8I1ZT2yd0je2AD6 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-N8I1ZT2yd0je2AD6 p{margin:0;}#mermaid-svg-N8I1ZT2yd0je2AD6 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-N8I1ZT2yd0je2AD6 .cluster-label text{fill:#333;}#mermaid-svg-N8I1ZT2yd0je2AD6 .cluster-label span{color:#333;}#mermaid-svg-N8I1ZT2yd0je2AD6 .cluster-label span p{background-color:transparent;}#mermaid-svg-N8I1ZT2yd0je2AD6 .label text,#mermaid-svg-N8I1ZT2yd0je2AD6 span{fill:#333;color:#333;}#mermaid-svg-N8I1ZT2yd0je2AD6 .node rect,#mermaid-svg-N8I1ZT2yd0je2AD6 .node circle,#mermaid-svg-N8I1ZT2yd0je2AD6 .node ellipse,#mermaid-svg-N8I1ZT2yd0je2AD6 .node polygon,#mermaid-svg-N8I1ZT2yd0je2AD6 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-N8I1ZT2yd0je2AD6 .rough-node .label text,#mermaid-svg-N8I1ZT2yd0je2AD6 .node .label text,#mermaid-svg-N8I1ZT2yd0je2AD6 .image-shape .label,#mermaid-svg-N8I1ZT2yd0je2AD6 .icon-shape .label{text-anchor:middle;}#mermaid-svg-N8I1ZT2yd0je2AD6 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-N8I1ZT2yd0je2AD6 .rough-node .label,#mermaid-svg-N8I1ZT2yd0je2AD6 .node .label,#mermaid-svg-N8I1ZT2yd0je2AD6 .image-shape .label,#mermaid-svg-N8I1ZT2yd0je2AD6 .icon-shape .label{text-align:center;}#mermaid-svg-N8I1ZT2yd0je2AD6 .node.clickable{cursor:pointer;}#mermaid-svg-N8I1ZT2yd0je2AD6 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-N8I1ZT2yd0je2AD6 .arrowheadPath{fill:#333333;}#mermaid-svg-N8I1ZT2yd0je2AD6 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-N8I1ZT2yd0je2AD6 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-N8I1ZT2yd0je2AD6 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-N8I1ZT2yd0je2AD6 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-N8I1ZT2yd0je2AD6 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-N8I1ZT2yd0je2AD6 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-N8I1ZT2yd0je2AD6 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-N8I1ZT2yd0je2AD6 .cluster text{fill:#333;}#mermaid-svg-N8I1ZT2yd0je2AD6 .cluster span{color:#333;}#mermaid-svg-N8I1ZT2yd0je2AD6 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-N8I1ZT2yd0je2AD6 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-N8I1ZT2yd0je2AD6 rect.text{fill:none;stroke-width:0;}#mermaid-svg-N8I1ZT2yd0je2AD6 .icon-shape,#mermaid-svg-N8I1ZT2yd0je2AD6 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-N8I1ZT2yd0je2AD6 .icon-shape p,#mermaid-svg-N8I1ZT2yd0je2AD6 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-N8I1ZT2yd0je2AD6 .icon-shape .label rect,#mermaid-svg-N8I1ZT2yd0je2AD6 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-N8I1ZT2yd0je2AD6 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-N8I1ZT2yd0je2AD6 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-N8I1ZT2yd0je2AD6 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 用例点方法UCP
识别参与者
识别用例
计算未调整用例点UUCP
技术复杂度因子TCF
环境复杂度因子ECF
计算调整后用例点
主要参与者
次要参与者
用例列表
用例权重
参与者权重+用例权重
8个技术因子
10个环境因子
UCP = UUCP × TCF × ECF
用例点与功能点对比:
| 对比维度 | 功能点(FPA) | 用例点(UCP) |
|---|---|---|
| 基础 | 数据功能和事务功能 | 参与者和用例 |
| 适用方法 | 结构化、面向对象均可 | 主要适用于面向对象 |
| 标准化 | ISO/IEC 20926 | 无正式国际标准 |
| 计算复杂度 | 较高 | 相对较低 |
| 与UML关系 | 无直接关系 | 基于UML用例图 |
| 精度 | 高 | 中 |
| 适用阶段 | 需求分析后 | 用例建模后 |
(二)用例点计算步骤
参与者权重:
| 参与者类型 | 权重 | 说明 |
|---|---|---|
| 简单参与者 | 1 | 通过API或协议交互的系统 |
| 平均参与者 | 2 | 通过文本协议交互的系统 |
| 复杂参与者 | 3 | 通过GUI交互的用户 |
用例权重:
| 用例复杂度 | 权重 | 判定标准 |
|---|---|---|
| 简单用例 | 5 | ≤3个事务步骤,≤3个引用 |
| 平均用例 | 10 | 4-7个事务步骤,涉及4个以上引用 |
| 复杂用例 | 15 | >7个事务步骤,或包含复杂算法 |
技术复杂度因子(TCF):
| 序号 | 技术因子 | 权重 |
|---|---|---|
| T1 | 分布式系统 | 2 |
| T2 | 响应时间要求 | 2 |
| T3 | 在线操作 | 1 |
| T4 | 数据交换格式 | 1 |
| T5 | 事务频率 | 1 |
| T6 | 重用的便利性 | 2 |
| T7 | 多平台支持 | 2 |
| T8 | 易于修改 | 2 |
环境复杂度因子(ECF):
| 序号 | 环境因子 | 权重 |
|---|---|---|
| E1 | 团队熟悉项目领域 | -0.03 |
| E2 | 团队开发经验 | -0.03 |
| E3 | 分析师经验 | -0.03 |
| E4 | 技术能力 | -0.03 |
| E5 | 需求稳定性 | -0.03 |
| E6 | 项目进度压力 | 0.01 |
| E7 | 易用性要求 | -0.01 |
| E8 | 技术难度 | 0.01 |
| E9 | 团队士气 | -0.01 |
| E10 | 架构经验 | -0.02 |
用例点计算公式:
| 步骤 | 公式 | 说明 |
|---|---|---|
| 未调整用例点 | UUCP = UAW + UUCW | 参与者权重+用例权重 |
| 技术复杂度因子 | TCF = 0.6 + (0.01 × TTF) | TTF为技术因子总分 |
| 环境复杂度因子 | ECF = 1.4 + (-0.03 × ETF) | ETF为环境因子总分 |
| 调整后用例点 | UCP = UUCP × TCF × ECF | 最终用例点 |
(三)用例点到工作量的转换
转换模型:
| 参数 | 说明 | 典型值 |
|---|---|---|
| 生产率 | 每人月完成的用例点 | 15-25 UCP/人月 |
| 公式 | 工作量 = UCP / 生产率 | --- |
| 示例 | UCP=200,生产率=20 | 工作量=10人月 |
💡 关键理解 :用例点的优势在于它与UML建模自然集成------团队在用例建模的同时就完成了规模估算,不需要额外学习一套独立的功能点分析方法。这对于习惯使用UML的面向对象团队来说,是非常自然的选择。
🔧 四、其他面向功能的度量方法
(一)特征点(Feature Points)
特征点方法:
| 特征点类型 | 说明 | 权重 |
|---|---|---|
| 外部输入 | 数据进入系统的功能 | 3-6 |
| 外部输出 | 数据离开系统的功能 | 4-7 |
| 外部查询 | 数据检索功能 | 3-6 |
| 内部逻辑文件 | 系统内部数据 | 7-15 |
| 外部接口文件 | 外部引用数据 | 5-10 |
| 算法 | 计算密集型功能 | 3-15 |
特征点与功能点的区别:
| 区别维度 | 功能点 | 特征点 |
|---|---|---|
| 适用系统 | 信息系统 | 包含算法型系统 |
| 算法度量 | 不单独计算 | 作为独立功能度量 |
| 适用场景 | 商务系统 | 科学计算、实时系统 |
(二)COSMIC功能点
COSMIC方法概述:
#mermaid-svg-Qe4TfYhO7ti0H2ie{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Qe4TfYhO7ti0H2ie .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Qe4TfYhO7ti0H2ie .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Qe4TfYhO7ti0H2ie .error-icon{fill:#552222;}#mermaid-svg-Qe4TfYhO7ti0H2ie .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Qe4TfYhO7ti0H2ie .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Qe4TfYhO7ti0H2ie .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Qe4TfYhO7ti0H2ie .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Qe4TfYhO7ti0H2ie .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Qe4TfYhO7ti0H2ie .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Qe4TfYhO7ti0H2ie .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Qe4TfYhO7ti0H2ie .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Qe4TfYhO7ti0H2ie .marker.cross{stroke:#333333;}#mermaid-svg-Qe4TfYhO7ti0H2ie svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Qe4TfYhO7ti0H2ie p{margin:0;}#mermaid-svg-Qe4TfYhO7ti0H2ie .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Qe4TfYhO7ti0H2ie .cluster-label text{fill:#333;}#mermaid-svg-Qe4TfYhO7ti0H2ie .cluster-label span{color:#333;}#mermaid-svg-Qe4TfYhO7ti0H2ie .cluster-label span p{background-color:transparent;}#mermaid-svg-Qe4TfYhO7ti0H2ie .label text,#mermaid-svg-Qe4TfYhO7ti0H2ie span{fill:#333;color:#333;}#mermaid-svg-Qe4TfYhO7ti0H2ie .node rect,#mermaid-svg-Qe4TfYhO7ti0H2ie .node circle,#mermaid-svg-Qe4TfYhO7ti0H2ie .node ellipse,#mermaid-svg-Qe4TfYhO7ti0H2ie .node polygon,#mermaid-svg-Qe4TfYhO7ti0H2ie .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Qe4TfYhO7ti0H2ie .rough-node .label text,#mermaid-svg-Qe4TfYhO7ti0H2ie .node .label text,#mermaid-svg-Qe4TfYhO7ti0H2ie .image-shape .label,#mermaid-svg-Qe4TfYhO7ti0H2ie .icon-shape .label{text-anchor:middle;}#mermaid-svg-Qe4TfYhO7ti0H2ie .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Qe4TfYhO7ti0H2ie .rough-node .label,#mermaid-svg-Qe4TfYhO7ti0H2ie .node .label,#mermaid-svg-Qe4TfYhO7ti0H2ie .image-shape .label,#mermaid-svg-Qe4TfYhO7ti0H2ie .icon-shape .label{text-align:center;}#mermaid-svg-Qe4TfYhO7ti0H2ie .node.clickable{cursor:pointer;}#mermaid-svg-Qe4TfYhO7ti0H2ie .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Qe4TfYhO7ti0H2ie .arrowheadPath{fill:#333333;}#mermaid-svg-Qe4TfYhO7ti0H2ie .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Qe4TfYhO7ti0H2ie .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Qe4TfYhO7ti0H2ie .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Qe4TfYhO7ti0H2ie .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Qe4TfYhO7ti0H2ie .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Qe4TfYhO7ti0H2ie .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Qe4TfYhO7ti0H2ie .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Qe4TfYhO7ti0H2ie .cluster text{fill:#333;}#mermaid-svg-Qe4TfYhO7ti0H2ie .cluster span{color:#333;}#mermaid-svg-Qe4TfYhO7ti0H2ie div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Qe4TfYhO7ti0H2ie .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Qe4TfYhO7ti0H2ie rect.text{fill:none;stroke-width:0;}#mermaid-svg-Qe4TfYhO7ti0H2ie .icon-shape,#mermaid-svg-Qe4TfYhO7ti0H2ie .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Qe4TfYhO7ti0H2ie .icon-shape p,#mermaid-svg-Qe4TfYhO7ti0H2ie .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Qe4TfYhO7ti0H2ie .icon-shape .label rect,#mermaid-svg-Qe4TfYhO7ti0H2ie .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Qe4TfYhO7ti0H2ie .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Qe4TfYhO7ti0H2ie .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Qe4TfYhO7ti0H2ie :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} COSMIC功能点
识别功能过程
识别数据移动
计算功能点
触发事件
功能过程边界
Entry E 输入
Exit X 输出
Read R 读
Write W 写
每个数据移动=1 CFP
FP = Σ数据移动数
COSMIC数据移动类型:
| 数据移动 | 符号 | 说明 | CFP |
|---|---|---|---|
| 输入 | E(Entry) | 数据从用户进入功能过程 | 1 |
| 输出 | X(Exit) | 数据从功能过程输出到用户 | 1 |
| 读 | R(Read) | 从持久存储读取数据 | 1 |
| 写 | W(Write) | 向持久存储写入数据 | 1 |
COSMIC方法特点:
| 特点 | 说明 |
|---|---|
| 适用系统 | 实时系统、嵌入式系统、中间件 |
| 度量单位 | CFP(COSMIC Function Point) |
| 计算规则 | 每个数据移动=1 CFP,简单统一 |
| 国际标准 | ISO/IEC 19761 |
| 优势 | 规则简单、适合非商务系统 |
(三)对象点(Object Points)
对象点方法:
| 对象类型 | 说明 | 权重 |
|---|---|---|
| 简单屏幕 | ≤5个字段的屏幕 | 1 |
| 中等屏幕 | 6-8个字段的屏幕 | 2 |
| 复杂屏幕 | >8个字段的屏幕 | 3 |
| 简单报表 | 无计算的报表 | 2 |
| 复杂报表 | 包含计算和排序 | 4-6 |
| 简单模块 | ≤20行代码的组件 | 3 |
| 中等模块 | 21-50行代码的组件 | 5 |
| 复杂模块 | >50行代码的组件 | 10 |
(四)NESMA方法
NESMA三种估算级别:
| 级别 | 名称 | 精度 | 工作量 | 适用场景 |
|---|---|---|---|---|
| 1级 | 指示性估算 | ±50% | 0.5-1人时 | 早期可行性分析 |
| 2级 | 估算性估算 | ±30% | 2-4人时 | 预算编制 |
| 3级 | 详细估算 | ±10% | 8-16人时 | 合同定价 |
NESMA简化规则:
| 功能类型 | 指示性(固定权重) | 估算性(默认复杂度) |
|---|---|---|
| ILF | 7 FP(固定) | 默认中复杂度10 FP |
| EIF | 5 FP(固定) | 默认中复杂度7 FP |
| EI | 3 FP(固定) | 默认中复杂度4 FP |
| EO | 4 FP(固定) | 默认中复杂度5 FP |
| EQ | 3 FP(固定) | 默认中复杂度4 FP |
💡 关键理解 :面向功能的度量不是一个单一方法,而是一个方法族------不同方法适用于不同类型的系统。商务信息系统首选IFPUG功能点或NESMA,面向对象项目适合用例点,实时和嵌入式系统适合COSMIC,科学计算系统适合特征点。选择方法时应考虑系统类型、团队习惯和精度要求。
📐 五、基于功能点的生产率分析
(一)功能点生产率
生产率指标体系:
#mermaid-svg-BZivA9BVymlDUI5k{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-BZivA9BVymlDUI5k .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-BZivA9BVymlDUI5k .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-BZivA9BVymlDUI5k .error-icon{fill:#552222;}#mermaid-svg-BZivA9BVymlDUI5k .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-BZivA9BVymlDUI5k .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-BZivA9BVymlDUI5k .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-BZivA9BVymlDUI5k .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-BZivA9BVymlDUI5k .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-BZivA9BVymlDUI5k .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-BZivA9BVymlDUI5k .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-BZivA9BVymlDUI5k .marker{fill:#333333;stroke:#333333;}#mermaid-svg-BZivA9BVymlDUI5k .marker.cross{stroke:#333333;}#mermaid-svg-BZivA9BVymlDUI5k svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-BZivA9BVymlDUI5k p{margin:0;}#mermaid-svg-BZivA9BVymlDUI5k .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-BZivA9BVymlDUI5k .cluster-label text{fill:#333;}#mermaid-svg-BZivA9BVymlDUI5k .cluster-label span{color:#333;}#mermaid-svg-BZivA9BVymlDUI5k .cluster-label span p{background-color:transparent;}#mermaid-svg-BZivA9BVymlDUI5k .label text,#mermaid-svg-BZivA9BVymlDUI5k span{fill:#333;color:#333;}#mermaid-svg-BZivA9BVymlDUI5k .node rect,#mermaid-svg-BZivA9BVymlDUI5k .node circle,#mermaid-svg-BZivA9BVymlDUI5k .node ellipse,#mermaid-svg-BZivA9BVymlDUI5k .node polygon,#mermaid-svg-BZivA9BVymlDUI5k .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-BZivA9BVymlDUI5k .rough-node .label text,#mermaid-svg-BZivA9BVymlDUI5k .node .label text,#mermaid-svg-BZivA9BVymlDUI5k .image-shape .label,#mermaid-svg-BZivA9BVymlDUI5k .icon-shape .label{text-anchor:middle;}#mermaid-svg-BZivA9BVymlDUI5k .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-BZivA9BVymlDUI5k .rough-node .label,#mermaid-svg-BZivA9BVymlDUI5k .node .label,#mermaid-svg-BZivA9BVymlDUI5k .image-shape .label,#mermaid-svg-BZivA9BVymlDUI5k .icon-shape .label{text-align:center;}#mermaid-svg-BZivA9BVymlDUI5k .node.clickable{cursor:pointer;}#mermaid-svg-BZivA9BVymlDUI5k .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-BZivA9BVymlDUI5k .arrowheadPath{fill:#333333;}#mermaid-svg-BZivA9BVymlDUI5k .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-BZivA9BVymlDUI5k .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-BZivA9BVymlDUI5k .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-BZivA9BVymlDUI5k .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-BZivA9BVymlDUI5k .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-BZivA9BVymlDUI5k .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-BZivA9BVymlDUI5k .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-BZivA9BVymlDUI5k .cluster text{fill:#333;}#mermaid-svg-BZivA9BVymlDUI5k .cluster span{color:#333;}#mermaid-svg-BZivA9BVymlDUI5k div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-BZivA9BVymlDUI5k .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-BZivA9BVymlDUI5k rect.text{fill:none;stroke-width:0;}#mermaid-svg-BZivA9BVymlDUI5k .icon-shape,#mermaid-svg-BZivA9BVymlDUI5k .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-BZivA9BVymlDUI5k .icon-shape p,#mermaid-svg-BZivA9BVymlDUI5k .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-BZivA9BVymlDUI5k .icon-shape .label rect,#mermaid-svg-BZivA9BVymlDUI5k .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-BZivA9BVymlDUI5k .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-BZivA9BVymlDUI5k .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-BZivA9BVymlDUI5k :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 功能点生产率
开发生产率
维护生产率
测试生产率
综合生产率
FP/人月 开发阶段
新增FP/开发人月
变更FP/维护人月
维护工作量/变更FP
测试发现缺陷/测试人月
测试FP/测试人月
总FP/总人月
含维护的长期生产率
行业基准数据:
| 项目类型 | 开发生产率(FP/人月) | 维护生产率(变更FP/人月) |
|---|---|---|
| 商务信息系统 | 6-15 | 15-30 |
| 实时系统 | 3-8 | 10-20 |
| 科学计算 | 4-10 | 12-25 |
| 嵌入式系统 | 3-8 | 8-18 |
| Web应用 | 8-20 | 20-40 |
| 移动应用 | 8-18 | 15-35 |
| 大数据/AI | 4-10 | --- |
(二)基于功能点的估算模型
估算公式:
| 模型 | 公式 | 说明 |
|---|---|---|
| 基本估算 | 工作量 = FP / 生产率 | 简单除法 |
| COCOMO结合 | 工作量 = a × (FP×LOC/FP)^b × EAF | 功能点与COCOMO结合 |
| 参数估算 | 工作量 = C × FP^E | C和E为组织参数 |
| 回归估算 | 工作量 = f(FP, 其他变量) | 多元回归模型 |
估算流程:
#mermaid-svg-Hhv5E1SMa4OhJnOk{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Hhv5E1SMa4OhJnOk .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Hhv5E1SMa4OhJnOk .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Hhv5E1SMa4OhJnOk .error-icon{fill:#552222;}#mermaid-svg-Hhv5E1SMa4OhJnOk .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Hhv5E1SMa4OhJnOk .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Hhv5E1SMa4OhJnOk .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Hhv5E1SMa4OhJnOk .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Hhv5E1SMa4OhJnOk .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Hhv5E1SMa4OhJnOk .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Hhv5E1SMa4OhJnOk .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Hhv5E1SMa4OhJnOk .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Hhv5E1SMa4OhJnOk .marker.cross{stroke:#333333;}#mermaid-svg-Hhv5E1SMa4OhJnOk svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Hhv5E1SMa4OhJnOk p{margin:0;}#mermaid-svg-Hhv5E1SMa4OhJnOk .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Hhv5E1SMa4OhJnOk .cluster-label text{fill:#333;}#mermaid-svg-Hhv5E1SMa4OhJnOk .cluster-label span{color:#333;}#mermaid-svg-Hhv5E1SMa4OhJnOk .cluster-label span p{background-color:transparent;}#mermaid-svg-Hhv5E1SMa4OhJnOk .label text,#mermaid-svg-Hhv5E1SMa4OhJnOk span{fill:#333;color:#333;}#mermaid-svg-Hhv5E1SMa4OhJnOk .node rect,#mermaid-svg-Hhv5E1SMa4OhJnOk .node circle,#mermaid-svg-Hhv5E1SMa4OhJnOk .node ellipse,#mermaid-svg-Hhv5E1SMa4OhJnOk .node polygon,#mermaid-svg-Hhv5E1SMa4OhJnOk .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Hhv5E1SMa4OhJnOk .rough-node .label text,#mermaid-svg-Hhv5E1SMa4OhJnOk .node .label text,#mermaid-svg-Hhv5E1SMa4OhJnOk .image-shape .label,#mermaid-svg-Hhv5E1SMa4OhJnOk .icon-shape .label{text-anchor:middle;}#mermaid-svg-Hhv5E1SMa4OhJnOk .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Hhv5E1SMa4OhJnOk .rough-node .label,#mermaid-svg-Hhv5E1SMa4OhJnOk .node .label,#mermaid-svg-Hhv5E1SMa4OhJnOk .image-shape .label,#mermaid-svg-Hhv5E1SMa4OhJnOk .icon-shape .label{text-align:center;}#mermaid-svg-Hhv5E1SMa4OhJnOk .node.clickable{cursor:pointer;}#mermaid-svg-Hhv5E1SMa4OhJnOk .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Hhv5E1SMa4OhJnOk .arrowheadPath{fill:#333333;}#mermaid-svg-Hhv5E1SMa4OhJnOk .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Hhv5E1SMa4OhJnOk .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Hhv5E1SMa4OhJnOk .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Hhv5E1SMa4OhJnOk .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Hhv5E1SMa4OhJnOk .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Hhv5E1SMa4OhJnOk .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Hhv5E1SMa4OhJnOk .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Hhv5E1SMa4OhJnOk .cluster text{fill:#333;}#mermaid-svg-Hhv5E1SMa4OhJnOk .cluster span{color:#333;}#mermaid-svg-Hhv5E1SMa4OhJnOk div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Hhv5E1SMa4OhJnOk .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Hhv5E1SMa4OhJnOk rect.text{fill:none;stroke-width:0;}#mermaid-svg-Hhv5E1SMa4OhJnOk .icon-shape,#mermaid-svg-Hhv5E1SMa4OhJnOk .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Hhv5E1SMa4OhJnOk .icon-shape p,#mermaid-svg-Hhv5E1SMa4OhJnOk .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Hhv5E1SMa4OhJnOk .icon-shape .label rect,#mermaid-svg-Hhv5E1SMa4OhJnOk .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Hhv5E1SMa4OhJnOk .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Hhv5E1SMa4OhJnOk .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Hhv5E1SMa4OhJnOk :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 功能点估算流程
功能点计数
确定生产率基准
计算基础工作量
调整因子应用
得出估算结果
详细/估算/指示性
组织历史数据
行业基准
工作量 = FP/生产率
技术复杂度
人员能力
环境因素
点估算值
置信区间
(三)功能点与合同定价
基于功能点的合同模式:
| 模式 | 说明 | 适用场景 |
|---|---|---|
| 固定价格 | 基于功能点估算固定总价 | 需求明确的项目 |
| 单价合同 | 每个功能点固定价格 | 需求可能变化的项目 |
| 成本补偿 | 按实际工作量+利润结算 | 高度不确定的项目 |
| 目标价格 | 设定目标价格,共享节省/超支 | 风险共担 |
功能点定价参考:
| 维度 | 参考值 | 说明 |
|---|---|---|
| 国内平均单价 | 800-2000元/FP | 因地区、行业而异 |
| 国际参考 | 200-600美元/FP | 因国家、复杂度而异 |
| 政府项目 | 参照国标定价 | 部分省市有明确指导价 |
| 维护单价 | 开发单价的30-50% | 维护通常低于开发 |
💡 关键理解 :功能点作为合同定价基准的核心优势是公平性------需求减少了就减少功能点,合同价格相应降低;需求增加了就增加功能点,合同价格相应增加。这比"固定总价"模式更能应对需求变化的现实,也避免了甲乙双方在"这个需求做不做"上的无休止争论。
⚠️ 六、面向功能度量的注意事项
(一)常见问题
度量常见问题:
| 问题 | 说明 | 解决方法 |
|---|---|---|
| 计数不一致 | 不同分析师得出不同功能点 | 统一计数规则、培训认证 |
| 过度细化 | 过度追求精确计数 | 根据阶段选择适当精度 |
| 忽视调整因子 | 忽略VAF或环境因子 | 系统评估所有影响因子 |
| 混淆功能与界面 | 把每个页面当作一个功能 | 从数据操作角度分析 |
| 数据功能遗漏 | 忽略内部逻辑文件 | 系统梳理所有数据实体 |
(二)功能点计数的质量保证
质量保证措施:
#mermaid-svg-79Ltl4fJnh035IGs{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-79Ltl4fJnh035IGs .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-79Ltl4fJnh035IGs .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-79Ltl4fJnh035IGs .error-icon{fill:#552222;}#mermaid-svg-79Ltl4fJnh035IGs .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-79Ltl4fJnh035IGs .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-79Ltl4fJnh035IGs .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-79Ltl4fJnh035IGs .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-79Ltl4fJnh035IGs .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-79Ltl4fJnh035IGs .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-79Ltl4fJnh035IGs .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-79Ltl4fJnh035IGs .marker{fill:#333333;stroke:#333333;}#mermaid-svg-79Ltl4fJnh035IGs .marker.cross{stroke:#333333;}#mermaid-svg-79Ltl4fJnh035IGs svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-79Ltl4fJnh035IGs p{margin:0;}#mermaid-svg-79Ltl4fJnh035IGs .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-79Ltl4fJnh035IGs .cluster-label text{fill:#333;}#mermaid-svg-79Ltl4fJnh035IGs .cluster-label span{color:#333;}#mermaid-svg-79Ltl4fJnh035IGs .cluster-label span p{background-color:transparent;}#mermaid-svg-79Ltl4fJnh035IGs .label text,#mermaid-svg-79Ltl4fJnh035IGs span{fill:#333;color:#333;}#mermaid-svg-79Ltl4fJnh035IGs .node rect,#mermaid-svg-79Ltl4fJnh035IGs .node circle,#mermaid-svg-79Ltl4fJnh035IGs .node ellipse,#mermaid-svg-79Ltl4fJnh035IGs .node polygon,#mermaid-svg-79Ltl4fJnh035IGs .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-79Ltl4fJnh035IGs .rough-node .label text,#mermaid-svg-79Ltl4fJnh035IGs .node .label text,#mermaid-svg-79Ltl4fJnh035IGs .image-shape .label,#mermaid-svg-79Ltl4fJnh035IGs .icon-shape .label{text-anchor:middle;}#mermaid-svg-79Ltl4fJnh035IGs .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-79Ltl4fJnh035IGs .rough-node .label,#mermaid-svg-79Ltl4fJnh035IGs .node .label,#mermaid-svg-79Ltl4fJnh035IGs .image-shape .label,#mermaid-svg-79Ltl4fJnh035IGs .icon-shape .label{text-align:center;}#mermaid-svg-79Ltl4fJnh035IGs .node.clickable{cursor:pointer;}#mermaid-svg-79Ltl4fJnh035IGs .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-79Ltl4fJnh035IGs .arrowheadPath{fill:#333333;}#mermaid-svg-79Ltl4fJnh035IGs .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-79Ltl4fJnh035IGs .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-79Ltl4fJnh035IGs .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-79Ltl4fJnh035IGs .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-79Ltl4fJnh035IGs .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-79Ltl4fJnh035IGs .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-79Ltl4fJnh035IGs .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-79Ltl4fJnh035IGs .cluster text{fill:#333;}#mermaid-svg-79Ltl4fJnh035IGs .cluster span{color:#333;}#mermaid-svg-79Ltl4fJnh035IGs div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-79Ltl4fJnh035IGs .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-79Ltl4fJnh035IGs rect.text{fill:none;stroke-width:0;}#mermaid-svg-79Ltl4fJnh035IGs .icon-shape,#mermaid-svg-79Ltl4fJnh035IGs .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-79Ltl4fJnh035IGs .icon-shape p,#mermaid-svg-79Ltl4fJnh035IGs .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-79Ltl4fJnh035IGs .icon-shape .label rect,#mermaid-svg-79Ltl4fJnh035IGs .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-79Ltl4fJnh035IGs .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-79Ltl4fJnh035IGs .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-79Ltl4fJnh035IGs :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 功能点计数质量保证
培训认证
交叉审查
工具辅助
基准校准
IFPUG CFPS认证
定期培训
双人独立计数
差异不超过10%
自动化计数工具
偏差分析
与历史项目对比
认证体系:
| 认证 | 机构 | 级别 | 说明 |
|---|---|---|---|
| CFPS | IFPUG | 专业级 | 国际认可的功能点专家 |
| NESMA认证 | NESMA | 基础/高级 | 荷兰NESMA方法认证 |
| COSMIC认证 | COSMIC | 专业级 | COSMIC方法专家认证 |
(三)度量原则
正确实施原则:
| 原则 | 说明 | 实践建议 |
|---|---|---|
| 用户视角 | 始终从用户角度度量功能 | 不考虑内部实现细节 |
| 一致性 | 同类功能采用相同的计数规则 | 建立组织计数规范 |
| 适当精度 | 不同阶段用不同精度 | 早期用NESMA 1级 |
| 持续校准 | 用实际数据校准模型 | 项目结束后回填数据 |
| 工具辅助 | 使用工具提高效率 | 结合需求管理工具 |
(四)局限性分析
局限性:
| 局限 | 说明 | 应对方法 |
|---|---|---|
| 主观性 | 功能识别和复杂度判断有主观性 | 培训认证+交叉审查 |
| 非功能不覆盖 | 不度量性能、安全等非功能 | 结合其他度量方法 |
| 算法型系统 | 计算密集型功能不易用FPA度量 | 使用COSMIC或特征点 |
| 计数成本 | 详细计数需要时间和专业人员 | 分阶段使用不同精度 |
| 数据功能模糊 | 某些系统数据边界不清晰 | 参考系统边界定义 |
💡 关键理解:面向功能的度量最大的挑战是**"计数的一致性"**------同一个系统,两个训练有素的分析师可能得出相差5-10%的功能点数。这不是方法的问题,而是任何需要人工判断的方法都会存在的固有特征。关键在于通过培训、认证和交叉审查将差异控制在可接受范围内(通常±10%)。
📊 七、实际应用案例
(一)电商系统功能点估算
电商系统功能点分解:
| 功能类型 | 功能名称 | 复杂度 | 功能点 |
|---|---|---|---|
| ILF | 用户账户 | 中 | 10 |
| ILF | 商品目录 | 高 | 15 |
| ILF | 订单信息 | 高 | 15 |
| ILF | 支付记录 | 中 | 10 |
| ILF | 库存数据 | 中 | 10 |
| EIF | 物流系统接口 | 低 | 5 |
| EIF | 支付网关接口 | 低 | 5 |
| EI | 用户注册 | 中 | 4 |
| EI | 添加商品到购物车 | 低 | 3 |
| EI | 提交订单 | 高 | 6 |
| EI | 商品入库 | 中 | 4 |
| EO | 订单确认邮件 | 低 | 4 |
| EO | 销售统计报表 | 高 | 7 |
| EO | 库存预警报表 | 中 | 5 |
| EQ | 商品搜索 | 中 | 4 |
| EQ | 订单查询 | 低 | 3 |
| EQ | 库存查询 | 低 | 3 |
| UFP | 113 | ||
| VAF | 在线交易、性能要求、安全性 | 1.20 | |
| 调整后FP | 135.6 |
(二)功能点在项目全流程中的应用
全流程应用:
#mermaid-svg-UbbA7010q7feK4EN{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-UbbA7010q7feK4EN .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-UbbA7010q7feK4EN .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-UbbA7010q7feK4EN .error-icon{fill:#552222;}#mermaid-svg-UbbA7010q7feK4EN .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-UbbA7010q7feK4EN .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-UbbA7010q7feK4EN .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-UbbA7010q7feK4EN .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-UbbA7010q7feK4EN .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-UbbA7010q7feK4EN .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-UbbA7010q7feK4EN .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-UbbA7010q7feK4EN .marker{fill:#333333;stroke:#333333;}#mermaid-svg-UbbA7010q7feK4EN .marker.cross{stroke:#333333;}#mermaid-svg-UbbA7010q7feK4EN svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-UbbA7010q7feK4EN p{margin:0;}#mermaid-svg-UbbA7010q7feK4EN .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-UbbA7010q7feK4EN .cluster-label text{fill:#333;}#mermaid-svg-UbbA7010q7feK4EN .cluster-label span{color:#333;}#mermaid-svg-UbbA7010q7feK4EN .cluster-label span p{background-color:transparent;}#mermaid-svg-UbbA7010q7feK4EN .label text,#mermaid-svg-UbbA7010q7feK4EN span{fill:#333;color:#333;}#mermaid-svg-UbbA7010q7feK4EN .node rect,#mermaid-svg-UbbA7010q7feK4EN .node circle,#mermaid-svg-UbbA7010q7feK4EN .node ellipse,#mermaid-svg-UbbA7010q7feK4EN .node polygon,#mermaid-svg-UbbA7010q7feK4EN .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-UbbA7010q7feK4EN .rough-node .label text,#mermaid-svg-UbbA7010q7feK4EN .node .label text,#mermaid-svg-UbbA7010q7feK4EN .image-shape .label,#mermaid-svg-UbbA7010q7feK4EN .icon-shape .label{text-anchor:middle;}#mermaid-svg-UbbA7010q7feK4EN .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-UbbA7010q7feK4EN .rough-node .label,#mermaid-svg-UbbA7010q7feK4EN .node .label,#mermaid-svg-UbbA7010q7feK4EN .image-shape .label,#mermaid-svg-UbbA7010q7feK4EN .icon-shape .label{text-align:center;}#mermaid-svg-UbbA7010q7feK4EN .node.clickable{cursor:pointer;}#mermaid-svg-UbbA7010q7feK4EN .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-UbbA7010q7feK4EN .arrowheadPath{fill:#333333;}#mermaid-svg-UbbA7010q7feK4EN .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-UbbA7010q7feK4EN .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-UbbA7010q7feK4EN .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-UbbA7010q7feK4EN .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-UbbA7010q7feK4EN .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-UbbA7010q7feK4EN .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-UbbA7010q7feK4EN .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-UbbA7010q7feK4EN .cluster text{fill:#333;}#mermaid-svg-UbbA7010q7feK4EN .cluster span{color:#333;}#mermaid-svg-UbbA7010q7feK4EN div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-UbbA7010q7feK4EN .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-UbbA7010q7feK4EN rect.text{fill:none;stroke-width:0;}#mermaid-svg-UbbA7010q7feK4EN .icon-shape,#mermaid-svg-UbbA7010q7feK4EN .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-UbbA7010q7feK4EN .icon-shape p,#mermaid-svg-UbbA7010q7feK4EN .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-UbbA7010q7feK4EN .icon-shape .label rect,#mermaid-svg-UbbA7010q7feK4EN .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-UbbA7010q7feK4EN .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-UbbA7010q7feK4EN .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-UbbA7010q7feK4EN :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 需求阶段
功能点估算
工作量估算
项目计划
开发执行
功能点验收
生产率计算
基准更新
UFP=136
136/10=13.6人月
实际交付=140FP
实际生产率=10.2FP/人月
更新组织基准
全流程应用详解:
| 阶段 | 应用 | 数据 |
|---|---|---|
| 需求阶段 | 功能点估算 | UFP=136,FP=136 |
| 估算阶段 | 工作量=FP/生产率 | 136/10=13.6人月 |
| 计划阶段 | 资源分配 | 4人团队,3.5个月 |
| 开发阶段 | 跟踪交付进度 | 每Sprint交付多少FP |
| 验收阶段 | 基于FP验收 | 实际交付140FP |
| 总结阶段 | 计算生产率 | 140/14=10FP/人月 |
| 改进阶段 | 更新基准 | 历史基准从9调整到10 |
💡 关键理解 :功能点的最大价值不仅在"估算",更在于建立"功能→工作量→成本"的可预测性 。当一个组织积累了足够的数据,看到"136功能点的项目大约需要14人月",就能在客户提出新需求时快速、自信、有依据地给出报价和工期------这比拍脑袋估算靠谱得多。
📝 总结
面向功能的度量是软件度量体系中以用户需求功能为基准的核心方法,实现了与编程语言和技术无关的客观度量。
🎯 度量定义:以软件为用户提供的功能(业务能力)作为规模基准,从用户视角度量软件规模,与实现细节无关。
📋 功能点分析FPA:IFPUG方法是最经典的功能点方法,通过识别数据功能(ILF/EIF)和事务功能(EI/EO/EQ),计算未调整功能点UFP,再用VAF调整得出最终FP。
📊 用例点UCP:基于UML用例模型的规模度量,通过参与者权重和用例权重计算UUCP,再经技术和环境因子调整。适合面向对象团队,与建模自然集成。
🔧 其他方法:COSMIC适合实时/嵌入式系统(每个数据移动=1CFP),特征点适合算法型系统,NESMA提供三级精度选择,对象点适合早期快速估算。
📐 生产率分析:行业基准约6-15FP/人月(商务系统),功能点也是合同定价的公平基准(国内800-2000元/FP),建立"功能→工作量→成本"的可预测性。
⚠️ 注意事项:计数一致性是最大挑战(差异±10%可接受),需要通过培训认证和交叉审查控制质量;功能点不覆盖非功能需求,需结合其他度量方法。
📊 实际应用:从需求估算→工作量计划→开发跟踪→验收定价→基准更新,贯穿项目全生命周期。
核心启示 :面向功能的度量让软件度量回归了本质------软件的价值在于它为用户做了什么,而不是用了多少行代码 。在需求阶段就能估算规模,在合同阶段就能公平定价,在跨语言项目中就能统一比较------这些都是面向规模的度量做不到的。面向功能的度量不是"更高级"或"更正确",而是在特定的场景下更合适:需求阶段、跨技术对比、合同定价,这三个场景是它的主战场。当你的组织开始用"这个系统有多少功能点"来代替"这个系统大概多大"时,软件工程就从"拍脑袋"迈向了"有据可依"。