根据圈复杂度的基本规则,以下代码的复杂度应为 2(只有一个分支点 - for 循环)。
function SumArray(array_to_sum) {
var sum = 0;
for (var i = 0; i < array_to_sum.length; i++) {
sum += array_to_sum[i];
}
return sum;
}
很多现代框架等都提供了数据映射功能,比如或者框架jQuery.each()
中的大部分方法。Underscore.js
考虑以下代码:
function SumArray(array_to_sum) {
var sum = 0;
jQuery.each(array_to_sum, function(index, value) {
sum += value;
});
return sum;
}
按照圈复杂度的典型规则,第二个例子的CC度量为1。工作完全相同,函数的人为复杂度根本没有改变。我所做的只是将一种循环数据的方式换成另一种循环数据的方式。
同样考虑这个人为的例子,我们将原始函数的内部包装在一个自调用闭包中,为外部方法生成 1 的圈复杂度,而实际上并未改变方法的工作方式:
function SumArray(array_to_sum) {
return (function() {
var sum = 0;
for (var i = 0; i < array_to_sum.length; i++) {
sum += array_to_sum[i];
}
return sum;
})();
}
圈复杂度的真正度量是否应该包括对数据映射/减少方法的考虑,例如jQuery.each()
特别是在使用匿名局部闭包时?
也许闭包应该将其复杂性导出到关闭的父级。另外,也许一般的方法应该能够定义一个导出复杂度,该复杂度被添加到调用它的任何函数的复杂度中——例如jQuery.each()
,导出复杂度可能应该为 1,以便使用它代替正常循环计数复杂度相同.