软件设计复杂性

复杂性一词代表事件或事物的状态,具有多个相互关联的环节和高度复杂的结构。在软件编程中,随着软件设计的实现,元素及其互连的数量逐渐变得庞大,这变得难以一下子理解。

如果不使用复杂性指标和措施,软件设计复杂性很难评估。让我们看看三个重要的软件复杂性措施。

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 / 人月