为Javascript计算圈复杂度

56

有没有可用于计算JavaScript中圈复杂度的工具?

在处理服务器端代码时,我发现这是一个非常有用的指标,并希望能够将其应用于编写的客户端JavaScript。

7个回答

27

我参与了编写一款用于对JavaScript项目进行软件复杂度分析的工具:

complexity-report

它会报告一堆不同的复杂度指标:代码行数、参数数量、圈复杂度、圈复杂度密度、Halstead复杂度量、可维护性指数、一阶密度、变更成本和核心大小。

它以MIT许可证发布,使用Node.js和Esprima JavaScript解析器构建。可以通过npm安装,方法如下:

npm i -g complexity-report

这是一个很棒的工具。如果它可以用作Grunt任务,那将会更加有用。这样我们就可以在每次构建时查看报告! - Shital Shah
刚刚发现了这个工具的Grunt任务:https://npmjs.org/package/grunt-complexity - Shital Shah
16
截至2017年,这个解决方案不再得到维护。 - Cookie

14

为了全面回答这个问题,我曾经搜索过同样的工具,但没有找到一个能够很好地进行可视化的工具,所以我写了 plato

以下是示例报告:

它使用了Phil's complexity-report(上面提到过),并从jshint(和其他工具)中聚合数据。


11

JSHint 最近 增加了对代码度量计算的支持

你可以设置以下最大值:

示例

每个函数允许的最大形式参数个数

/*jshint maxparams:3 */

function login(request, onSuccess) {
  // ...
}

// JSHint: Too many parameters per function (4).
function logout(request, isManual, whereAmI, onSuccess) {
  // ...
}

每个函数允许的嵌套代码块数量最大为:
/*jshint maxdepth:2 */

function main(meaning) {
  var day = true;

  if (meaning === 42) {
    while (day) {
      shuffle();

      if (tired) { // JSHint: Blocks are nested too deeply (3).
          sleep();
      }
    }
  }
}

每个函数允许的最大语句数

/*jshint maxstatements:4 */

function main() {
  var i = 0;
  var j = 0;

  // Function declarations count as one statement. Their bodies
  // don't get taken into account for the outer function.
  function inner() {
    var i2 = 1;
    var j2 = 1;

    return i2 + j2;
  }

  j = i + j;
  return j; // JSHint: Too many statements per function. (5)
}

9
由于圈复杂度是通过计算关键字“if、switch、while、for、break”等的数量来评估的,因此处理C语言的所有工具都可以完成这项工作,例如sourcemonitor:http://www.campwoodsw.com/sourcemonitor.html
实际上,在JavaScript中,您越试图将代码模块化,它就会变得越慢,所以要谨慎对待;)
编辑:我真的不明白这个答案发生了什么,我又被踩了,当我在我的答案中告诉一个用于计算JavaScript圈复杂度的好工具时,特别是这个工具非常有效时。
对于第二个断言,我的评论来自经验,我从未说过“不要将js代码模块化”,我只是告诉你“注意做到这一点”,因为通常需要在速度和性能之间进行权衡(在像PDA /智能手机这样的缓慢设备上尤其重要)。
由于这种工具经常驱使开发人员编写更多的代码,试图追求可能的最小指数,但在js中,更多的代码不幸意味着可能会出现减速,而这些工具的过度使用是不好的。当然,这些工具可以为您提供有关如何改进代码的提示,但您必须掌握如何使用该工具,而不是盲目依赖它。
因此,如果您再次将我踩下去,请在评论中解释为什么这样做,讨论只会从中受益,谢谢并对发泄感到抱歉。

将代码模块化会使其变慢?这有什么道理吗? - MDCore
2
实际上这是有道理的,因为在JavaScript中编写更多的代码意味着更长的下载时间(这是所有人都知道的权衡),我编写了在非常慢的架构中运行的JavaScript代码,所以对我来说,这是一个重要因素。我并没有说“不要模块化”,我只是说“要小心”。 - kentaromiura
1
我没有给你点踩,但是仅仅因为在JavaScript中使用模块化并不会减慢你的代码速度,这并不足以证明你应该用过程式编写你的代码。但我猜这要看具体情况。 - Mark Rogers
1
你还应该为你的JavaScript设置“Expires”头,以便客户端浏览器可以缓存它。这样可以减少重复访问者在访问您的网站时所需处理的负担。 - Zee Spencer

6
新版本的 http://jshint.com 已经发布了,其中包含一个非常好的圈复杂度计算器。

3
您可以使用来自blunck.info的存档jonasblunck / ccm的GitHub存储库中的ccm工具。它支持JavaScript,C/C++和C#。它是免费的,在Windows上运行(也可以在Linux和Mac OS X上运行 - 使用Mono框架)。

3
现在还有一个工具叫Yardstick:https://github.com/calmh/yardstick,它试图计算符合惯用法的Javascript的圈复杂度,处理的情况比如jscheckstyle更多。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接