Question

Je suis en train de se NDepend d'identifier des méthodes longues en utilisant une version modifiée de la norme « Méthodes trop grand » requête.

Je ne veux pas signaler les méthodes longues que les développeurs ont peu de contrôle sur, donc je filtrer le code généré en utilisant l'attribut DebuggerNonUserCode et InitializeComponent().

Malheureusement, je reçois encore quelques faux positifs que les méthodes dans les types générés sont signalés aussi bien. Le problème est que si le type lui-même a l'attribut DebuggerNonUserCode, les méthodes ne sont pas, ils sont inclus dans la sortie en dépit du fait qu'ils sont générés.

Je cherche quelque chose comme une jointure entre les types et méthodes: Donnez-moi tous les types qui n'ont pas l'attribut DebuggerNonUserCode et exécuter la requête sur ceux-ci, mais je ne peux pas comprendre comment exprimer cela en CQL.

Pour certains des assemblées, je peux simplement filtrer le nom complet, mais malheureusement certains de nos ensembles développeur de mélange fait et les types générés. Malheureusement, le IsGeneratedByCompiler ne peut pas être utilisé dans ce cas.

Ma requête

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

La solution

Brian, grâce à code Domine sur requête LINQ (CQLinq) le code source de la règle de code que vous demandez est:

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 syntaxe CQLinq offre aussi une façon de définir ce qui est Just-My-code . Cette fonction est décrit . Fondamentalement, vous devez définir l'ensemble JustMyCode à travers des requêtes préfixées notmycode . Ensuite, la règle que vous demandez peut facilement être réécrite:

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

L'ensemble JustMyCode défini une fois pour toutes peuvent être réutilisés sur toute règle de code. Additionnellement vous pouvez regarder la valeur par défaut notmycode Jeter produit et méthodes de créateurs de JustMyCode

Autres conseils

Je aime bien NDepend, mais il est toujours la plus grande lacune unique d'information namespace / type / méthode ne peut pas être joint en une seule requête. Cette fonctionnalité serait CQL chose de vraiment puissant.

En dehors de cela les chèques ' IsGeneratedByCompiler ' et ' IsInFrameworkAssembly ' peuvent être utiles. Vous pouvez également décapant certains espaces de noms de la requête ( DE NAMESPACES "..." )

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top