Як знайти невикористаний / мертвий код у java проектах [закрито]


306

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

Пропозиції щодо загальних стратегій / методів (крім конкретних інструментів) також оцінені.

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


16
Зберігайте одиничні тести в окремому вихідному дереві (у будь-якому випадку слід) та запускайте інструменти покриття лише на живому дереві.
agnul

5
Я хотів би почати з IDEA в «Невикористані декларації» інспекції і зніміть прапорець Включити джерела тестів . Чи можете ви уточнити, що ви маєте на увазі, говорячи про "маленьку допомогу" IDEA?
Девід Молес

1
Способи пошуку мертвого коду: 1) не пов'язане нічим зовні. 2) не використовувався ззовні, навіть не зважаючи на час виконання. 3) Пов'язані та викликані, але ніколи не використовуються як мертва змінна. 4) логічно недосяжний стан. Тому зв'язок, доступ із часом, заснований на логіці, використання після доступу.
Мухаммед Умер

Використовуйте IntelliJ Idea і моя відповідь тут: stackoverflow.com/questions/22522013 / ... :)
BlondCode

Доповнення до відповіді Девіда Моля: дивіться цю відповідь stackoverflow.com/a/6587932/1579667
Benj

Відповіді:


40

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

Наприклад, якщо ви зацікавлені у невикористаних класах, усі класи можуть бути задіяні для реєстрації під час створення екземплярів. І тоді невеликий скрипт міг би порівняти ці журнали з повним списком класів, щоб знайти невикористані класи.

Звичайно, якщо ви переходите на рівень методу, вам слід пам’ятати про ефективність. Наприклад, методи могли зареєструвати лише своє перше використання. Я не знаю, як це найкраще зробити на Java. Ми це зробили в Smalltalk, який є динамічною мовою і, таким чином, дозволяє змінювати код під час виконання. Ми об'єднуємо всі методи з викликом реєстрації та видаляємо код журналу після того, як метод був вперше зареєстрований, таким чином, через деякий час більше не відбуватиметься покарання за ефективність. Можливо, подібне можна зробити на Java зі статичними булевими прапорами ...


5
Мені подобається ця відповідь, але хтось має уявлення, як це зробити на Java без явного додавання журналу в кожен клас? Можливо, якась магія проксі?
Програматор поза законом

14
@Outlaw AOP, здається, є ідеальним випадком використання для цього.
Паскаль Thivent

6
Якщо ви розумієте структуру завантаження програми у додатку, ви можете використовувати AOP на завантажувачі класів для відстеження подій занять. Це було б менш інвазивно у виробничій системі, ніж поради перед усіма конструкторами.
ShabbyDoo

5
Ця відповідь досить хороша для динамічної мови, але жахлива для статичної мови, яка могла б набагато краще. За допомогою статично набраної мови (окрім рефлексії) ви можете точно знати, які саме методи використовуються, а які ні, це одна з найбільших переваг статично набраної мови, і ви повинні використовувати її, а не метод помилок, як описано тут .
Білл К

4
@BillK трапляється більше роздумів, ніж ти думаєш. Напр. Весна робить досить багато магії під прикриттями, включаючи рефлексію. Ваш інструмент аналізу повинен наслідувати це.
Thorbjørn Ravn Andersen

220

Плагін Eclipse, який працює досить добре, є Unused Code Detector .

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


Виглядає добре, але мені не вдалося змусити його працювати - дія "Виявити un ... code" відключена, і я не знайшов способу її включити.
Ондра Жижка

1
Дійсно знайдіть невикористані методи, Але також встановіть, що мої EJB не використовуються (поки вони є), тому що я використовую дизайн делегата шаблону дизайну
Eildosa

Це все ще працює на кеплері? випуски говорять про затемнення 3.8: ucdetector.org/releases.html
Mr_and_Mrs_D

Здається, у Kepler ідеально працює.
Ерік Каплун

4
Ви хочете додати посилання на marketplace marketplace.eclipse.org/content/unne potrebne- code-detector ? Це полегшує встановлення та відповідає на питання, чи підтримується він у новіших версіях Eclipse.
Томас Веллер

64

CodePro нещодавно вийшов Google разом із проектом Eclipse. Це безкоштовно та високоефективно. У плагіна є функція " Знайти мертвий код " з однією / багатьма точками входу. Працює досить добре.


1
Більше не буду працювати з затемненням Кеплера. Після успішної установки через сайт оновлення він робить крапку затемнення кожного разу.
txulu

На жаль, схоже, що цей інструмент не усвідомлює існування Весни, тому він позначить усі мої @Components як невикористані, помилково
Клінт Іствуд

Станьте дуже старим Не працює більше Last updated this plugin March 27, 2012 developers.google.com/java-dev-tools/download-codepro
mumair

2
Усі посилання застарілі.
зигімантус

3
На жаль, схоже, що Google скинув код на проект Eclipse і забув про нього.
Thorbjørn Ravn Andersen

30

Я здивований, що ProGuard тут не згадується. Це один з найбільш зрілих продуктів навколо.

ProGuard - це безкоштовна утилізатор файлів класу Java, оптимізатор, обфускатор та попереднювач. Він виявляє та видаляє невикористані класи, поля, методи та атрибути. Це оптимізує байт-код і видаляє невикористані інструкції. Він перейменовує решта класів, полів та методів, використовуючи короткі безглузді імена. Нарешті, він підтверджує оброблений код для Java 6 або для Java Micro Edition.

Деякі способи використання ProGuard:

  • Створення більш компактного коду для менших архівів коду, більш швидкої передачі по мережах, швидшого завантаження та меншої кількості пам'яті.
  • Зробити програми та бібліотеки складнішими для інженерів.
  • Лістинг мертвого коду, тому його можна видалити з вихідного коду.
  • Переназначення та попередня перевірка існуючих файлів класів для Java 6 або новішої версії, щоб максимально скористатися їх швидшим завантаженням класів.

Ось приклад для списку мертвих кодів: https://www.guardsquare.com/en/products/proguard/manual/examples#deadcode


8
Надання вибіркового використання допомогло б краще відповісти.
rds

1
Читаючи документацію, я бачу, що вона скорочує невикористаний код, але я не можу знайти ніде, де вона перерахована - узгоджений, приклад чи посилання на відповідний розділ документації, були б дуже корисними!
orbfish

26

Одне, що мені було відомо в одному класі, Eclipse - це змінити всі його методи на приватні, а потім побачити, які скарги я отримую. Для методів, які використовуються, це спровокує помилки, і я поверну їх до найнижчого рівня доступу. Для невикористаних методів це спровокує попередження про невикористані методи, і їх можна буде видалити. І як бонус, ви часто знаходите деякі публічні методи, які можна і потрібно зробити приватними.

Але це дуже керівництво.


4
Можливо, не ідеальна відповідь, але це дійсно розумно.
Ерік Реппен

8
Це розумно ... поки ви не зателефонуєте до нього з невикористаного коду іншого класу.
Даносаур

Ітерація над цим методом може видалити величезну кількість коду, оскільки один використаний метод створює інші, коли він видаляється.
4myle

15

Використовуйте інструмент тестового покриття для інструменту вашої кодової бази, а потім запустіть саме додаток, а не тести.

Емма та Еклемма дадуть вам приємні звіти про те, який відсоток класів виконується для будь-якого запуску коду.


1
+1 - це хороша відправна точка, але майте на увазі, що, наприклад, невикористані (ще оголошені) змінні також з’являться зеленими.
DerMike

13

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


4
FindBugs не може виявити мертвий та невикористаний код, лише невикористані поля. Дивіться цю відповідь .
Стефан Мюкк

12

Теоретично ви не можете детерміновано знайти невикористаний код. Це математичне підтвердження цього (ну, це особливий випадок більш загальної теореми). Якщо вам цікаво, знайдіть проблему зупинки.

Це може проявлятися в коді Java багатьма способами:

  • Завантаження класів на основі введення користувача, конфігураційних файлів, записів бази даних тощо;
  • Завантаження зовнішнього коду;
  • Передача дерев об'єктів третім сторонам бібліотекам;
  • тощо.

Зважаючи на це, я використовую IDEA IntelliJ як мій вибір IDE, і він має широкі інструменти аналізу для знаходження залежності між модулями, невикористаними методами, невикористаними членами, невикористаними класами і т.д. з тегом невикористаний, але публічний метод вимагає більш широкого аналізу.


1
Дякую за ваш внесок Ми використовуємо IntelliJ і отримуємо там допомогу. Що стосується проблеми зупинки та нерозбірливості, я знайомий з теорією, але нам не потрібно детермінованого рішення.
knatten

12
Вступне речення занадто сильне. Як і у випадку із проблемою зупинки (також часто її неправильно котирують / зловживають), немає повних загальних рішень, але існує маса спеціальних випадків, які МОЖНЕ виявити.
joel.neely

9
Хоча не існує загального рішення для мов з eval та / або відображенням, існує маса випадків, коли код є недоступним.
pjc50

1
Без роздумів і з повним вихідним кодом будь-яка статично набрана мова повинна зробити досить легко детерміновано знайти весь невикористаний код.
Білл К

Ви не можете знайти, що це недоступно за допомогою відображення або зовнішніх абонентів, але ви можете знайти код, недоступний статично з заданої точки входу або набору вхідних точок
нафг

8

У Eclipse Goto Windows> Налаштування> Java> Компілятор> Помилки / попередження
та змініть всі на помилки. Виправте всі помилки. Це найпростіший спосіб. Краса в тому, що це дозволить вам очистити код під час написання.

Код затемнення коду екрана:

введіть тут опис зображення


5

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

Я б також спробував знайти дублікат коду як спосіб зменшення обсягу коду.

Моя остання пропозиція - спробувати знайти відкритий код, який, якщо він буде використаний, полегшить ваш код.


Будь-які приклади, що це за інструменти?
orbfish

@orbfish Ви можете бігти Analyse=> Run inspection by name=>unused
Пітер Лорі

5

У перспективі фрагмента Structure101 буде подано список (і графік залежності) будь-яких "сиріт" або "осиротілих груп " класів або пакетів, які не залежать від або "основного" кластера.


Чи працює це, наприклад, змінні / методи в класі?
Joeblackdev

Як я можу дізнатися, чи потрібно це працювати, наприклад, Eclipse 4.3?
Ерік Каплун

3

DCD не є плагіном для деяких IDE, але він може бути запущений з мурашки або окремо. Це схоже на статичний інструмент, і він може робити те, що не може PMD та FindBugs . Я спробую.

PS Як зазначено в коментарі нижче, Проект зараз живе в GitHub .


Це має піти на коментар, а не відповідь
граф

Будь ласка, оновіть свою відповідь, щоб видалити заяву про те, що DCD "зараз виглядає мертвим". Версія 2.1 була випущена 12 днів тому . Також посилання у вашій відповіді не працює.
skomisa

2

Є інструменти, які кодують профіль і надають дані про покриття коду. Це дозволяє вам побачити (як виконується код), яка частина його викликається. Ви можете отримати будь-який з цих інструментів, щоб дізнатися, скільки у вас є сиротний код.


2
  • FindBugs відмінно підходить для подібних речей.
  • PMD (Project Mess Detector) - ще один інструмент, який можна використовувати.

Однак жоден не може знайти публічні статичні методи, які не використовуються в робочій області. Якщо хтось знає про такий інструмент, то, будь ласка, дайте мені знати.


1

Інструменти охоплення користувачів, такі як EMMA. Але це не статичний інструмент (тобто він вимагає насправді запустити додаток через регресійне тестування та через усі можливі випадки помилок, що, ну, неможливо :))

Все-таки EMMA дуже корисна.


1

Інструменти покриття коду, такі як Емма, Кобертура та Конюшина, будуть інструментувати ваш код і записувати, які його частини викликаються, виконавши набір тестів. Це дуже корисно і має бути невід'ємною частиною вашого процесу розвитку. Це допоможе вам визначити, наскільки добре ваш тестовий набір покриває ваш код.

Однак це не те саме, що ідентифікувати реальний мертвий код. Він ідентифікує лише код, який охоплюється (або не охоплюється) тестами. Це може призвести до помилкових позитивних результатів (якщо ваші тести не охоплюють усіх сценаріїв), а також помилкових негативів (якщо ваш тест код доступу, який насправді ніколи не використовується в реальному сценарії).

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

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

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




0

Затьмарення може показати / виділити код, якого неможливо досягти. JUnit може показати вам покриття коду, але вам знадобляться деякі тести, і вам доведеться вирішити, чи немає відповідного тесту чи код справді не використовується.


3
Eclipse скаже вам лише, якщо сфера методу локальна (тобто приватна); і навіть тоді ви не можете бути на 100% впевнені ... приватний метод може бути викликаний ззовні.
p3t0r

0

Я знайшов інструмент покриття Clover, котрий інструменти кодує і виділяє код, який використовується, а який не використовується. На відміну від Google CodePro Analytics, він також працює для WebApplications (на мій досвід, і я можу помилятися щодо Google CodePro).

Єдиний недолік, який я помітив, - це те, що він не враховує інтерфейси Java.


Afaict, це невільний інструмент CI на стороні сервера.
Ерік Каплун

0

Я використовую Doxygen для розробки карти викликів методів, щоб знайти методи, які ніколи не викликаються. На графіку ви знайдете острови кластерних методів без викликаючих. Це не працює для бібліотек, оскільки завжди потрібно починати з якоїсь основної точки входу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.