计算Javascript的圈复杂度

计算Javascript的圈复杂度,javascript,metrics,cyclomatic-complexity,Javascript,Metrics,Cyclomatic Complexity,Javascript中是否有计算圈复杂度的工具 在过去处理服务器端代码时,我发现它是一个非常有用的指标,我希望能够将它用于我编写的客户端Javascript。因为圈复杂度是通过计算关键字的数量来计算的 “如果,开关,同时断开”等。。每一个与C一起工作的工具都会完成这项工作,比如 sourcemonitor: 事实上,在javascript上,你越是试图模块化你的代码,你就越会减慢它的速度,所以要谨慎对待;) 编辑: 我真的不明白这个答案是怎么回事,我得到了另一个反对票,在我的答案中,我告诉了一

Javascript中是否有计算圈复杂度的工具


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

因为圈复杂度是通过计算关键字的数量来计算的 “如果,开关,同时断开”等。。每一个与C一起工作的工具都会完成这项工作,比如 sourcemonitor:

事实上,在javascript上,你越是试图模块化你的代码,你就越会减慢它的速度,所以要谨慎对待;)

编辑: 我真的不明白这个答案是怎么回事,我得到了另一个反对票,在我的答案中,我告诉了一个在javascript中计算圈复杂度的好工具, 这一点尤其有效

对于第二个断言,我的评论来自于经验,我从来没有告诉过你不要模块化你的js代码,我只是告诉你在做的时候要注意,因为经常会有速度的折衷,当我谈到速度时,我的意思是可能会发生两种不同的减速:在下载时和在执行时(对于速度较慢的设备,如pda/智能手机,这一点很重要)

因为像这样的工具通常会促使开发人员编写更多的代码,试图尽可能地追求更小的索引, 但不幸的是,在js中,更多的代码意味着可能会出现减速,并且这些工具的过度使用是不好的。 当然,这些工具可以给你提示代码可以改进的地方,但是你必须掌握如何使用工具,而不是盲目依赖它


因此,如果你再次否决我的投票,请写一条评论,解释你为什么这样做,讨论只能从中受益,谢谢你,抱歉泄气。

你可以使用来自或github repo的ccm工具


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

现在还有一个标准:


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

我帮助编写了一个工具,对Javascript项目执行软件复杂度分析:

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

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

npm i -g complexity-report
最近用于计算代码度量

您可以为以下各项设置最大值:

  • -允许的形式参数数量
  • -嵌套代码块的深度应为多少
  • -每个函数允许的语句数
  • -最大圈复杂度
例子 每个函数允许的最大形式参数数

/*jshint最大参数:3*/
功能登录(请求、成功){
// ...
}
//JSHint:每个函数的参数太多(4)。
功能注销(请求、isManual、wheremi、onSuccess){
// ...
}
每个函数允许的最大嵌套代码块数

/*jshint最大深度:2*/
主要功能(含义){
var day=真;
如果(意思===42){
while(天){
洗牌();
if(疲倦){//JSHint:块嵌套太深(3)。
睡眠();
}
}
}
}
每个函数允许的最大语句数

/*jshint-maxstatements:4*/
函数main(){
var i=0;
var j=0;
//函数声明算作一条语句。它们的主体
//不要考虑外部功能。
函数内部(){
VarI2=1;
var j2=1;
返回i2+j2;
}
j=i+j;
return j;//JSHint:每个函数的语句太多。(5)
}

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

以下各项的报告样本:


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

新版本已经推出,并且有一个非常好的圈复杂度计算器

模块化您的代码,降低速度?这有什么意义?实际上它有意义,因为在javascript中,编写更多的代码意味着更多的下载时间(这是一个大家都知道的权衡),我编写的javascript代码运行速度非常慢,因此,对我来说,这是一个重要因素。我没有说“不要模块化”,我只是说“注意”我没有否决你的意见,但模块化降低了javascript代码的速度似乎不足以证明以过程式编写代码是合理的。但我想这是一个个案基础。你还应该设置“Expires”您的javascript的标题将在未来很长一段时间内出现,以便客户端浏览器将其缓存。这减少了经常访问您的站点的访问者必须处理的问题。这是一个很棒的工具。如果可以将其用作grunt任务,它将更加有用。然后,我们可以在每次生成时看到此报告!刚刚找到此工具的grunt任务:JSComplexity.org:此域名已被删除Expired@P5ycH0这个领域在2014年1月3日回归。截至2017,这个解决方案不再被维护。我刚刚在旧金山的FLASH 2014的J.JSOWSON的演示中得到了很好的印象。