2010-11-19 14 views
5

मैं वर्तमान में एक विश्वविद्यालय परियोजना के लिए सी # में एक छोटा एआई ढांचा (आनुवांशिक एल्गोरिदम/तंत्रिका नेटवर्क) विकसित कर रहा हूं।आप .NET में एल्गोरिदमिक कोड में कैसे जोर देते हैं?

मेरी पहली चिंता एक पुन: प्रयोज्य ढांचे का विकास कर रही है, इसलिए मैं सबकुछ सुंदर मॉड्यूलर बनाने के लिए डिजाइन कर रहा हूं। मुझे पता है कि मैं इस (प्रदर्शन) के लिए कीमत चुका रहा हूं, लेकिन मुझे लगता है कि इसके साथ हारने के लिए मुझे और अधिक लाभ होता है (कोड को दो बार खोने की अपेक्षा धीमी गति से दो बार खोना मुश्किल है, बाद में असंभव खोजने की कोशिश कर रहा है कोडों के एक मोनोलिथिक ब्लॉक में पेश करने के लिए कठिन हैं जो नई चीजों को जोड़ने की कोशिश कर रहे बग और कई समय खोना)।

मैं मूल रूप से अपने कोड, दावे के विभिन्न हिस्सों पर बहुत से चेक देखना चाहता हूं। जांचें कि क्या चल रहा है XI वास्तव में सही स्थिति में है, आदि। विकास के दौरान उन तरह के दावे उपयोगी होते हैं, लेकिन मैं उन्हें रिलीज कोड से दूर रहना चाहता हूं (यानी, जब मैं फैसला करता हूं कि मैं छोड़ना चाहता हूं यह मेरे अंतिम शोध परिणामों को पाने के लिए रात के लिए काम कर रहा है)।

  1. तरीकों में से System.Diagonists.Assert परिवार:

    मैं इस को पूरा करने के कई तरीके देख सकते हैं।

  2. कोड संविदा
  3. होने अगर (x) तो InvalidStateException() #if डीबग से घिरा हुआ फेंक/

आप इसे कैसे करना होगा और क्यों #endif?

मैं यूनिट-टेस्ट (मैं उनका उपयोग कर रहा हूं) के बारे में भी जानता हूं, लेकिन मैं भी कोड पर कुछ प्रकार के दावे करना चाहूंगा।

उत्तर

8

आप इस प्रकार का स्थिर विधि इस्तेमाल कर सकते हैं:

[Conditional("DEBUG")] 
public static void Assert(bool condition, string message) 
{ 
    if (!condition) 
     throw new InvalidStateException("Assertion failed: " + message); 
} 

और इसलिए की तरह जोर, विधि यह सोचते हैं एक वर्ग Util कहा जाता है में परिभाषित किया गया है: इस विधि को

Util.Assert(a == b, "a == b"); 

कॉल केवल हो जाएगा जब डीबीयूजीजी प्रतीक सेट होता है तो संकलक द्वारा उत्सर्जित, सशर्त एट्रिब्यूट के लिए धन्यवाद। इसलिए आपको ऐसी कॉल को किसी भी #if निर्देशों में लपेटने की आवश्यकता नहीं है। इससे कम कोड अव्यवस्था हो जाएगी।

, (ध्यान दें कि विधि ही अभी भी संकलित किया जाएगा। यह आपको विभिन्न विधानसभाओं में इस तरह के तरीकों का उपयोग करने के लिए अनुमति देता है!)

+1

कोड संविदाएं समान तरीके से काम नहीं करती हैं? मुझे यह विचार था कि आप उन्हें रिलीज मोड, या ऐसा कुछ में पूरी तरह से बंद कर सकते हैं। –

+0

शायद। ईमानदारी से मैं इससे परिचित नहीं हूँ। मेरे उत्तर में तकनीक वह है जिसका मैं उपयोग करता हूं, इसलिए मैंने सोचा कि मैं इसे साझा करूंगा। मैं यह नहीं कह सकता कि यह कोड अनुबंध से बेहतर या बदतर है। – cdhowie

+0

मैं cdhowie कहता हूं के साथ जाना होगा। कोड अनुबंध एक बहुत अधिक प्रदान करता है लेकिन शायद आपके मामले में आपको जो चाहिए वह नहीं। तो मुझे लगता है कि सही उपकरण इनलाइन # if, # else या Debug.Asset() को आपके कोड इनलाइन को अव्यवस्थित करने के बजाय सशर्त विशेषता के साथ सजाए गए तरीकों का उपयोग कर रहा है। –

0

#if/#endif का लाभ यह है कि सफाया ज़ोर कार्य करने के लिए कॉल न केवल है लेकिन इसके सभी पैरामीटर तैयार करने के सभी काम भी (जो उम्मीद है कि साइड इफेक्ट्स नहीं हैं ...)।

+2

'[सशर्त (...)]' के साथ ही। – cdhowie

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