2008-09-19 75 views
2

是否有任何工具可用於計算每種方法的平均代碼行數計算每種方法的平均代碼行數

我想知道每種方法的平均大小,而不僅僅是項目中的總行數。每種方法的數量可以讓我衡量每種方法的簡單程度。

這將作爲構建過程的一部分進行計算,並顯示在儀表板上。這個想法是我們可以看到每種方法的平均大小是否在增加。這將標誌着代碼複雜性增加的可能性,我們可能需要考慮重構。

+0

既然在代碼質量的度量「代碼行」? – Ant 2008-09-19 09:36:58

+0

我已經更新了這個問題,以使它更清晰,我正在討論**每個方法**的平均行數而不是總行數。 – Karl 2008-09-19 09:46:32

回答

0

我不確定它是否確實如此,但是在上一篇文章之後搜索什麼是圈複雜度,我去了指向Code Analyzer的相關維基百科頁面。 在那裏,他們說:

當HTML或JSP文件算起,它會計算正確控制線爲 JavaScript和VBScript代碼嵌入< script>標記中。

我不知道這個計數是否按每個方法調度,但可能值得一看(這是一個免費工具)。

0

short fast and dirty:grep for「;」,計算行數,這會給你估計的語句數量。

+0

這很骯髒,我不在JS中使用分號(當然,除了()循環:)) – Dan 2008-09-19 09:42:51

1

做一個遞歸的「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; 

不過要小心運行此代碼。如果你像這樣運行它,那麼你可能會遇到堆棧溢出(我做過)。

0

定義行作爲不是「\ 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 

我不知道一個工具,可以做到這一點的自動。但是,嘗試自己創造一個會很有趣。

0

您可能還想了解其他指標。你可以用任何方法來計算線, 只是確保它不會在沒有「函數」關鍵字或花括號的情況下定義的函數面前發聲。真實世界的例子:

var negate = bind1st(compose, not); 

(這裏是否定的功能,從功能bind1st建造,撰寫和不)