Pregunta

Estoy intentando que NDepend identifique métodos largos utilizando una versión modificada de la consulta estándar "Métodos demasiado grandes".

No quiero informar sobre métodos largos sobre los que los desarrolladores tienen poco control, así que filtro el código generado usando el DebuggerNonUserCode atributo y InitializeComponent().

Desafortunadamente, todavía obtengo algunos falsos positivos ya que también se informan los métodos en los tipos generados.El problema es que si bien el tipo en sí tiene la DebuggerNonUserCode atributo, los métodos no, por lo que se incluyen en la salida a pesar de que se generan.

Estoy buscando algo así como una unión entre tipos y métodos:Dame todos los tipos que no tienen el DebuggerNonUserCode atributo y ejecutar la consulta sobre ellos, pero no puedo entender cómo expresar esto en CQL.

Para algunos de los ensamblados, puedo simplemente filtrar por el nombre completo, pero desafortunadamente algunos de nuestros ensamblados combinan tipos creados y generados por desarrolladores.Desafortunadamente, el IsGeneratedByCompiler Tampoco se puede utilizar en este caso.

mi consulta

WARN IF Count > 0 IN SELECT METHODS WHERE 
   NbLinesOfCode > 30 AND
   !HasAttribute "System.Diagnostics.DebuggerNonUserCodeAttribute" AND
   !NameIs "InitializeComponent()"
   ORDER BY NbLinesOfCode DESC
¿Fue útil?

Solución

Brian, gracias a regla de código sobre LINQ consulta (CQLinq) el código fuente de la regla de código que está pidiendo es:

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 sintaxis CQLinq también ofrecen una manera de definir lo que es Just-Mi-Code . Esta característica es describir aquí . Básicamente es necesario definir el conjunto JustMyCode a través de consultas con el prefijo notmycode . A continuación, la regla está solicitando se puede reescribir fácilmente:

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

El conjunto JustMyCode se define una vez por todas pueden ser reutilizados por encima de cualquier regla de código. Adicionalmente se puede ver en la notmycode Descartar generado y métodos de diseño de JustMyCode

Otros consejos

Me gusta bastante NDepend, pero aún así es el defecto más grande que un solo espacio de nombres info / tipo / método no se pueden unir en una sola consulta. Esa característica haría CQL cosas muy poderosa.

Además de que los controles ' IsGeneratedByCompiler ' y ' IsInFrameworkAssembly ' pueden ser útiles. También puede removedor de ciertos espacios de nombres de la consulta ( A PARTIR NAMESPACES "..." )

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top