Обнаружение дубликата кода между файлами и проведение полуавтоматического рефакторинга

Не имеет значения, представлено ли решение фреймворком, инструментом или чем-то еще. Проблему решить довольно сложно, я борюсь с ней годами.

Я приведу пример, чтобы лучше уточнить, о чем я говорю.

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>

File2

<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


После рефакторинга

file1

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

Решение

То, что вы хотите, это детектор клонов.

Увидеть https://en.wikipedia.org/wiki/Duplicate_code. Там есть список детекторов клонов.

Ключевые вопросы:

  • Какой язык поддерживает детектор клонов?
  • Как он обнаруживает клонов?
  • Как можно удалить такие клоны?
  • Предоставляет ли инструмент автоматизацию для удаления клонов?

Чистое «обнаружение клонирования строки» может не зависеть от языка, но обычно
не могу найти съемный клоны, потому что они не понимают границы между фрагментами кода.

я строю Детекторы клонов на основе AST. Они обнаруживают клоны на основе структуры целевого языка, представленной AST. Клоны
обнаруженные таким образом гораздо более естественны в отношении языковых границ, чем другие детекторы. Недостаток: они обязательно зависят от языка. Вам нужен свой детектор для каждого языка. Выгода в том, что вы получаете высококачественные клоны, обнаруженные в больших наборах кода.

Удаление клоны автоматически трудны; каждый язык предлагает свои собственные средства для абстрагирования кода (например, создание подпрограммы, макроса, включаемого файла, …), и инструмент должен знать каждый из них. Вы изобрели абстракцию для HTML, которая находится за пределами того, что HTML может кодировать (помещая фрагменты в базу данных: не в словаре HMTL).

С практической точки зрения, в основном нет автоматических съемников клонов. Практически все, что вам нужно сделать, — это идентифицировать клоны (вот почему детектор клонов хорош), а затем вручную удалить их, особенно для получения пользовательских эффектов, таких как показанный вами.

Если вы хотите внедрить инструмент автоматического удаления клонов, вам нужно
что составляет система трансформации программ.
(См. Мою биографию, которая также поддерживает обнаружение клонов).

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector