Мені доводиться переробляти великий додаток C #, і я знайшов багато функцій, які ніколи не використовуються. Як я можу перевірити невикористаний код, щоб видалити всі невикористані функції?
Мені доводиться переробляти великий додаток C #, і я знайшов багато функцій, які ніколи не використовуються. Як я можу перевірити невикористаний код, щоб видалити всі невикористані функції?
Відповіді:
Так, ReSharper це робить. Клацніть правою кнопкою миші рішення та виберіть "Знайти проблеми з кодом". Один із результатів - «Невикористані символи». Це покаже вам класи, методи тощо, які не використовуються.
Це чудове питання, але будьте попереджені, що ви ступаєте тут у небезпечних водах. Коли ви видаляєте код, вам доведеться переконатися, що ви часто компілюєте та тестуєте.
Один чудовий інструмент приходить на думку:
NDepend - цей інструмент просто дивовижний. Потрібно трохи попрацювати, і вже через перші 10 хвилин я думаю, що більшість розробників просто кажуть "Викрутіть!" та видаліть додаток. Як тільки ви відчуваєте хороший досвід для NDepend, він дає вам дивовижне розуміння того, як ваші програми поєднуються. Перевірте це: http://www.ndepend.com/ . Найголовніше, що цей інструмент дозволить вам переглядати методи, у яких немає ніяких прямих викликів. Він також покаже вам зворотне, повне дерево викликів для будь-якого методу в зборі (або навіть між складами).
Який би інструмент ви не вибрали, це не легке сприйняття. Особливо, якщо ви маєте справу з публічними методами на зборах типів бібліотеки, оскільки ви ніколи не знаєте, коли додаток посилається на них.
Як вказував Джефф, інструмент 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
Але це правило є наївним і поверне тривіальні помилкові позитиви. Існує багато ситуацій, коли метод ніколи не викликається, але він не використовується (точка входу, конструктор класів, фіналізатор ...), тому 3 правила за замовчуванням більш детально розроблені:
NDepend інтегрується в Visual Studio 2017,2015, 2013, 2012, 2010, тому ці правила можна перевірити / переглядати / редагувати прямо всередині IDE . Інструмент також може бути інтегрований у ваш процес CI, і він може створювати звіти, які показуватимуть порушені правила та елементи винного коду. NDepend також має розширення VS Team Services .
Якщо натиснути ці 3 посилання вище до вихідного коду цих правил, ви побачите, що ті, що стосуються типів та методів, є трохи складними. Це відбувається тому, що вони виявляють не тільки невикористані типи та методи, але й типи та методи, які використовуються лише невикористаними мертвими типами та методами (рекурсивними).
Це статичний аналіз , отже, префікс Потенційно у назвах правил. Якщо елемент коду використовується лише за допомогою відображення, ці правила можуть вважати його невикористаним, що не так.
Окрім використання цих трьох правил, я б радив вимірювати охоплення коду тестами та прагнути до повного покриття. Часто ви побачите, що код, який неможливо покрити тестами, насправді є невикористаним / мертвим кодом, який можна безпечно відкинути. Це особливо корисно для складних алгоритмів, де не зрозуміло, чи доступна гілка коду чи ні.
Відмова: Я працюю на NDepend.
Я також зазначив, що використання IOC aka Unity може зробити ці оцінки оманливими. Можливо, я помилився, але, здається, кілька дуже важливих класів, які інстанціюються через Unity, не мають даних, наскільки ReSharper може сказати. Якби я дотримувався рекомендацій ReSharper, я би отримав шланг!
ReSharper робить велику роботу з пошуку невикористаного коду.
У VS IDE можна клацнути правою кнопкою миші на визначення та вибрати "Знайти всі посилання", хоча це працює лише на рівні рішення.
Правда полягає в тому, що інструмент ніколи не може дати вам 100% певну відповідь, але інструмент покриття може дати вам досить хороший запуск грошей.
Якщо ви розраховуєте з комплексним набором тестових пакетів, тоді ви можете скористатися інструментом тестового покриття, щоб точно побачити, які рядки коду не були виконані під час тестового запуску. Вам все одно доведеться проаналізувати код вручну: або усунути те, що ви вважаєте мертвим кодом, або написати тест для поліпшення покриття тесту.
Одним із таких інструментів є NCover , з попередницею з відкритим кодом на Sourceforge . Ще одна альтернатива - PartCover .
Ознайомтеся з цією відповіддю на stackoverflow.
FXCop - аналізатор коду ... Це набагато більше, ніж пошук невикористаного коду. Я деякий час використовував FXCop, і настільки втратив його рекомендації, що я його видалив.
Я думаю, що NDepend виглядає як більш вірогідний кандидат.