Как ограничить запрос методов NDepend по атрибуту типа - PullRequest
7 голосов
/ 04 марта 2010

Я пытаюсь заставить NDepend идентифицировать длинные методы, используя модифицированную версию стандартного запроса «Слишком большие методы».

Я не хочу сообщать о длинных методах, над которыми разработчики имеют небольшой контроль, поэтому я отфильтровываю сгенерированный код, используя атрибут DebuggerNonUserCode и InitializeComponent().

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

Я ищу что-то вроде соединения между типами и методами: дайте мне все типы, у которых нет атрибута DebuggerNonUserCode, и выполните запрос к ним, но я не могу понять, как это выразить в CQL.

Для некоторых сборок я могу просто отфильтровать по полному имени, но, к сожалению, некоторые из наших сборок смешивают созданные разработчиком и сгенерированные типы. К сожалению, IsGeneratedByCompiler также не может использоваться в этом случае.

Мой запрос

WARN IF Count > 0 IN SELECT METHODS WHERE 
   NbLinesOfCode > 30 AND
   !HasAttribute "System.Diagnostics.DebuggerNonUserCodeAttribute" AND
   !NameIs "InitializeComponent()"
   ORDER BY NbLinesOfCode DESC

Ответы [ 2 ]

2 голосов
/ 05 марта 2010

Брайан, благодаря Правило кода через LINQ Query (CQLinq) Исходный код запрашиваемого правила кода:

warnif count > 0
from m in Application.Methods where
  m.NbLinesOfCode > 30 &&
 !m.ParentType.HasAttribute( "System.Diagnostics.DebuggerNonUserCodeAttribute") &&
  m.Name != "InitializeComponent()"
orderby m.NbLinesOfCode descending
select new { m, m.NbLinesOfCode }

Синтаксис CQLinq также предлагает способ определить, что такое Just-My-Code . Эта функция описана здесь . В основном вам нужно определить набор JustMyCode с помощью запросов с префиксом notmycode . Тогда запрошенное вами правило можно легко переписать:

warnif count > 0
from m in JustMyCode.Methods where
   m.NbLinesOfCode > 30
orderby m.NbLinesOfCode descending    
select new { m, m.NbLinesOfCode }

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

0 голосов
/ 04 марта 2010

Мне очень нравится NDepend, но это все еще самый большой недостаток, заключающийся в том, что пространство имен / тип / метод не может быть объединено в один запрос. Эта функция сделает CQL действительно мощным материалом.

Кроме того, могут быть полезны проверки ' IsGeneratedByCompiler ' и ' IsInFrameworkAssembly '. Вы также можете удалить определенные пространства имен из запроса ( OUT OF NAMESPACES "..." )

...