【问题标题】:Calculate Average Lines of Code per Method for Javascript计算 Javascript 每种方法的平均代码行数
【发布时间】:2008-09-19 09:12:34
【问题描述】:

是否有任何工具可用于计算每个方法的平均代码行数

我想知道每个方法的平均大小,而不仅仅是项目中的总行数。每个方法的计数可以让我衡量每种方法的简单程度。

这将作为构建过程的一部分进行计算,并显示在仪表板上。这个想法是我们可以看到每种方法的平均大小是否在增加。这将表明代码复杂性正在增加的可能性,我们可能需要考虑重构。

【问题讨论】:

  • “代码行数”什么时候成为代码质量的衡量标准了?
  • 我已经更新了这个问题,以更清楚地说明我说的是每个方法的平均代码行数,而不是总行数。跨度>
  • 方法中的行数不是计算复杂度或代码质量的指标。相反,相同的代码,每个方法使用更少的代码行,理解和遵循可能要复杂十倍。每种方法中的行数由功能要求决定。仅当您想要共享/重用代码时才需要拆分成更小的方法。很少,如果有的话,它有助于表达代码在做什么。我更喜欢使用 cmets 而不是拆分没有真正意义的东西。

标签: javascript metrics


【解决方案1】:

short fast and dirty : grep for ";",计算行数,这会给你一个语句的估计数。

【讨论】:

  • 这太脏了,我在 JS 中根本不使用分号(好吧,除了 for() 循环:))
  • 是的。这取决于你的风格。或者,您可以搜索“\n”。但是,同样,这很容易出错。
【解决方案2】:

在您的项目中执行递归“for(i in this)”搜索,如果对象 (i) 是函数,则调用“test.toString().split("\n").length”。这会计算函数中换行符的数量。如果它不是函数,而是对象,则在该对象中调用此函数。还要数一下你找到的函数个数,然后用换行符的总数除以函数的总数,就得到了平均值。

编辑

function calculateMethodSize(obj){
  var fcount = 0;
  var fsize = 0;
  for(i in obj){
    if(obj[i] instanceof Function){
      fcount++;
      fsize += obj[i].toString().split(";\n").length;
    }else if(obj[i] instanceof Object){
      var ret = calculateMethodSize(obj[i]);
      fcount += ret.fcount;
      fsize += ret.fsize;
    }
  }
  return {fsize:fsize, fcount:fcount};
}
var data = calculateMethodSize(this);
var average = data.fsize / data.fcount;

请小心运行此代码。如果你像我一样运行它,那么你可能会遇到堆栈溢出(我做过)。

【讨论】:

  • 听起来是个有趣的方法。你能弄清楚“for(i in this)”搜索是如何工作的吗?
  • 我喜欢这种方法的想法,因为我不必自己解析代码。不幸的是,它不适用于我声明对象的方式: var obj = function() { this.method = function(a) { return a + 1; } }
【解决方案3】:

我不确定它是否这样做,但是在您之前的帖子之后搜索什么是圈复杂度,我转到了指向 Code Analyzer 的相关维基百科页面。 他们在那里说:

当计算 HTML 或 JSP 文件时,它将正确计算 LoC

我不知道这个计数是否按方法分派,但可能值得一看(它是一个免费工具)。

【讨论】:

    【解决方案4】:

    将行定义为“\n”或“;”,

    您可以尝试如下的简单算法:

    FOR each line in a javascript file (or chunk of text)
        IF the line starts with "function " THEN
            PUSH the first left-curly brace you find onto a stack
            WHILE the stack is non-empty
                PUSH any left-curly braces in the current line
                POP any left-curly braces when you encounter a right-curly brace
                Increment your line-count by 1
                Increment your line counter (as mentioned in the FOR loop above)
            END WHILE
            Store your total lines for this function            
         ELSE
             //ignore the line because it's probably a global var or blank
         END IF
    END FOR
    

    我不知道有什么工具可以自动执行此操作。但是,尝试自己制作一个会很有趣。

    【讨论】:

      【解决方案5】:

      您可能还想了解其他指标。任何你数线的方式, 只要确保它不会在没有“function”关键字或花括号的情况下定义函数。现实世界的例子:

      var negate = bind1st(compose, not);
      

      (这里的 negate 是由函数 bind1st、compose 和 not 构建的函数)

      【讨论】:

        猜你喜欢
        • 2022-12-07
        • 1970-01-01
        • 1970-01-01
        • 2021-07-17
        • 2019-04-03
        • 2014-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多