如果解决方案由框架,工具或任何其他方式表示,则无关紧要。这个问题很难解决,因为我多年来一直在与它作斗争。
我将举一个例子来更好地澄清我所说的内容。
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>
对于一个人来说,避免这种代码重复的任务是显而易见的。他可以认识到&#34;&#34;,&#34;&#34;是分隔符。行的顺序并不重要,哪些部分可以放入变量(或作为数据库中的值存储)以及哪些文件足够相似以进行重构。
整个过程看起来并不那么难以实现自动化。但是......直到现在我还没有找到任何解决方案。即使自动识别分隔符也很难..
我找到的最好方法是使用正则表达式工具并变得疯狂:D
重构后
文件1
header -> PrintHeader();
file2的
header -> PrintHeader();
file3的
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 ....
}
}
}
有什么建议吗?
答案 0 :(得分:1)
你想要的是一个克隆探测器。
见https://en.wikipedia.org/wiki/Duplicate_code。那里有一个克隆探测器列表。
关键问题是:
Pure&#34;字符串克隆检测&#34;可以是语言独立的,但通常 无法找到可移动克隆,因为他们无法理解代码片段之间的界限。
我构建了AST-based clone detectors。这些基于目标语言的结构检测克隆,如AST所示。克隆 这种方式检测到的语言边界比其他检测器更自然。缺点:这些必然取决于语言。每种语言都需要不同的探测器。获得的回报是,您可以在大量代码中检测到高质量的克隆。
自动删除克隆很难;每个语言提供了自己的抽象代码的方法(例如,创建子程序,宏,包含文件,......),工具必须知道它们中的每一个。你发明了HTML的抽象,它超出了HTML可以编码的范围(将片段放入数据库中:不是在HMTL的词汇表中)。
实际上,基本上没有自动克隆删除程序。你需要做的就是识别克隆(这就是克隆探测器很好的原因),然后手动删除它们,特别是获得你所展示的自定义效果。
如果您想实施自动克隆删除工具,则需要 什么等于program transformation system。 (请参阅我的个人简介,这也恰好支持克隆检测)。