Подтвердить что ты не робот

Как найти аналогичный фрагмент кода?

Есть ли у кого-нибудь инструмент или какая-то рекомендуемая практика, как найти фрагмент кода, который похож на какой-то другой код?

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

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

Рассмотрим следующие примеры:

  float xDistance = 0, zDistance = 0;
  if (camPos.X()<xgMin) xDistance = xgMin-camPos.X();
  if (camPos.X()>xgMax) xDistance = camPos.X()-xgMax;
  if (camPos.Z()<zgMin) zDistance = zgMin-camPos.Z();
  if (camPos.Z()>zgMax) zDistance = camPos.Z()-zgMax;
  float dist = sqrt(xDistance*xDistance+zDistance*zDistance);

и

  float distX = 0, distZ = 0;
  if (cPos.X()<xgMin) distX = xgMin-cPos.X();
  if (cPos.X()>xgMax) distX = cPos.X()-xgMax;
  if (cPos.Z()<zgMin) distZ = zgMin-cPos.Z();
  if (cPos.Z()>zgMax) distZ = cPos.Z()-zgMax;
  float dist = sqrt(distX*distX +distZ*distZ);

Мне кажется, что это уже задавали и несколько раз отвечали:

https://stackoverflow.com/info/204177/what-tool-to-find-code-duplicates-in-c-projects

Как обнаружить дублирование кода во время разработки?

Я предлагаю закрыть здесь дубликат.


На самом деле, я думаю, что это более общая проблема поиска, например: Как искать, если вопрос уже задан в StackOverflow?

4b9b3361

Ответ 1

Вы можете использовать Simian. Это инструмент, который обнаруживает дублирующий код в Java, С#, С++, XML и многие другие (даже простые текстовые файлы). Он даже прекрасно интегрируется в инструмент, такой как CruiseControl.

Ответ 2

Наш CloneDR находит дублирующий код, как точные копии, так и пропущенные, в больших системах источников, параметризованных синтаксисом langauge. Он поддерживает Java, С#, COBOL, С++, PHP, Python и многие другие языки.

Он принимает ряд параметров для определения "Что такое клон?", в том числе: a) Порог сходства, контролирующий, как аналогичные два блока кода должны  быть объявленными как клоны (обычно 95% хороши) b) количество минимальных размеров клона линий (3 - хороший выбор) c) количество параметров (отличные изменения текста, 5 - хороший выбор) С этими настройками он обычно находит 10-15% избыточного кода в виртуральном все, что он обрабатывает.

Линейно-ориентированные инструменты обнаружения клонов, такие как Simian, не могут найти клонированный код, который был переформатирован, но CloneDR. Они могут сказать, что два блока кода совпадают, но они обычно не показывают вам точно, как они совпадают или где существуют различия; CloneDR будет. Они не предлагают, как абстрагироваться от клонированного кода; CloneDR будет.

В силу слабого соответствия алгоритмы, они, как правило, создают более ложные срабатывания; когда вы получаете 5000 клонов через миллион строк число ложных срабатываний имеет большое значение.

В соответствии с вашим примером, я ожидаю, что он найдет эти два фрагмента (у вас нет ни одной точки), и обратите внимание, что они аналогичны, если вы абстрагируете имена переменных.

Ответ 3

Бывает, что мой тезис заключался в обнаружении подобных фрагментов кода.

Вот лучшая страница, которую я нашел. Много литературы, инструментов, ссылок:

http://students.cis.uab.edu/tairasr/clones/literature/

В целом есть много программ, но ни один из них не кажется лучшим или самым популярным. Вы должны определить, что для вас наиболее важно, и найти доступные инструменты... или прочитать некоторые статьи и написать собственный инструмент, подходящий для вас наилучшим образом. Если вы пишете хороший детектор клонов, вы можете перенести его как плагин Eclipse, и он будет полезен для многих людей. Ни один из плагинов в последнее время не доминирует, поэтому вы можете быть одним из них.