Инструменты для обнаружения дублированного кода (Java)
Я участвую в проекте, где предыдущие программисты были кодами для копирования. Эти коды на самом деле идентичны (или очень похожи), и они могли быть переработаны в один.
Я потратил бесчисленные часы на реорганизацию этих кодов вручную, но я думаю, что должен быть лучший способ. Некоторые из них представляют собой очень тривиальные статические методы, которые могли быть перенесены в класс предков (но вместо этого они были скопированы во всех предыдущих младших программистах).
Есть ли инструмент анализа кода, который может обнаружить это и предоставить отчеты/рекомендации? Я предпочитаю бесплатный инструмент с открытым исходным кодом, если это возможно.
Ответы
Ответ 1
Я использую следующие инструменты:
Оба инструмента имеют поддержку обнаружения дублирования кода. Но у обоих из них нет возможности сообщить вам, как реорганизовать ваш код.
JetBrains IntelliJ IDEA Ultimate имеет хороший статический анализ кода с поддержкой дублирования кода, но он не является бесплатным.
Ответ 2
Большинство инструментов, перечисленных в статье Wikipedia по Duplicate Code Tools, обнаруживают дубликаты на разных языках, включая Java.
Ответ 3
SonarQube может обнаруживать дублированные коды, но не дает рекомендаций по их устранению. Это бесплатно и - хотя с настройкой по умолчанию он может обнаруживать только лексически идентичные клоны
Ответ 4
Либо Simian или PMD CPD. Первый поддерживает более широкий набор языков, но не является бесплатным для коммерческих проектов.
Ответ 5
http://checkstyle.sourceforge.net/ поддерживает поиск дубликатов
Ответ 6
См. наш SD Java CloneDR - инструмент для обнаружения точного и близкого пропущенного дублирующего кода в больших Java-системах.
CloneDR найдет клоны кода, несмотря на изменения пробелов, разрывы строк, удаления вставок комментариев, модификацию констант или идентификаторов и в ряде случаев даже замену одного оператора другим или блоком операторов.
Он показывает, где находится каждый набор клонов, каждый отдельный клон, абстракция клонов, имеющих общую общность и параметризацию абстракции, чтобы показать, как каждый экземпляр клона может быть получен из абстракции.
Он находит 10-20% клонов в большинстве систем Java.