Domanda

Sto cercando di ottenere NDepend per identificare i metodi lunghi utilizzando una versione modificata della query standard "Metodi troppo grande".

Non voglio segnalare metodi lunghi che gli sviluppatori hanno poco controllo su, in modo da filtrare codice generato utilizzando l'attributo DebuggerNonUserCode e InitializeComponent().

Purtroppo, ho ancora ottenere un paio di falsi positivi come metodi di tipi generati sono segnalati pure. Il problema è che, mentre il tipo stesso ha l'attributo DebuggerNonUserCode, i metodi non, in modo che siano inclusi nell'output nonostante il fatto che essi sono generati.

Cerco qualcosa di simile a un join tra tipi e metodi: Dammi tutti i tipi che non hanno l'attributo DebuggerNonUserCode ed eseguire la query su quelli, ma io non riesco a capire come esprimere questo in CQL.

Per alcune delle assemblee, posso semplicemente filtro sul nome completo, ma purtroppo alcune delle nostre assemblee miscela di sviluppo realizzati e tipi generato. Purtroppo la IsGeneratedByCompiler non può essere utilizzato sia in questo caso.

La mia domanda

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

Soluzione

Brian, grazie a Codice Regna su LINQ Query (CQLinq) il codice sorgente della regola di codice che si sta chiedendo è:

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 }

La sintassi CQLinq offrono anche un modo per definire ciò che è Just-My-codice . Questa funzione è di descrivere qui . Fondamentalmente è necessario definire il set JustMyCode tramite query prefissato con notmycode . Quindi la regola che stai chiedendo può essere riscritta facilmente:

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

Il set di JustMyCode definito una volta per tutte può essere riutilizzato più di qualsiasi regola di codice. Additionaly si può guardare la notmycode di default interrogazione Scarta generato e metodi di design da JustMyCode

Altri suggerimenti

Mi piace molto NDepend, ma è ancora il più grande difetto unica che namespace / tipo / metodo di informazione non possono essere uniti in una singola query. Tale caratteristica renderebbe CQL roba davvero potente.

A parte che i controlli ' IsGeneratedByCompiler ' e ' IsInFrameworkAssembly ' può essere utile. È anche possibile rimozione alcuni spazi dei nomi dalla query ( OUT OF NAMESPACES "..." )

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top