计算Javascript的Cyclomatic复杂度

时间:2008-09-19 09:08:01

标签: javascript metrics cyclomatic-complexity

Javascript中是否有可用于计算Cyclomatic Complexity的工具?

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

7 个答案:

答案 0 :(得分:19)

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

complexity-report

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

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

npm i -g complexity-report

答案 1 :(得分:11)

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

示例报告:

它使用phil的复杂性报告(如上所述),并聚合来自jshint(最终,其他)的数据。

答案 2 :(得分:9)

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

实际上,在javascript上你尝试模块化代码的次数越多,你就越会减慢它的速度,所以要花一点时间来处理它;)

编辑: 我真的无法理解这个答案会发生什么,我得到了另一个downvote,在我的回答中,我告诉了一个很好的工具来计算javascript中的圈复杂度, 这尤其有效。

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

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

所以,如果你再次投票给我,请写一个评论,你可以在其中解释你为什么这样做,讨论只能从中受益,谢谢你,对不起发泄。

答案 3 :(得分:7)

JSHint最近added support用于计算代码指标。您可以为the number of formal parameters allowed maxparams ),how deeply nested code blocks should be maxdepth ),the number of statements allowed per function设置最大值( maxstatements ),以及the maximum cyclomatic complexity maxcomplexity )。

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

/*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)
}

答案 4 :(得分:4)

http://jshint.com的新版本已经发布,并且具有非常好的圈复杂度计算器

答案 5 :(得分:2)

您可以使用http://www.blunck.info/ccm.html中的ccm工具。

它有java-script,c / c ++和c#。它是免费的,可以在Windows上运行(也可以在Linux和Mac OS X上运行 - 使用单声道框架)。

答案 6 :(得分:2)

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

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