Могу ли я использовать NDepend для подсчета бросков? - PullRequest
8 голосов
/ 26 августа 2010

У меня есть некоторый унаследованный код, который имеет тенденцию передавать объекты как интерфейсы (например, IFoo), а затем в произвольных местах кода самопроизвольно приводить их к конкретным реализациям этих интерфейсов (скажем, MyConcreteFoo).

Вот глупый пример:

public bool IsThisFooScaredOfMonkeys(IFoo foo)
{
    if (foo is MyConcreteFoo)
    {
        return ((MyConcreteFoo)foo).BelievesMonkeysAreEvil;
    }
    return false;
}

Что я хотел бы сделать, так это написать CQL-запрос NDepend, чтобы подобрать такие типы приведения и дать мне счетчик за метод, за тип или за что-нибудь еще. Просто кое-что, что я знаю, где я могу начать сосредотачивать свои усилия на избавлении от этой конкретной марки глупости, вместо того, чтобы посылать мою команду, разбирающуюся в коде на случайной охоте на броски ...

Кто-нибудь знает, есть ли способ сделать это? Я предполагаю, что нет (не может быть слишком много людей, которым нужна эта конкретная функциональность), но я решил сначала спросить здесь ...: -)

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

1 Ответ

2 голосов
/ 26 августа 2010

Это было бы очень хорошо, но NDepend ограничено набором сущностей, которые не охватывают отдельные операторы.

NDepend Entities

  1. Методы
  2. Поля
  3. Типы
  4. Пространства имен
  5. Сборки

Несмотря на это ограничение, NDepend все еще довольно хорош!Возможно, это функция следующей версии.

Теперь Патрик Смаккья мог бы сказать мне другое, поэтому я связался бы с ним по этому вопросу.Я ожидал бы получить ответ быстро, так как он очень хорош.

На стороне Примечание:

Если вы используете ReSharper 5.0 , он имеет Структурный поиск , который позволил бы вам находить подобные утверждения.Вам нужно было бы создать поиск самостоятельно, но это довольно мощный инструмент.

Этот шаблон будет соответствовать приведенному выше примеру:

if($fooObject$ is $concreteFoo$)
{
    return (($concreteFoo$)$fooObject$).$anyIdentifier$;
}
...