实施 Halstead 复杂性指标的问题
Issues Implementing Halstead's Complexity Metrics
我目前正在用一个简单的程序练习,以理解从Halstead的软件科学中推导各种指标所涉及的方程式。我相信我做的是正确的,但我觉得我还没有注册所有的操作数和运算符,所以我可以从数学开始。
我正在使用的程序是:
/*01*/ // counts how many items in sArray[] are also in tArray[]
/*02*/ int matched(int sArray[], int tArray[], int sMax, int tMax)
/*03*/ {
/*04*/ int count, i, first, middle, last;
/*05*/
/*06*/ for (i = 0; i < sMax; ++i)
/*07*/ {
/*08*/ last = tMax - 1;
/*09*/ for (int first = 0; first <= last;)
/*10*/ {
/*11*/ middle = (first + last) / 2;
/*12*/ if (tArray[middle] == sArray[i])
/*13*/ {
/*14*/ count++;
/*15*/ break;
/*16*/ }
/*17*/ if (tArray[middle] < sArray[i])
/*18*/ {
/*19*/ first = middle + 1;
/*20*/ }
/*21*/ else
/*22*/ {
/*23*/ last = middle - 1;
/*24*/ }
/*25*/ }
/*26*/ }
/*27*/ return count;
/*28*/ }
和我已经出来了
- n1 =不同操作符的个数= 10
- n2 =不同操作数的个数= 9
- N1 =操作人员总数= 24
- N2 =操作数总数= 34
这些注释显示了找到的不同操作符和操作数:
操作符
=赋值(第6,8,9,11,19,23行)= 6
<<br> ++增量(第6行,第14行)= 2
-减去(第8,23行)= 2
<=小于或等于(第9行)= 1
+加法(第11行,第19行)= 2
/除法(第11行)= 1
== = Equal (line 12) = 1
[] index (line 2* 2,12 * 2,17 *2 = 6
break (line 15) = 1操作数
count(第4,14行)= 2
i(第4,6 * 3,12,17行)= 6
first(第4,9 * 2,11,19行)= 5
middle(第4,11,12,17,19,23行)= 6
last(第4,8,9,11,23行)= 5
sArray(第4,8,9,11,23行)= 5 <br2,>
Halstead指标的意义在于回答许多问题,如"代码阅读有多困难"、"编写代码投入了多少精力"等。Halstead难度指标的公式应该提供关于第一个问题如何回答的提示:
Difficulty = (Unique Operators / 2) * (Operands / Unique Operands);
你可以看到,有更多的唯一操作符,显然,使代码更难读。
关于大括号:关于这个主题的很多资料认为
{}
是运算符,我不明白这一点。花括号作为结构(标点符号)元素,在很多方面使代码更容易理解,而不是更难。(例如,带和不带大括号的条件块)计算函数名
matched
仅在更一般的上下文中相关,但在度量函数实现的度量(假设没有递归)时不相关。关于操作符:计数操作符可能很棘手。例如,
[]
出现在函数声明中,[]
出现在第12行和第17行,实际上是不同的东西。第一个是数组声明,第二个是operator[]
-通过索引访问元素。后缀和前缀++
也一样,在程序中同时使用它们会使其更难阅读。同样的逻辑也适用于语言关键字:
变量声明中的types:类型名也很棘手。有些将它们归为操作符,有些归为操作数。但是,如果我们再看一下难度公式,就会发现类型名最好归为操作符,因为在代码中有更多不同的类型会使代码更难读,而不是更容易读。for
,if
,else
,break
,return
。代码中它们越多,就越难阅读。你的操作数计数似乎没有问题。
Operators = Assignment (line 6, 8, 9, 11, 19, 23) = 6 < Less Than (line 6, 17) = 2 ++ Prefix Increment (line 6) = 1 ++ Postfix Increment (line 14) = 1 - Subtract (line 8, 23) = 2 <= Less Than or Equal to (line 9) = 1 + Addition (line 11, 19) = 2 / Division (line 11) = 1 == Equal to (line 12) = 1 [] declaration (line 2) = 2 [] index (line 12, 17) = 4 for (line 6, 9) = 2 if (line 12, 17) = 2 else (line 21) = 1 break (line 15) = 1 return (line 27) = 1 int declaration = 7 Operands count (line 4, 14) = 2 i (line 4, 6*3, 12, 17) = 6 first (line 4, 9*2, 11, 19) = 5 middle (line 4, 11, 12, 17, 19, 23) = 6 last (line 4, 8, 9, 11, 23) = 5 sArray (line 2, 12, 17) = 3 tArray (line 2, 12, 17) = 3 sMax (line 2, 6) = 2 tMax (line 2, 8) = 2 Metrics n1 = 17 n2 = 9 N1 = 37 N2 = 34 Difficulty = (n1 * N2) / (2 * n2) = 32.1
我指的是Wiki和虚拟机的这个页面。
顺便说一下,以上所说的大部分都是我的观点,可能与更多的官方来源不一致。
顺便说一下:2,这里有一个关于c++代码中哪些应该算作操作符和操作数的精确而严格的定义:http://www.verifysoft.com/en_halstead_metrics.html.
首先,将count初始化为0,next操作符不是值,而是变量。
operators
matched -1
() -6
[] -6
{} -6
int -7
for -2
if -2
else -1
return -1
= -6
< -2
<= -1
++ -2
- -2
+ -2
/ -1
== -1
break -1
operands
2 -line no. 11 -1
1 (8,19,23) -3
0 -1
count -3
i -6
first -5
middle -6
last -5
sArray -3
tArray -3
sMax -2
tMax -2
N1=50
N2=40
n1=18
n2=12
我所指的书是Alain Abran的Software Metrics and Software Metrology。你可以从这里下载-> http://profs.etsmtl.ca/aabran/English/Accueil/ChapersBook/Abran%20-%20Chapter%20005.pdf
我希望它能解决你所有的疑问。
函数名,大括号,类型名,所有其他关键字和所有其他已知的操作符都在
操作符部分输入任何函数或操作符的变量和常数值都是操作数。
因此,我想出了这个答案。
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 基于boost的程序的静态链接——zlib问题
- C++格式化输出问题
- 实施 Halstead 复杂性指标的问题