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

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

9 ответов

Решение

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

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

На ум приходит один отличный инструмент:

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

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

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

Как указал Джефф, инструмент 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 ссылки выше на исходный код этих правил, вы увидите, что те, которые касаются типов и методов, немного сложны. Это потому, что они обнаруживают не только неиспользуемые типы и методы, но также типы и методы, используемые только неиспользуемыми мертвыми типами и методами (рекурсивные).

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

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

Отказ от ответственности: я работаю на NDepend.

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

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

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

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

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

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

Проверьте этот ответ на stack overflow.

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

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

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

Другие вопросы по тегам