2010-03-04 18 views
7

NDepend, standart "Yöntem çok büyük" sorgusunun değiştirilmiş bir sürümünü kullanarak uzun yöntemleri tanımlamak için çalışıyorum.Tip özniteliğinde NDepend yöntemleri sorgusu nasıl kısıtlanır

Geliştiricilerin az kontrol sahibi olduğu uzun yöntemleri bildirmek istemiyorum, bu yüzden DebuggerNonUserCode özniteliğini ve InitializeComponent() kullanarak oluşturulan kodu filtreleyeceğim.

Maalesef, oluşturulan türlerde de yöntemler bildirildiğinden hala yanlış pozitifler elde ediyorum. Sorun, türün kendisi DebuggerNonUserCode özniteliğine sahipken, yöntemlerin üretmemesidir, bu nedenle üretildikleri gerçeğine rağmen çıktıya dahil edilirler.

Türler ve yöntemler arasında birleştirme gibi bir şey arıyorum: DebuggerNonUserCode özniteliğine sahip olmayan tüm türleri verin ve bu sorguyu çalıştırın, ancak bunu CQL'de nasıl ifade edeceğimi anlayamıyorum.

Bazı derlemeler için, tam adı filtreleyebilirim, ancak ne yazık ki, derlemelerimizden bazıları geliştirici ve oluşturulmuş türleri karıştırıyor. Ne yazık ki bu durumda IsGeneratedByCompiler kullanılamaz.

Benim sorgu

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

Ben bu söz etmeyin bilgi yöntemlerini katılıp yazmak için bir yol ve V3 hatta sürüm notlarını ya bulamadık bakabilirsiniz. – Timores

+1

IsGeneratedByCompiler yöntem özniteliğini denediniz mi? – Timores

+0

@Timores: Tam olarak, ikisi arasında bir birleşme yapabilseydim. IsGeneratedByCompiler'a bakmadım. Belgelerden hile yapmak gibi görünmüyor. ama yine de bir şans vereceğim ve sorunu güncelleyeceğim. –

cevap

2

Brian, teşekkür Code Rule over LINQ Query (CQLinq) Sizin için soruyorsunuz kod kuralının kaynak kodu olan:

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 } 

CQLinq sözdizimi, Just-My-Code'un ne olduğunu tanımlamanın bir yolunu da sunar. Bu özellik here'u açıklar. Temel olarak JustMyCode setini notmycode ile önceden ayarlanmış sorguları tanımlamanız gerekir. Sonra için soruyorsunuz kural kolayca yazılabilir:

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

herhangi bir kod kuralından yeniden kullanılabilir herkes için bir kez tanımlanmış JustMyCodeayarlayın. Ek olarak size notmycode varsayılan sorgusu Discard generated and designer Methods from JustMyCode

+0

Çaba için teşekkürler. –

+0

Bu çok daha iyi görünüyor, çaba için teşekkürler! – flq

0

Oldukça NDepend gibi, ama yine de ad/türü/yöntem bilgisi tek sorguya katılmış edilemeyeceğini büyük tek eksiklik bu. Bu özellik CQL'i gerçekten güçlü şeyler yapar.

dışında kontrolleri‖ IsGeneratedByCompiler 've 'IsInFrameworkAssembly' yararlı olabileceğini gelen. yapabilirsiniz sorgudan da sökücü belli ad (ad alanlarının ÇIKIŞ "...")

+0

Kesinlikle öyle!ÇIKIŞIN özelliği farkındayım, ama maalesef ilgili meclisler dev yaptıklarını kodlamak ve aynı isim alanında kod üretmek :( –

+0

flq, Brian, yukarıdaki cevaba bakın :) –