Знайти невикористаний код [закрито]


208

Мені доводиться переробляти великий додаток C #, і я знайшов багато функцій, які ніколи не використовуються. Як я можу перевірити невикористаний код, щоб видалити всі невикористані функції?




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

Відповіді:


218

Так, ReSharper це робить. Клацніть правою кнопкою миші рішення та виберіть "Знайти проблеми з кодом". Один із результатів - «Невикористані символи». Це покаже вам класи, методи тощо, які не використовуються.


20
це чудово. про це знає недостатньо людей. Вам також потрібно ввімкнути Широкий аналіз рішення, щоб відобразити все.
mcintyre321

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

9
Ми використовуємо ін'єкцію залежності. Як результат, все виглядає звичним для повторного розподілу, оскільки навіть невикористані типи все ще реєструються в єдності.
Montgomery 'monty' Джонс

11
@ user890155 Це було б тому, що метод є загальнодоступним, бібліотека може використовуватися іншою програмою, що не знаходиться в поточному рішенні. Я вважаю, що він буде позначати лише внутрішні та приватні методи як проблеми коду, якщо вони не використовуються.
Луказоїд

3
@elggarc Що стосується ін'єкцій залежностей, подивіться на згаданий тут плагін агента Малдера: blogs.jetbrains.com/dotnet/2012/08/resharper-70-plug-ins Домашня сторінка проекту: hmemcpy.github.com/AgentMulder Agent Mulder - підтримка Каркаси вприскування залежностей, такі як Autofac, Castle Windsor, Unity. Оскільки ReSharper не знає про ці контейнери, класи можуть бути позначені як невикористані або незастосовані. Агент Малдер повідомляє ReSharper, коли ці класи використовуються, і забезпечує навігацію до точки реєстрації від кожного класу.
Гжегож Смолько

29

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

Один чудовий інструмент приходить на думку:

NDepend - цей інструмент просто дивовижний. Потрібно трохи попрацювати, і вже через перші 10 хвилин я думаю, що більшість розробників просто кажуть "Викрутіть!" та видаліть додаток. Як тільки ви відчуваєте хороший досвід для NDepend, він дає вам дивовижне розуміння того, як ваші програми поєднуються. Перевірте це: http://www.ndepend.com/ . Найголовніше, що цей інструмент дозволить вам переглядати методи, у яких немає ніяких прямих викликів. Він також покаже вам зворотне, повне дерево викликів для будь-якого методу в зборі (або навіть між складами).

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


4
Ще одне слово обережності, якщо ваш додаток asp.net, з NDepend вам потрібно буде попередньо скомпілювати свій сайт, щоб ви могли проаналізувати коди-відставання, і NDepend не зможе охопити / знати про дзвінки зі сторінок aspx (тобто виклики методу в ObjectDataSources і подобається)
Хайме

16

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


15

Як вказував Джефф, інструмент NDepend може допомогти знайти невикористані методи, поля та типи.

Щоб трохи розробити, NDepend пропонує написати Правило коду над LINQ Query (CQLinq) . Запропоновано близько 200 правил коду за замовчуванням , 3 з яких присвячені виявленню невикористаного / мертвого коду

В основному таке правило для виявлення невикористаного методу, наприклад, виглядає так:

// <Name>Dead Methods</Name>
warnif count > 0 
from m in Application.Methods where !m.MethodsCallingMe.Any()
select m

Правило NDepend знайти невикористані методи (мертві методи)

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

NDepend інтегрується в Visual Studio 2017,2015, 2013, 2012, 2010, тому ці правила можна перевірити / переглядати / редагувати прямо всередині IDE . Інструмент також може бути інтегрований у ваш процес CI, і він може створювати звіти, які показуватимуть порушені правила та елементи винного коду. NDepend також має розширення VS Team Services .

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

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

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

Відмова: Я працюю на NDepend.


6

Я також зазначив, що використання IOC aka Unity може зробити ці оцінки оманливими. Можливо, я помилився, але, здається, кілька дуже важливих класів, які інстанціюються через Unity, не мають даних, наскільки ReSharper може сказати. Якби я дотримувався рекомендацій ReSharper, я би отримав шланг!


4

ReSharper робить велику роботу з пошуку невикористаного коду.

У VS IDE можна клацнути правою кнопкою миші на визначення та вибрати "Знайти всі посилання", хоча це працює лише на рівні рішення.


1

Правда полягає в тому, що інструмент ніколи не може дати вам 100% певну відповідь, але інструмент покриття може дати вам досить хороший запуск грошей.

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

Одним із таких інструментів є NCover , з попередницею з відкритим кодом на Sourceforge . Ще одна альтернатива - PartCover .

Ознайомтеся з цією відповіддю на stackoverflow.


1

Я натрапив на AXTools CODESMART .. Спробуйте це один раз. Використовуйте аналізатор коду в розділі оглядів. Він перелічить мертві локальні та глобальні функції разом з іншими проблемами.


0

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

Я думаю, що NDepend виглядає як більш вірогідний кандидат.

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