Существует ли пользовательское правило FxCop, которое будет обнаруживать неиспользуемые методы PUBLIC? - PullRequest
9 голосов
/ 16 сентября 2008

Я только что попробовал FxCop. Он обнаруживает неиспользуемые приватные методы, но не неиспользуемые публичные. Могу ли я загрузить пользовательское правило, подключаемый модуль, который будет определять публичные методы, которые не вызываются из одной сборки?

Ответы [ 4 ]

15 голосов
/ 16 сентября 2008

Кори, мой ответ об использовании FxCop предполагал, что вы заинтересованы в удалении неиспользуемых частных участников, однако для решения проблемы в других случаях вы можете попробовать использовать NDepend . Вот некоторые CQL для обнаружения неиспользуемых открытых участников (адаптировано из статьи, указанной ниже):

// <Name>Potentially unused methods</Name>
WARN IF Count > 0 IN SELECT METHODS WHERE
 MethodCa == 0 AND            // Ca=0 -> No Afferent Coupling -> The method 
                              // is not used in the context of this
                              // application.

 IsPublic AND                 // Check for unused public methods

 !IsEntryPoint AND            // Main() method is not used by-design.

 !IsExplicitInterfaceImpl AND // The IL code never explicitely calls 
                              // explicit interface methods implementation.

 !IsClassConstructor AND      // The IL code never explicitely calls class
                              // constructors.

 !IsFinalizer                 // The IL code never explicitely calls
                              // finalizers.

Источник: Патрик Смаккья "Метрики кода в связях, мертвых кодах, недостатках проектирования и реинжиниринге . В статье также рассматривается обнаружение мертвых полей и типов.

(РЕДАКТИРОВАТЬ: сделал ответ более понятным)


РЕДАКТИРОВАТЬ 11 июня 2012 г .: Объяснить новые возможности NDepend, касающиеся неиспользуемого кода. Отказ от ответственности: я являюсь одним из разработчиков этого инструмента.

Начиная с выпуска NDepend v4 в мае 2012 года, инструмент предлагает написать Правило кода над LINQ Query (CQLinq) . Предлагается около 1021 * 200 кодовых правил по умолчанию , 3 из которых предназначены для неиспользуемый / мертвый код обнаружение:

Эти правила кода CQLinq более мощные, чем предыдущие правила CQL. Если вы нажмете эти 3 ссылки выше на исходный код этих правил, вы увидите, что те, которые касаются типов и методов, немного сложны. Это происходит потому, что они обнаруживают не только неиспользуемые типы и методы, но также типы и методы, используемые только неиспользованными мертвыми типами и методами (рекурсивные).

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

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

8 голосов
/ 16 сентября 2008

Если метод не используется и публичный FxCop предполагает, что вы сделали его общедоступным для доступа к внешним вещам.

Если неиспользуемые общедоступные методы приводят к написанию API-предупреждений FxCop и тому подобное, это будет проблемой - вы получите множество предупреждений FxCop для методов, которые вы собираетесь использовать другие.

Если вам не нужно ничего внешнего для доступа к вашей сборке / exe, рассмотрите замену public на internal. Ваше приложение будет работать так же, и FxCop сможет найти внутренние методы, на которые нет ссылок.

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

Любые методы, которые вы делаете внешне видимыми, также могут иметь модульные тесты.

3 голосов
/ 16 сентября 2008

NDepend ваш друг для такого рода вещей

1 голос
/ 16 сентября 2008

Как узнать, что публичные методы не используются?

Помечая метод как общедоступный, он может быть доступен любому приложению, которое ссылается на вашу библиотеку.

...