У меня есть некоторый унаследованный код который имеет тенденцию передавать объекты как интерфейсы (например, IFoo), а затем в произвольных местах кода самопроизвольно приводить их к конкретным реализациям этих интерфейсов (скажем, MyConcreteFoo).
Вот глупый пример:
public bool IsThisFooScaredOfMonkeys(IFoo foo)
{
if (foo is MyConcreteFoo)
{
return ((MyConcreteFoo)foo).BelievesMonkeysAreEvil;
}
return false;
}
То, что я хотел бы сделать, - это написать CQL-запрос NDepend, чтобы подобрать эти типы приведений и дать мне счетчик для метода, или для типа, или чего-либо еще. Просто кое-что, чтобы я знал, где я могу начать сосредотачивать свои усилия на избавлении от этой специфической глупости, а не на том, чтобы отправлять свою команду в разброс кода по случайной охоте на броски ...
Кто-нибудь знает, есть ли способ сделать это? Я предполагаю, что нет (не может быть слишком много людей, которым нужна эта конкретная функциональность), но я решил сначала спросить здесь ...: -)
Конечно, есть какие-то другие идеи о том, как Охота на актеров быстрее будет одинаково оценена.
Это было бы очень хорошо, но NDepend ограничен набором сущностей, который не охватывает отдельные операторы.
Несмотря на это ограничение, NDepend по-прежнему великолепен! Возможно, это следующая функция версии.
Теперь Патрик Смакчиа мог бы сказать мне другое, поэтому я бы связался с ним по этому вопросу. Я ожидаю, что получу ответ быстро, так как он довольно хорошо разбирается в вещах.
Если вы используете ReSharper 5.0, в нем есть структурный поиск, который позволит вам находить подобные заявления. Вам придется построить поиск самостоятельно, но это довольно мощный инструмент.
Этот шаблон соответствует приведенному выше примеру:
if($fooObject$ is $concreteFoo$)
{
return (($concreteFoo$)$fooObject$).$anyIdentifier$;
}