软件设计复杂性
复杂性一词代表事件或事物的状态,具有多个相互关联的环节和高度复杂的结构。在软件编程中,随着软件设计的实现,元素及其互连的数量逐渐变得庞大,这变得难以一下子理解。
如果不使用复杂性指标和措施,软件设计复杂性很难评估。让我们看看三个重要的软件复杂性措施。
Halstead 的复杂性措施
1977 年,Maurice Howard Halstead 先生引入了衡量软件复杂性的指标。Halstead 的指标取决于程序的实际实现及其措施,这些措施以静态方式直接从源代码中的运算符和操作数计算得出。它允许评估 C/C++/Java 源代码的测试时间、词汇量、大小、难度、错误和工作量。
根据 Halstead 的说法,"计算机程序是一种算法的实现,被认为是一组标记,可以归类为运算符或操作数"。 Halstead 指标将程序视为运算符及其相关操作数的序列。
他定义了各种指标来检查模块的复杂性。
参数 | 含义 |
---|---|
n1 | 唯一运算符的数量 |
n2 | 唯一操作数的数量 |
N1 | 运算符的总出现次数 |
N2 | 操作数的总出现次数 |
当我们选择源文件以在 Metric Viewer 中查看其复杂性详细信息时,结果如下指标报告中显示:
指标 | 含义 | 数学表示 |
---|---|---|
n | 词汇 | n1 + n2 |
N | 大小 | N1 + N2 |
V | 体积 | 长度 * Log2 词汇 |
D | 难度 | (n1/2) * (N1/n2) |
E | 努力 | 难度 * 数量 |
B | 错误 | 数量 / 3000 |
T | 测试时间 | 时间 = 努力 / S,其中 S=18 秒。 |
循环复杂度度量
每个程序都包含要执行的语句,以便执行某些任务,以及其他决策语句,这些语句决定哪些语句需要执行这些决策结构。这些决策结构改变了程序的流程。
如果我们比较两个同样大小的程序,决策语句较多的程序会更复杂,因为程序的控制会频繁跳转。
1976 年,McCabe 提出了圈复杂度度量来量化给定软件的复杂性。它是基于程序决策结构的图形驱动模型,例如 if-else、do-while、repeat-until、switch-case 和 goto 语句。
制作流程控制图的过程:
- 将程序拆分为较小的块,并由决策结构分隔。
- 创建代表每个节点的节点。
- 按如下方式连接节点:
如果控制可以从块 i 分支到块 j
画一条弧
从出口节点到入口节点
画一条弧。
要计算程序模块的圈复杂度,我们使用公式 -
V(G) = e – n + 2 Where e is total number of edges n is total number of nodes

上述模块的循环复杂度为
e = 10 n = 8 Cyclomatic Complexity = 10 - 8 + 2 = 4
根据 P. Jorgensen 的说法,模块的圈复杂度不应超过 10。
功能点
它被广泛用于测量软件的大小。功能点专注于系统提供的功能。系统的特性和功能用于测量软件的复杂性。
功能点依靠五个参数,即外部输入、外部输出、逻辑内部文件、外部接口文件和外部查询。为了考虑软件的复杂性,每个参数进一步分为简单、平均或复杂。

让我们看看功能点的参数:
外部输入
来自外部的每个系统唯一输入都被视为外部输入。输入的唯一性是衡量的,因为没有两个输入应该具有相同的格式。这些输入可以是数据或控制参数。
简单 - 如果输入数量较少且影响较少的内部文件
复杂 - 如果输入数量较多且影响较多的内部文件
一般 - 介于简单和复杂之间。
外部输出
系统提供的所有输出类型都计入此类别。如果输出格式和/或处理方式独一无二,则输出被视为独一无二。
简单 - 如果输出数量较少
复杂 - 如果输出数量较多
一般 - 介于简单和复杂之间。
逻辑内部文件
每个软件系统都会维护内部文件,以维护其功能信息并正常运行。这些文件保存系统的逻辑数据。该逻辑数据可能包含功能数据和控制数据。
简单 - 如果记录类型数量较少
复杂 - 如果记录类型数量较多
一般 - 介于简单和复杂之间。
外部接口文件
软件系统可能需要与某些外部软件共享其文件,或者可能需要传递文件进行处理或作为某些函数的参数。所有这些文件都算作外部接口文件。
简单 - 如果共享文件中的记录类型数量较少
复杂 - 如果共享文件中的记录类型数量较多
一般 - 介于简单和复杂之间。
外部查询
查询是输入和输出的组合,用户发送一些数据作为输入进行查询,系统通过处理后的查询输出响应用户。查询的复杂性大于外部输入和外部输出。如果查询的输入和输出在格式和数据方面是唯一的,则称查询是唯一的。
简单 - 如果查询需要低处理并产生少量输出数据
复杂 - 如果查询需要高处理并产生大量输出数据
平均 - 介于简单和复杂之间。
系统中的这些参数中的每一个都根据其类别和复杂性赋予权重。下表列出了赋予每个参数的权重:
参数 | 简单 | 平均 | 复杂 |
---|---|---|---|
输入 | 3 | 4 | 6 |
输出 | 4 | 5 | 7 |
查询 | 3 | 4 | 6 |
文件 | 7 | 10 | 15 |
接口 | 5 | 7 | 10 |
上表给出了原始功能点。这些功能点根据环境复杂性进行调整。系统使用十四种不同的特征进行描述:
- 数据通信
- 分布式处理
- 性能目标
- 操作配置负载
- 交易率
- 在线数据输入
- 最终用户效率
- 在线更新
- 复杂的处理逻辑
- 可重用性
- 安装简便
- 操作简便
- 多个站点
- 希望促进变革
然后对这些特征因素进行评分,从 0 到 5,如下所示:
- 否影响
- 偶然
- 中等
- 一般
- 重要
- 必不可少
然后将所有评分加起来作为 N。N 的值范围从 0 到 70(14 种特征 x 5 种评分)。它用于计算复杂度调整因子 (CAF),使用以下公式:
CAF = 0.65 + 0.01N
然后,
交付功能点 (FP)= CAF x 原始 FP
然后,此 FP 可用于各种指标,例如:
成本 = $ / FP
质量 = 错误 / FP
生产力 = FP / 人月