refactoring Как найти неиспользуемый / мертвый код в java-проектах



10 Answers

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

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

java refactoring dead-code

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

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

Изменить: обратите внимание, что мы уже используем инструменты покрытия кода (Clover, IntelliJ), но они мало помогают. Мертвый код все еще имеет модульные тесты и отображается как закрытое. Я думаю, что идеальный инструмент будет определять кластеры кода, которые имеют очень мало другого кода, в зависимости от него, что позволяет вручную проверять документы.




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

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

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

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



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

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




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

Это может проявляться в коде Java во многих отношениях:

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

Это говорит о том, что я использую IDEA IntelliJ в качестве моей IDE-выборки и имеет обширные инструменты анализа для зависимостей findign между модулями, неиспользуемыми методами, неиспользуемыми членами, неиспользуемыми классами и т. Д. Его вполне интеллигентный тоже как частный метод, который не называется помечен как неиспользуемый, но публичный метод требует более тщательного анализа.




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

Я также попытался бы найти дубликат кода как способ уменьшить объем кода.

Мое последнее предложение - попытаться найти открытый исходный код, который, если его использовать, сделает ваш код более простым.




DCD не является плагином для некоторых IDE, но может запускаться из муравья или автономно. Это похоже на статический инструмент, и он может делать то, что PMD и FindBugs не могут . Я попробую.

PS Как упоминалось в комментарии ниже, проект живет сейчас в GitHub .




  • FindBugs отлично подходит для такого рода вещей.
  • PMD (детектор проекта Messenger) - еще один инструмент, который можно использовать.

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




Инструменты покрытия кода, такие как Emma, ​​Cobertura и Clover, будут обрабатывать ваш код и записывать, какие части его вызывают, запуская набор тестов. Это очень полезно и должно быть неотъемлемой частью вашего процесса разработки. Это поможет вам определить, насколько хорошо ваш набор тестов охватывает ваш код.

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

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

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

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







Я нашел инструмент для покрытия Clover, который содержит код кода и выделяет код, который используется и который не используется. В отличие от Google CodePro Analytics, он также работает для WebApplications (согласно моему опыту, и я могу ошибаться в Google CodePro).

Единственный недостаток, который я заметил, заключается в том, что он не учитывает интерфейсы Java.




Related