计算 Javascript 的圈复杂度 [关闭]

Posted

技术标签:

【中文标题】计算 Javascript 的圈复杂度 [关闭]【英文标题】:Calculate Cyclomatic Complexity for Javascript [closed] 【发布时间】:2010-09-11 04:01:37 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

JSHint 最近added support 用于计算代码指标。

您可以设置最大值:

maxparams - 允许的形参数量 maxdepth - 代码块的嵌套深度应该是多少 maxstatements - 每个函数允许的语句数 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)

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

complexity-report

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

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

npm i -g complexity-report

【讨论】:

这是一个很棒的工具。如果它可以用作 grunt 任务,它将更加有用。然后我们可以在每次构建时看到这个报告! 刚找到这个工具的繁重任务:npmjs.org/package/grunt-complexity JSComplexity.org : 此域名已过期 @P5ycH0,该域已于 2014 年 1 月 3 日恢复。 自 2017 年起不再维护此解决方案。【参考方案4】:

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

【讨论】:

【参考方案5】:

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

以下示例报告:

jquery grunt marionettejs

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

【讨论】:

我刚刚参加了@jsoverson 在旧金山举行的 Fluent 2014 的演讲,印象非常深刻!【参考方案6】:

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

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

【讨论】:

【参考方案7】:

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

实际上,在 javascript 上,您尝试对代码进行模块化的次数越多,运行速度就越慢,因此请谨慎对待;)

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

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

由于此类工具通常会促使开发人员编写更多代码以尽可能追求更小的索引, 但不幸的是,在 js 中,更多的代码意味着速度可能会变慢,并且这些工具的过度使用是不好的。 当然,这些工具可以提示您在哪里您的代码可以改进,但您必须掌握如何使用该工具,而不是盲目地依赖它。

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

【讨论】:

模块化代码会减慢速度吗?这有什么意义? 实际上它是有道理的,因为在 javascript 中编写更多的代码意味着更多的下载时间(这是众所周知的权衡),我编写了运行在非常慢的架构中的 javascript 代码,所以对我来说,这是一个重要因素。我没有说“不要模块化”,我只是说“被警告” 我没有对你投反对票,但模块化似乎并没有减慢你在 javascript 中的代码速度,这足以证明你以程序风格编写代码是合理的。但我想这是一个个案。 您还应该为您的 javascript 设置“过期”标头,以便客户端浏览器缓存它。这样可以减少重复访问者在访问您的网站时必须处理的点击量。

以上是关于计算 Javascript 的圈复杂度 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

降低选择中的圈复杂度

软件测试圈复杂度

寻求有关结构化代码以降低圈复杂度的说明

latex 中的圈中加序号 怎么弄

dotnet 代码优化 聊聊逻辑圈复杂度

.NET 代码优化 聊聊逻辑圈复杂度