2010-09-02 41 views
2

我需要一個非常特定的VB(或多語言)工具。在我開始製作一個之前,我想我會問是否已經存在(可能是在Python中)。用於VB的代碼複製重構工具

我需要什麼:

  • 工具必須爬行,recursivelly與否,路徑,尋找擴展的列表,如.BAS,.FRM,.XXX
  • 以後,它解析該文件,搜索功能,例程等。
  • 最後,它必須輸出它找到的內容。

我基於這個想法,「減少代碼冗餘」,在這種情況下,糟糕的程序員做了很多功能,做同樣的事情,有時會用相同的名字,有時候不會。有4種情況:

  • 情況1:同名,相同內容。
  • 案例2:同名,差異內容。
  • 案例3:差異名稱,相同內容。
  • 案例4:差異名稱,差異內容。

所以,輸出,應該是這樣的

=========================================================================== 
RESULT 
=========================================================================== 
Errors: 
--------------------------------------------------------------------------- 
==Name, ==Content --> 3: (Func(), Foo(), Bar()) In files (f,f2,f3) 
!=Name, ==Content --> 2: (Func() + Func1(), Bar() + Bar1()) In Files (f4) 

--------------------------------------------------------------------------- 
Warnings: 
==Name, !=Content --> 1 (Foobar()) In Files (f19) 

--------------------------------------------------------------------------- 

這是給你的我需要什麼的想法。

所以,問題是:有沒有什麼工具可以實現類似於這個的東西?

P.S:是的,我們應該首先編寫好的代碼,但是,你知道,事情發生了。

回答

3

你想要的是一個「克隆檢測器」。這些工具可以在大量指定文件中找到複製粘貼的代碼。克隆不僅僅是功能;他們可以是代碼塊,數據聲明等。

有各種各樣的探測器,你應該知道它們是如何工作的,然後再嘗試構建自己的探測器。

一些簡單地匹配線條以確切等價。雖然這些說明了基本思想,但它們的檢測並不好,因爲它們沒有考慮到克隆代碼經常有變化的事實;在製作副本時人們真正做的是克隆和編輯。

一些符合語言標記的序列,例如標識符,關鍵字,文字,標點符號。這些至少相對容忍空白變化。他們可以找到單個令牌替代單個令牌的克隆。然而,由於它們不懂語言結構(塊,語句,函數體),它們通常會匹配跨越此類結構邊界的序列(例如,「} {」通常被這些工具視爲克隆),所以它們產生的相當高(非)克隆的假陽性指示。其中一些嘗試將匹配限制爲關鍵程序結構,例如完整功能,正如您所建議的那樣。

更復雜的探測器匹配程序結構。 我們的CloneDR(我是原作者)是 使用編譯器質量解析來抽象語法樹的檢測器,它提取代碼的精確結構。它爲許多語言(包括VB6和VBScript)執行此操作,將克隆定位爲任意函數,塊,語句或聲明,參數顯示克隆如何變化。儘管格式更改,註釋位置或內容的更改,甚至是複雜構造(多個語句或表達式)被用作簡單構造(例如單個語句或文字)的替代形式,CloneDR仍可以找到克隆。雖然它具有較高的檢測率(通常會發現10-20%的可移動冗餘!),但它的假陽性率往往遠低於基於令牌的檢測器。您可以在上面的鏈接中看到 各種不同語言的樣本報告。

參見Comparison and Evaluation of Code Clone Detection Techniques and Tools: A Qualitative Approach其中明確討論不同的方法和好處,並比較了大量的探測器,包括CloneDR的。

編輯2010年10月:......當我第一次寫這種反應,我以爲OP感興趣的是VB.net,其中CloneDR沒有做。此後,我們向CloneDR添加了VB.net,VB6和VBScript功能。 (以現代形式解析VB.net比人們可能想象的像Visual Basic這樣的「簡單」(!)語言更加混亂)。