Como restringir os métodos de NDepender, consulta no atributo de tipo
Pergunta
Estou tentando obter o NDepend para identificar métodos longos usando uma versão modificada da consulta "Métodos muito grandes" padrão.
Não quero relatar métodos longos que os desenvolvedores têm pouco controle, então filtro o código gerado usando o DebuggerNonUserCode
atributo e InitializeComponent()
.
Infelizmente, ainda recebo alguns falsos positivos, pois métodos em tipos gerados também são relatados. O problema é que, embora o tipo em si tenha o próprio DebuggerNonUserCode
atributo, os métodos não, portanto, eles são incluídos na saída, apesar do fato de serem gerados.
Estou procurando algo como uma junção entre tipos e métodos: me dê todos os tipos que não têm o DebuggerNonUserCode
Atribua e execute a consulta sobre isso, mas não consigo descobrir como expressar isso no CQL.
Para alguns dos assemblies, posso simplesmente filtrar o nome completo, mas infelizmente alguns de nossos assemblies misturam tipos criados e gerados. Infelizmente, o IsGeneratedByCompiler
Não pode ser usado neste caso.
Minha consulta
WARN IF Count > 0 IN SELECT METHODS WHERE
NbLinesOfCode > 30 AND
!HasAttribute "System.Diagnostics.DebuggerNonUserCodeAttribute" AND
!NameIs "InitializeComponent()"
ORDER BY NbLinesOfCode DESC
Solução
Brian, obrigado a Regra de código sobre a consulta LINQ (CQLINQ) O código -fonte da regra do código que você está pedindo é:
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 }
A sintaxe cqlinq também oferece uma maneira de definir o que é Just My-Code. Este recurso é descrito aqui. Basicamente, você precisa definir o conjunto Justmycode através de consultas prefixadas com NotMycode. Então a regra que você está pedindo pode ser reescrita facilmente:
warnif count > 0
from m in JustMyCode.Methods where
m.NbLinesOfCode > 30
orderby m.NbLinesOfCode descending
select new { m, m.NbLinesOfCode }
O conjunto Justmycode Definido uma vez para todos, pode ser reutilizado sobre qualquer regra de código. Adicional você pode olhar para o NotMycode Consulta padrão Descarte métodos gerados e designers de justmycode
Outras dicas
Eu gosto bastante do NDepend, mas ainda é a maior falha única que as informações de namespace/tipo/método não podem ser unidas em uma única consulta. Esse recurso tornaria o CQL coisas realmente poderosas.
Além disso, os cheques 'IsGeneratedByCompiler' e 'IsInframeworkassembly'Pode ser útil. Você também pode remover certos namespaces da consulta (Fora de namespaces "...")