Найти неиспользуемый код [закрыто]

208

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

Andre
источник
Я удивлен, что это помечено как не по теме, я нашел вопрос и ответы полезными через 11 лет после того, как вопрос был написан. предоставленная ссылка не по теме говорит, что "... программные средства, обычно используемые программистами; и ...", безусловно, актуальны для SO !.
Шелбыперейра

Ответы:

218

Да, ReSharper делает это. Щелкните правой кнопкой мыши по вашему решению и выберите «Поиск проблем с кодом». Одним из результатов является «Неиспользованные символы». Это покажет вам классы, методы и т. Д., Которые не используются.

Джаррет Мейер
источник
20
это круто. недостаточно людей знают об этом. Вы также должны включить анализ решений в широком масштабе, чтобы все отображалось.
mcintyre321
16
Resharper - отличный инструмент, но я нашел его ненадежным для этой задачи. У меня есть публичный метод, где я удалил все ссылки. Если я щелкну правой кнопкой мыши по методу и выберу Show Usages, их там нет, но проблемы с кодом в Resharper не указывают на то, что он не используется.
user890155
9
Мы используем внедрение зависимостей. В результате все выглядит привыкшим к резкости, потому что даже неиспользуемые типы все еще регистрируются с единицей.
Монтгомери "Монти" Джонс
11
@ user890155 Это потому, что метод является общедоступным, библиотека может использоваться другим приложением, отсутствующим в текущем решении. Я считаю, что только внутренние и частные методы будут помечены как проблемы с кодом, если они не используются.
Луказоид
3
@elggarc Что касается внедрения зависимостей, взгляните на плагин Agent Mulder, упомянутый здесь: 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

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

mmiika
источник
15

Как указал Джефф инструмент NDepend может помочь найти неиспользуемые методы, поля и типы.

Чтобы уточнить, NDepend предлагает написать Code Rule поверх 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.

Патрик из команды NDepend
источник
6

Я бы также упомянул, что использование МОК, иначе Unity, может ввести в заблуждение эти оценки. Возможно, я допустил ошибку, но некоторые очень важные классы, экземпляры которых создаются через Unity, похоже, не имеют экземпляров, насколько ReSharper может сказать. Если бы я следовал рекомендациям ReSharper, меня бы не стало!

Аллен Маршалл
источник
4

ReSharper отлично справляется с поиском неиспользуемого кода.

В VS IDE вы можете щелкнуть правой кнопкой мыши по определению и выбрать «Найти все ссылки», хотя это работает только на уровне решения.

Митч Пшеничный
источник
1

Правда заключается в том, что инструмент никогда не сможет дать вам 100% точный ответ, но инструмент покрытия может дать вам неплохой результат за деньги.

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

Одним из таких инструментов является NCover с предшественником с открытым исходным кодом на Sourceforge . Другой альтернативой является PartCover .

Проверьте этот ответ на stackoverflow.

Дэн
источник
1

Я сталкивался с AXTools CODESMART .. Попробуйте это один раз. Используйте анализатор кода в разделе обзоров. Он перечислит мертвые локальные и глобальные функции наряду с другими проблемами.

Рама
источник
0

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

Я думаю, что NDepend выглядит как более вероятный кандидат.


источник