2015-11-08 56 views
0

如果解決方案由框架,工具或其他任何東西代表,則無關緊要。這個問題很難解決,因爲多年以來我一直在反對它。檢測文件之間的代碼重複並進行半自動重構

我會舉一個例子來更好地闡明我在說什麼。

File1中

<head> 
<title>Fotografia Elenco Completo Filtri Professionali</title> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 
<META name="Language" content="it"> 
<META http-equiv="Revisit-After" content="2 days"> 
<style> 
<!-- 
table.MsoNormalTable 
    {mso-style-parent:""; 
    font-size:10.0pt; 
    font-family:"Times New Roman"} 
--> 
</style> 
</head> 

文件2

<head> 
<title>Militari</title> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 
<meta name="keywords" content="militari, ...."> 
<meta name="robots" content="INDEX, FOLLOW"> 
<meta name="Language" content="it"> 
<meta http-equiv="Revisit-After" content="2 days"> 
<meta name="Rating" content="General"> 
<link rel="stylesheet" type="text/css" href="./file/stile.css"> 
<script language="JavaScript"> 

文件3

<head> 
<title>Cinema - Recensioni e Trame di Film</title> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<meta name="keywords" content="recensioni film"> 
<meta name="description" content="Ottimo sito di recensioni di film, trame di film cinematografice, di Videogame e Romanzi. "> 
<meta name="robots" content="INDEX, FOLLOW"> 
<meta name="Language" content="it"> 
<meta http-equiv="Revisit-After" content="2 days"> 
<meta name="Rating" content="General"> 
<link rel="stylesheet" type="text/css" href="file/stile.css"> 
<style type="text/css"> 
body { 
    background-color:#F0F0F0; 
    text-align: center; 
} 
</style> 

對於一個人來說,避免這種代碼重複的任務是顯而易見的。他可以認識到「」,「」是分隔符。行的順序無關緊要,哪些部分可以放入變量(或作爲數據庫中的值存儲)以及哪些文件足夠相似以便重構。

整個過程似乎不會很難自動化。但..直到現在我找不到任何解決方案。定界符甚至automatizing的認識是很難..

我發現最好的辦法是用正則表達式工具發揮,成爲瘋狂:d


重構

文件1

header -> PrintHeader(); 

file2

header -> PrintHeader(); 

文件3

header -> PrintHeader(); 

GlobalFile

class header 
{ 
function PrintHeader 
{ 
    SELECT title, content-type, language, revisit-after, rating, robots, extra_text_unparsed 
    into myArray 
    FROM header_table 
    WHERE filename = $filename 

foreach(v in myArray) 
{ 
    echo .... 
} 
} 
} 

什麼建議嗎?

+4

對於這個人來說,很難理解你的意思。你能提供一個三個文件如何重構的例子嗎? – venerik

+0

@venerik:編輯。這並不容易。如果你喜歡我會用powergrep發佈最終的解決方案,但它不是最聰明的工具...... – Revious

回答

1

你想要的是一個克隆檢測器。

請參閱https://en.wikipedia.org/wiki/Duplicate_code。那裏有一個克隆檢測器的列表。

的關鍵問題是:

  • 什麼語言呢克隆探測器支持?
  • 它如何檢測克隆?
  • 這樣的克隆怎麼能被刪除?
  • 該工具是否提供自動刪除克隆?

純「字符串克隆檢測」可以獨立於語言的,但通常 找不到可拆卸克隆,因爲他們不理解的代碼片段之間的邊界。

我建立AST-based clone detectors。這些基於目標語言的結構檢測克隆,如AST所示。以這種方式檢測到的克隆 比其他檢測器在語言邊界方面更自然。缺點是:這些都必然依賴於語言。每種語言都需要一個不同的探測器。收益是您可以在大量代碼中檢測到高質量的克隆。

刪除克隆自動很難;每種語言都提供自己的抽象代碼的手段(例如,創建子例程,宏,包含文件等),並且該工具必須知道每個代碼。你發明了HTML的抽象,它不在HTML可以編碼的位置(將片段放入數據庫:不在HMTL的詞彙表中)。

實際上,基本上沒有自動克隆除去器。幾乎所有你需要做的就是識別克隆(這就是克隆檢測器很好的原因),然後手動刪除它們,特別是要獲得像你所展示的那樣的自定義效果。

如果您想要實施自動化克隆刪除工具,則需要 相當於program transformation system。 (看到我的生物爲一,這恰好也支持克隆檢測)。