Comment limiter les méthodes NDepend requête sur l'attribut de type
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
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 "..." )