51

是否有任何工具可用于计算 Javascript 中的圈复杂度?

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

4

7 回答 7

26

我帮助编写了一个工具来对 JavaScript 项目执行软件复杂性分析:

复杂性报告

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

它是在 MIT 许可下发布的,并使用 Node.js 和Esprima JavaScript 解析器构建。它可以通过 npm 安装,如下所示:

npm i -g complexity-report
于 2012-11-19T12:06:02.897 回答
14

为了答案的完整性,我前段时间一直在寻找相同的工具,但没有找到任何适合可视化的工具,所以我写了plato

示例报告:

它使用 phil 的复杂性报告(上面提到过)并且还从 jshint (最终,其他)聚合数据。

于 2013-04-08T06:58:24.737 回答
9

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)
}
于 2013-04-04T15:38:41.887 回答
9

由于计算圈复杂度计算关键字“if,switch,while for break”等的数量。每个与C一起使用的工具都可以完成这项工作,比如sourcemonitor: http: //www.campwoodsw.com/sourcemonitor.html

实际上,在 javascript 上,您尝试修改代码的次数越多,速度就越慢,因此请谨慎对待;)

编辑:我真的不明白这个答案发生了什么,我得到了另一个反对意见,当我的回答中我告诉了一个在 javascript 中计算圈复杂度的好工具时,这特别有效。

对于第二个断言,我的评论来自经验,我从来没有告诉过不要修改你的 js 代码,我只是告诉你在做的时候要注意,因为通常需要权衡速度,当我谈到速度时我的意思是可能会发生 2 种不同的减速:在下载时执行时(在像 pda/智能手机这样的慢速设备中,这很重要)。

由于像这样的工具经常驱使开发人员编写更多代码来尽可能地追逐更小的索引,但不幸的是,在 js 中,更多的代码意味着可能会发生减速,并且过度使用这些工具是不好的。当然,这些工具可以为您提供可以改进代码的提示但您必须掌握如何使用该工具,而不是盲目地依赖它。

因此,如果您再次对我投反对票,请在评论中解释您这样做的原因,讨论只能从中受益,谢谢您,对发泄感到抱歉。

于 2008-10-13T16:28:08.160 回答
5

新版http://jshint.com出来了,有一个很好的圈复杂度计算器

于 2013-10-07T08:01:09.400 回答
3

您可以使用来自blunck.info 的 ARCHIVE或 github repo jonasblunck/ccm的 ccm 工具

它支持 JavaScript、C/C++ 和 C#。它是免费的,在 Windows 上运行(也可以在 Linux 和 Mac OS X 上运行 - 使用 Mono 框架)。

于 2011-08-06T18:12:24.073 回答
2

现在还有 Yardstick:https ://github.com/calmh/yardstick

它尝试计算惯用 Javascript 的圈复杂度,处理比 jscheckstyle 更多的案例。

于 2012-06-28T08:20:10.003 回答