2010-02-28 190 views
3

我正在尋找一些代碼行長度指標以外的代碼行。源監視器報告的內容是語句。這似乎是一件值得了解的事情,但Source Monitor計算某些事情的方式看起來並不直觀。例如,for語句是一個語句,即使它包含一個變量定義,一個條件和一個增量語句。如果一個方法調用嵌套在另一個方法的參數列表中,則整個事件被視爲一個語句。有沒有一種標準的方法來計算在C#語句#

是否有一個標準的方式來陳述陳述,並且是他們的規則來管理這樣的事情?

回答

5

最接近「正式聲明」的正式定義是C# specification本身。祝你好運,看看特定工具的測量結果是否與你對規範的閱讀一致。

鑑於指標最好用作指南以更好/更差的代碼,而不是嚴格的公式,該工具使用的確切定義有多大的區別?

如果我有三種方法,在「語句長度」爲2500,1500和150時,我知道首先要檢查哪種方法;另一個工具可能會報告2480,1620和174並不太重要。

我在量度指標方面看到的最好工具之一是NDepend,雖然我不是100%確定它使用的是什麼定義。根據網站,NDepend has 82 separate metrics,包括Number of instructionsCyclomatic Complexity

7

指標的第一條規則是「要小心你測量的」。你要求一些陳述,這就是你將要得到的。正如你注意到的那樣,這個數字可能實際上並不相關。

如果您對其他測量方法感興趣,比如「複雜」代碼是多少,請考慮查看其他代碼度量標準,如循環複雜度。

http://en.wikipedia.org/wiki/Cyclomatic_complexity

UPDATE:回覆:您的評論

我同意 「做太多」 是一個有趣的度量。我的經驗法則是,一條語句應該有一個副作用(通常是「局部」副作用,如變異局部變量,但有時會出現可見副作用,如寫入文件),因此「語句數」應該大致爲與該方法在其副作用數量方面「做」的程度相關。

實際上,當然沒有人的代碼,我自己的代碼,實際上始終符合這個標準。你可能會考慮一個度量「這個方法做多少」來計算不僅僅是語句而且也就是說方法調用。

要真正回答您的問題:我不知道任何行業標準規定什麼「數量的聲明」。 C#規範當然定義了「語句」是詞法的,但當然你必須做一些解釋來做一個計數。例如:

void M() 
    { 
    try 
    { 
     if (blah) 
     { 
     Frob(); 
     Blob(); 
     } 
    } 
    catch(Exception ex) 
    { /* eat it */ } 
    finally 
    { 
     Grob(); 
    } 
    } 

M中有多少個語句?那麼,M的主體就是一個聲明,一個try-catch-finally。答案是什麼?嘗試的主體包含一個陳述,即「if」陳述。 「if」的結果包含一個陳述 - 記住,一個block是一個陳述。該塊包含兩個語句。終於包含一個聲明。 catch塊不包含語句 - 一個捕獲不是語句,在詞彙上 - 但它肯定與該方法的操作高度相關!

那麼這個共有多少條語句呢?根據你是否將區塊計爲「真實」的陳述,是否將子陳述考慮爲除了他們的父母陳述之外,等等,可以爲1到6之間的任何數字作出合理的理由。沒有標準的機構來規範我所知道的這個問題的答案。

+0

我確實使用圓環複雜性。我在尋找一個代碼長度計數器的原因是複雜性計數不會識別太多的方法,但只有2或3個路徑。 – epotter 2010-02-28 04:03:43

1

一個簡單的指標就是計算標記之間的標點符號(;,,,.)(以避免字符串,註釋或數字中的標點符號)。因此,for (x = 0, y = 1; x < foo.Count; x++, y++) bar[y] = foo[x];算作6.

3

C# Metrics Tool通過使用精確的C#語言的BNF定義定義被計數的事情(「語句」,「操作數」)等。 (實際上,它精確地根據完整的C#語法解析代碼,然後通過遍歷解析樹來計算結構度量值; SLOC通過計數線獲得,就像您期望的那樣)。

你可能仍然認爲這樣的定義不直觀(語法很少),但它們是精確的。然而,我同意這裏的其他海報,確切的衡量標準不像一個代碼塊相對於另一個代碼塊的相對價值那麼重要。值「173.92」的複雜性本身並不是很有用;對於另一個複雜度值「81.02」,我們可以說有一個很好的跡象表明,第一個比第二個更復雜,這足以提供關注的焦點。

我認爲這些指標在趨勢分析中也很有用;如果上週這個代碼是「81.02」複雜的,本週的廣告是「173.92」,我應該想知道爲什麼在這部分代碼中發生了這一切?

您也可以考慮結構性指標來SLOC的比例(例如,圈)作爲「做得太多」的指示,或至少編寫代碼的指示是太密集了解

相關問題