2010-03-04 35 views
7

पर NDepend विधियों क्वेरी को प्रतिबंधित करने के लिए मैं मानक "विधि बहुत बड़ी" क्वेरी के संशोधित संस्करण का उपयोग करके लंबी विधियों की पहचान करने के लिए एनडॉन्पेन्स प्राप्त करने का प्रयास कर रहा हूं।टाइप विशेषता

मैं डेवलपर्स पर बहुत कम नियंत्रण की रिपोर्ट नहीं करना चाहता हूं, इसलिए मैं DebuggerNonUserCode विशेषता और InitializeComponent() का उपयोग करके जेनरेट कोड को फ़िल्टर करता हूं।

दुर्भाग्यवश, मुझे अभी भी कुछ झूठी सकारात्मक चीज़ें मिलती हैं क्योंकि जेनरेट किए गए प्रकारों में भी तरीके की सूचना दी जाती है। समस्या यह है कि जब इस प्रकार के पास DebuggerNonUserCode विशेषता है, तो विधियां नहीं होती हैं, इसलिए वे उत्पन्न होने के बावजूद उत्पादन में शामिल होते हैं।

मैं प्रकार और विधियों के बीच शामिल होने की तरह कुछ ढूंढ रहा हूं: मुझे उन सभी प्रकारों को दें जिनके पास DebuggerNonUserCode विशेषता नहीं है और उन पर क्वेरी चलाएं, लेकिन मैं यह नहीं समझ सकता कि इसे सीक्यूएल में कैसे व्यक्त किया जाए।

कुछ विधानसभाओं के लिए, मैं बस पूर्ण नाम पर फ़िल्टर कर सकता हूं, लेकिन दुर्भाग्य से हमारे कुछ असेंबली डेवलपर बनाये और जेनरेट किए गए प्रकारों को मिलाते हैं। दुर्भाग्यवश IsGeneratedByCompiler या तो इस मामले में उपयोग नहीं किया जा सकता है।

मेरे क्वेरी

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

मैं तरीकों में शामिल होने और जानकारी टाइप करने के लिए या तो एक तरह से और V3 की भी रिलीज नोट्स यह उल्लेख नहीं है नहीं पा सके देख सकते हैं। – Timores

+1

क्या आपने IsGeneratedByCompiler विधि विशेषता का प्रयास किया है? – Timores

+0

@ टिमोरस: बिल्कुल, मेरी इच्छा है कि मैं दोनों के बीच जुड़ सकूं। मैंने IsGeneratedByCompiler को नहीं देखा है। प्रलेखन से यह चाल नहीं लगता है। लेकिन मैं इसे एक शॉट दे दूंगा और सवाल अपडेट करूँगा। –

उत्तर

2

ब्रायन, धन्यवाद Code Rule over LINQ Query (CQLinq) करने के लिए कोड नियम आपके लिए पूछ रहे हैं के स्रोत कोड है:

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 वाक्यविन्यास भी परिभाषित करने का एक तरीका प्रदान करता है कि जस्ट-माई कोड क्या है। यह सुविधा here का वर्णन करती है। मूल रूप से आपको सेट JustMyCode को नोटिकोड के साथ उपसर्ग के साथ सेट को परिभाषित करने की आवश्यकता है। तो फिर नियम आपके लिए पूछ रहे हैं आसानी से फिर से लिखा जा सकता है:

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

सेट JustMyCode सभी के लिए एक बार में परिभाषित किया गया है किसी भी कोड नियम पर पुन: उपयोग किया जा सकता है। Additionaly आप notmycode डिफ़ॉल्ट क्वेरी Discard generated and designer Methods from JustMyCode

+0

प्रयास के लिए धन्यवाद। –

+0

यह बहुत बेहतर दिख रहा है, प्रयास के लिए धन्यवाद! – flq

0

मैं काफी NDepend की तरह, लेकिन यह अभी भी सबसे बड़ा कमी है कि नाम स्थान/प्रकार/विधि की जानकारी किसी एक क्वेरी में शामिल हो गए नहीं किया जा सकता है। वह सुविधा सीक्यूएल को वास्तव में शक्तिशाली सामान बनाती है।

अलावा कि चेक 'IsGeneratedByCompiler' और 'IsInFrameworkAssembly' मददगार हो सकता है। आप कर सकते हैं क्वेरी से भी पदच्युत कुछ नेमस्पेस (नामस्पेस का बाहर "...")

+0

यह निश्चित रूप से होगा!मुझे सुविधा के बाहर पता है, लेकिन दुर्भाग्य से प्रासंगिक असेंबली दोनों देव कोड बनाते हैं और उसी नामस्थान में कोड उत्पन्न करते हैं :( –

+0

flq, ब्रायन, ऊपर दिए गए मेरे उत्तर को देखें :) –

संबंधित मुद्दे