Устранение дублирования кода в одном файле

К сожалению, проект, над которым я недавно работал, содержит большое количество кода для копирования и вставки даже в отдельных файлах. Существуют ли какие-либо инструменты или методы, которые могут обнаруживать дублирование или почти дублирование в одном файле? У меня есть Beyond Compare 3, и он хорошо работает для сравнения отдельных файлов, но я не могу сравнить отдельные файлы.

Заранее спасибо.

Изменить:

Спасибо за все отличные инструменты! Я обязательно проверю их.

Этот проект является проектом ASP.NET/C#, но я работаю с различными языками, включая Java; Меня интересует, какие инструменты лучше всего подходят (для любого языка) для устранения дублирования.


person Jon Onstott    schedule 02.02.2010    source источник
comment
Решения совершенно разные для разных языков. Теги для ASP.NET/C#.   -  person Tronic    schedule 02.02.2010
comment
Правильно, но я хотел бы знать лучшие инструменты для самых популярных языков (потому что я работаю с несколькими языками одновременно). Спасибо хоть.   -  person Jon Onstott    schedule 02.02.2010
comment
Решение CloneDR одинаково для многих языков. CloneDR обрабатывает C #, Java, HTML и JavaScript, что, я думаю, довольно хорошо покрывает ситуацию ASP.NET OP.   -  person Ira Baxter    schedule 12.02.2010
comment
Другие ключевые слова для поиска: обнаружение копирования и вставки, распознавание сходства. Вы можете попробовать pmd   -  person Martin Thoma    schedule 08.09.2020


Ответы (9)


Посетите Atomiq. Он находит повторяющийся код, который идеально подходит для извлечения в одно место.

http://www.getatomiq.com/

person Chris Missal    schedule 02.02.2010
comment
CopyPasteKiller был переименован в Atomiq и теперь стоит 30 долларов (что кажется разумным). nimblepros.com/products/atomiq.aspx - person Peter Bernier; 17.06.2010

Если вы используете Eclipse, вы можете использовать детектор копирования и вставки (CPD) https://olex.openlogic.com/packages/cpd.

person Jeff Storey    schedule 02.02.2010

Вы не говорите, какой язык вы используете, что повлияет на то, какие инструменты вы можете использовать.

Для Python есть CloneDigger. Он также поддерживает Java, но я этого не пробовал. Он может находить дублирование кода как в одном файле, так и между файлами, и выдает результат в виде отчета о различиях в HTML.

person Dave Kirby    schedule 02.02.2010

См. SD CloneDR, инструмент для обнаружения кода копирования, вставки и редактирования внутри и между несколькими файлами. Он обнаруживает точные копии, переформатированные копии и копии с разными идентификаторами, литералами и даже разными последовательностями операторов.

CloneDR работает со многими языками, включая Java (1.4, 1.5, 1.6) и C#, особенно до C# 4.0. Вы можете увидеть образцы отчетов об обнаружении клонов на веб-сайте, в том числе отчет для C#.

person Ira Baxter    schedule 02.02.2010

Resharper делает это автоматически — он предлагает, когда считает, что код должен быть извлечен в метод, и сделает извлечение для вас

person BlueRaja - Danny Pflughoeft    schedule 02.02.2010

Проверьте PMD после того, как вы настроите его (что немного просто) вы можете запустить его детектор копирования и вставки, чтобы найти повторяющийся код.

person Ravi Gupta    schedule 02.02.2010

Человек с некоторыми навыками работы с Office может выполнить следующую последовательность действий за 1 минуту:

  • используйте обычный форматтер для унификации стиля кода, желательно без переноса строк
  • передать текст кода в Microsoft Excel в виде одного столбца
  • искать и заменять все двойные пробелы одним и делать другие замены
  • сортировать столбец

На этом этапе ключевые слова для дубликатов уже будут хорошо обнаружены. Но идти дальше

  • добавить формулу сравнения во 2-й столбец и счетчик в 3-й
  • скопируйте и вставьте значения снова, отсортируйте и просмотрите наиболее повторяющиеся строки
person Community    schedule 12.02.2010

Существует инструмент анализа под названием Simian, который я еще не пробовал. Предположительно, его можно запускать для любого типа текста и указывать на повторяющиеся элементы. Его можно использовать через интерфейс командной строки.

person Grant Palin    schedule 24.03.2010
comment
Ссылка не работает. - person Chris Stryczynski; 22.09.2020

Еще один вариант, аналогичный приведенному выше, но с другой цепочкой инструментов: https://www.npmjs.com/package/jscpd

person bsb    schedule 13.06.2017