上一章软件工程教程请查看:软件界面设计
复杂性这个术语表示事件或事物的状态,它们有多个相互联系的链接和高度复杂的结构。在软件编程中,随着软件设计的实现,元素的数量和它们之间的相互联系逐渐变得庞大,一下子就难以理解。
如果不使用复杂性度量和度量,软件设计复杂性是很难评估的。让我们看看三个重要的软件复杂度度量。
霍氏的复杂度的度量
1977年,Maurice Howard Halstead先生引入了度量标准来度量软件复杂性。Halstead的度量标准依赖于程序的实际实现及其度量,这些度量直接从源代码的操作符和操作数以静态方式计算。它允许评估C/ c++ /Java源代码的测试时间、词汇表、大小、难度、错误和工作量。
根据Halstead的说法,“计算机程序是一种算法的实现,该算法被认为是一组令牌,可以分为操作符或操作数”。Halstead指标认为程序是操作符及其相关操作数的序列。
他定义了各种指标来检查模块的复杂度。
参数 | 解释 |
n1 | 唯一算子数 |
n2 | 唯一操作数的数目 |
N1 | 操作符的总出现次数 |
N2 | 操作数的总出现次数 |
当我们选择源文件在度量查看器中查看它的复杂性细节时,下面的结果可以在度量中看到:
度量 | 解释 | 数学表示 |
n | Vocabulary | n1 + n2 |
N | Size | N1 + N2 |
V | Volume | Length * Log2 Vocabulary |
D | Difficulty | (n1/2) * (N1/n2) |
E | Efforts | Difficulty * Volume |
B | Errors | Volume / 3000 |
T | Testing time |
Time = Efforts / S, where S=18 seconds. |
循环复杂度
每个程序都包含为了执行某些任务而需要执行的语句,以及决定需要执行哪些语句的决策语句。这些决策构造改变了程序的流程。
如果我们比较两个相同大小的程序,决策语句较多的程序会更加复杂,因为程序的控制频繁跳跃。
McCabe在1976年提出了圈复杂度度量来量化给定软件的复杂度。它是一种基于if-else、do-while、repeat-until、switch-case和goto语句等程序决策结构的图驱动模型。
流程控制图制作:
- 在更小的块中中断程序,由决策构造来分隔。
- 创建表示每个节点的节点。
- 连接节点如下:
- 如果控件可以从块i转移到块j
画一个弧
- 从出口节点到入口节点
画一个弧。
为了计算程序模块的圈复杂度,我们使用公式-
V(G) = e – n + 2
其中
e是边的总数
n是节点的总数
上述模块的循环复杂度为:
e = 10
n = 8
循环复杂度 = 10 - 8 + 2
= 4
根据P.
Jorgensen,模块的圈复杂度不应该超过10。
功能点
它被广泛用于测量软件的大小。功能点集中于系统提供的功能。系统的特性和功能用于度量软件的复杂度。
功能点依赖于五个参数,分别是外部输入、外部输出、逻辑内部文件、外部接口文件和外部查询。为了考虑软件的复杂性,将每个参数进一步分为简单、一般或复杂。
让我们看看功能点的参数:
外部输入
从外部输入到系统的每个唯一输入都被视为外部输入。测量输入的唯一性,因为没有两个输入应该具有相同的格式。这些输入可以是数据,也可以是控制参数。
- 简单-如果输入计数低,影响较少的内部文件
- 复杂-如果输入计数高,影响更多的内部文件
- 平均-介于简单和复杂之间。
外部输出
系统提供的所有输出类型都计算在这个类别中。如果输出格式和/或处理是惟一的,则认为输出是惟一的。
- 简单-如果输出计数低
- 复杂-如果输出计数高
- 平均-介于简单和复杂之间。
内部逻辑文件
每个软件系统都维护内部文件,以维护其功能信息和正常工作。这些文件保存着系统的逻辑数据。这个逻辑数据可以包含功能数据和控制数据。
- 简单——如果记录类型的数量很低
- 复杂——如果记录类型的数量很高
- 平均——介于简单和复杂之间。
外部接口文件
软件系统可能需要与某些外部软件共享其文件,或者需要将文件作为参数传递给某些功能。所有这些文件都算作外部接口文件。
- 简单——如果共享文件中的记录类型数量很低
- 复杂——如果共享文件中的记录类型数量很大
- 平均——介于简单和复杂之间。
外部查询
查询是输入和输出的组合,用户将一些数据作为输入发送查询,系统将处理的查询输出响应用户。查询的复杂性不仅仅是外部输入和外部输出。如果查询的输入和输出在格式和数据方面是惟一的,则称查询是惟一的。
- 简单——如果查询需要低处理并产生少量输出数据
- 复杂-如果查询需要高处理,并产生大量的输出数据
- 平均-介于简单和复杂之间。
系统中的每个参数都根据它们的类别和复杂性赋予权重。下表列出了各参数的权重:
参数 | 简单 | 平均 | 复杂 |
输入 | 3 | 4 | 6 |
输出 | 4 | 5 | 7 |
询盘 | 3 | 4 | 6 |
文件 | 7 | 10 | 15 |
接口 | 5 | 7 | 10 |
上表给出了原始的功能点。这些功能点根据环境的复杂性进行调整。系统描述使用14个不同的特点:
- 数据通信
- 分布式处理
- 性能目标
- 操作配置负载
- 事务率
- 在线数据输入,
- 终端用户效率
- 在线更新
- 复杂处理逻辑
- 可重用性
- 安装方便
- 易操作性
- 多个站点
- 促成改变的愿望
这些特征因素的评分为0至5分,如下所示:
- 没有影响
- 偶然的
- 温和的
- 平均
- 重要的
- 至关重要的
所有的评级被总结为N。N的值范围从0到70(14种特征x 5种评级)。使用以下公式计算复杂度调整因子(复杂度调整因子):
CAF = 0.65 + 0.01N
然后,
交付功能点(FP)=
CAF x原始FP
该FP可用于各种指标,如:
- 成本= $ / FP
- 质量=误差/ FP
- 生产率= FP /人月