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
Foi útil?

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 "...")

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top