检测文件之间的代码重复并进行半自动重构
本文关键字:半自动 重构 文件 之间 代码 检测 | 更新日期: 2023-09-27 18:21:15
解决方案是由框架、工具还是其他任何东西表示都无关紧要。这个问题很难解决,多年来我一直在与之斗争。
我将举一个例子来更好地阐明我所说的内容。
文件1
<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>
对于人类来说,避免这种代码重复的任务是显而易见的。他能认识到"、"是分隔符。行的顺序无关紧要,哪些部分可以放入变量(或作为值存储在数据库中),哪些文件足够相似,可以重构。
整个过程似乎不会那么可怕,难以自动化。但是直到现在我都找不到任何解决方案。即使自动识别分隔符也很难。。
我发现最好的方法是玩正则表达式工具,然后变得疯狂:D
重构后
文件1
header -> PrintHeader();
文件2
header -> PrintHeader();
文件3
header -> PrintHeader();
全局文件
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 ....
}
}
}
有什么建议吗?
您想要的是一个克隆检测器。
请参阅https://en.wikipedia.org/wiki/Duplicate_code.那里有一个克隆探测器的列表。
关键问题是:
- 克隆检测器支持什么语言
- 它是如何检测克隆的
- 如何删除这样的克隆
- 该工具是否提供删除克隆的自动化功能
纯"字符串克隆检测"可以独立于语言,但通常找不到可移动克隆,因为它们不了解代码片段之间的边界。
我构建了基于AST的克隆检测器。这些基于目标语言的结构来检测克隆,如AST所表示的。克隆与其他检测器相比,以这种方式检测到的语言边界要自然得多。缺点是:这些必然依赖于语言。每种语言都需要一个不同的检测器。回报是您可以在大量代码中检测到高质量的克隆。
自动删除克隆很困难;每个langauge都提供了自己的代码抽象方法(例如,生成子例程、宏、include文件等),工具必须了解其中的每一种。您为HTML发明了一种抽象,它超出了HTML可以编码的范围(将片段放入数据库:而不是HMTL的词汇表中)。
实际上,基本上没有自动的克隆删除程序。你要做的基本上是识别克隆(这就是为什么克隆检测器很好),然后手动删除它们,尤其是为了获得像你展示的那样的自定义效果。
如果要实现自动克隆删除工具,您需要相当于程序转换系统。(请参阅我的个人简历,它恰好也支持克隆检测)。