Как найти неиспользуемый / мертвый код в Java-проектах - PullRequest
292 голосов
/ 02 октября 2008

Какими инструментами вы пользуетесь, чтобы найти неиспользуемый / мертвый код в больших Java-проектах? Наш продукт разрабатывался в течение нескольких лет, и очень трудно вручную обнаружить код, который больше не используется. Однако мы стараемся удалить как можно больше неиспользуемого кода.

Предложения по общим стратегиям / методам (кроме специальных инструментов) также приветствуются.

Редактировать: Обратите внимание, что мы уже используем инструменты покрытия кода (Clover, IntelliJ), но они мало помогают. У мертвого кода все еще есть юнит-тесты, и он отображается как покрытый. Я предполагаю, что идеальный инструмент идентифицирует кластеры кода, у которых очень мало другого кода в зависимости от него, что позволяет проводить ручную проверку документов.

Ответы [ 21 ]

219 голосов
/ 02 октября 2008

Плагин Eclipse, который работает достаточно хорошо: Неиспользуемый код детектор .

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

64 голосов
/ 29 марта 2011

CodePro был недавно выпущен Google вместе с проектом Eclipse. Это бесплатно и очень эффективно. Плагин имеет функцию Find Dead Code с одной / несколькими точками входа. Работает довольно хорошо.

38 голосов
/ 02 октября 2008

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

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

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

27 голосов
/ 22 августа 2011

Я удивлен ProGuard здесь не упоминалось. Это один из самых зрелых продуктов в мире.

ProGuard - бесплатная программа для сжатия файлов классов Java, оптимизатор, обфускатор, и предварительный верификатор. Он обнаруживает и удаляет неиспользуемые классы, поля, методы и атрибуты. Оптимизирует байт-код и удаляет неиспользованные инструкции. Переименовывает остальные классы, поля и методы. используя короткие бессмысленные имена. Наконец, он проверяет обработанные код для Java 6 или для Java Micro Edition.

Некоторые варианты использования ProGuard:

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

Вот пример списка мертвых кодов: https://www.guardsquare.com/en/products/proguard/manual/examples#deadcode

26 голосов
/ 28 января 2009

Одна вещь, которую я, как известно, делал в Eclipse для одного класса, - это поменять все его методы на приватные, а затем посмотреть, какие жалобы я получаю. Для используемых методов это вызовет ошибки, и я верну их к самому низкому уровню доступа. Для методов, которые не используются, это вызовет предупреждения о неиспользуемых методах, которые затем могут быть удалены. И в качестве бонуса вы часто находите некоторые публичные методы, которые можно и нужно сделать приватными.

Но это очень ручной.

15 голосов
/ 02 октября 2008

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

Emma и Eclemma предоставят вам хорошие отчеты о том, какой процент классов выполняется для любого заданного прогона кода.

13 голосов
/ 02 октября 2008

Мы начали использовать Поиск ошибок , чтобы помочь идентифицировать некоторые фанки в среде, богатой целями нашей кодовой базы для рефакторинга. Я бы также рассмотрел Структура 101 , чтобы определить слишком сложные в вашей архитектуре кода места, чтобы вы знали, где настоящие болота.

12 голосов
/ 02 октября 2008

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

Это может проявиться в коде Java разными способами:

  • Загрузка классов на основе пользовательского ввода, файлов конфигурации, записей базы данных и т. Д .;
  • Загрузка внешнего кода;
  • Передача деревьев объектов сторонним библиотекам;
  • и т.д.

При этом я использую IDEA IntelliJ в качестве своей предпочтительной среды IDE, и в ней есть обширные инструменты анализа для поиска зависимостей между модулями, неиспользуемыми методами, неиспользуемыми членами, неиспользуемыми классами и т. Д. Он довольно интеллектуален, как частный метод, который не ' t named помечен как неиспользованный, но публичный метод требует более тщательного анализа.

7 голосов
/ 21 января 2016

В Eclipse Перейти к Windows> Настройки> Java> Компилятор> Ошибки / предупреждения
и измените их все на ошибки. Исправьте все ошибки. Это самый простой способ. Прелесть в том, что это позволит вам очистить код во время написания.

Код Eclipse для скриншота:

enter image description here

5 голосов
/ 17 ноября 2009

Structure101 перспектива среза предоставит список (и график зависимостей) любых "сирот" или "сирот * групп " классов или пакетов, которые не имеют зависимостей от или от «основной» кластер.

...