2010-12-15 14 views
17

मेरे सिर के ऊपर बंद, मैं अशक्त तर्क के लिए जाँच करने के लिए 4 तरीके के बारे में सोच सकते हैं:पूर्व शर्त परीक्षण के लिए विभिन्न तरीकों के पेशेवर/विपक्ष?

Debug.Assert(context != null); 
Contract.Assert(context != null); 
Contract.Requires(context != null); 
if (context == null) throw new ArgumentNullException("context"); 

मैं हमेशा पिछले पद्धति का उपयोग किया है, लेकिन मैं सिर्फ एक कोड का टुकड़ा है कि Contract.Requires इस्तेमाल किया, देखा जो मैं मैं अपरिचित हूँ। प्रत्येक विधि के फायदे/नुकसान क्या हैं? क्या अन्य तरीके हैं?


VS2010 डब्ल्यू/Resharper में,

  • Contract.Assert मुझे चेतावनी दी है कि अभिव्यक्ति हमेशा सच है (यह कैसे जानता है, मैं काफी यकीन नहीं है ... नहीं HttpContext अशक्त हो सकता है?),
  • Contract.Requires बाहर फीका हो जाता है और यह मुझसे कहता है संकलक विधि (मैं पूर्व कारण की वजह से मान, यह शून्य कभी नहीं होगा) आह्वान नहीं होगा, और
  • अगर मैं सब context != null करने के लिए पिछले पद्धति को बदलने कोड follo विंग फीका हो जाता है और यह मुझे बताता है कि कोड हेरिस्टिक रूप से पहुंच योग्य नहीं है।

तो ऐसा लगता है कि पिछले 3 तरीकों में वीएस स्थिर जांचकर्ता में निर्मित कुछ प्रकार की खुफिया जानकारी है, और Debug.Assert बस गूंगा है।

+0

प्रश्न स्पष्ट नहीं है। क्या आप वास्तव में एक बार में उन सभी का उपयोग करने की कोशिश कर रहे हैं? –

+0

@ मैथ्यू: सुनिश्चित नहीं है कि यह स्पष्ट नहीं है ... नहीं, मैं उन्हें एक साथ उपयोग करने की कोशिश नहीं कर रहा हूं। मैंने कोड कोड स्निपेट किया है जैसे कि आप अलग-अलग तरीकों को चित्रित करने के लिए बस नल की जांच कर सकते हैं। – mpen

+0

मैंने बाकी प्रश्नों से यही सोचा, लेकिन आपके द्वारा उपयोग की जाने वाली वाक्यविन्यास प्रस्तुति अजीब थी। –

उत्तर

12

मेरा अनुमान है एक अनुबंध इंटरफ़ेस IHttpHandler.ProcessRequest के लिए आवेदन किया है जो इस संदर्भ! = बातिल की आवश्यकता है कि वहाँ है। इंटरफ़ेस अनुबंध उनके कार्यान्वयनकर्ताओं द्वारा विरासत में प्राप्त होते हैं, इसलिए आपको आवश्यकता को दोहराने की आवश्यकता नहीं है। वास्तव में, आपको अतिरिक्त आवश्यकता विवरण जोड़ने की अनुमति नहीं है, क्योंकि आप इंटरफ़ेस अनुबंध से जुड़ी आवश्यकताओं तक ही सीमित हैं।

मुझे लगता है कि यह बनाम बस एक अशक्त जांच प्रदर्शन कर एक संविदात्मक दायित्व को निर्दिष्ट के बीच एक अंतर बनाने के लिए महत्वपूर्ण है। आप डेवलपर को सूचित करने के तरीके के रूप में एक नाल चेक लागू कर सकते हैं और रनटाइम पर अपवाद फेंक सकते हैं कि वे आपके एपीआई का सही इस्तेमाल कर रहे हैं। दूसरी ओर, एक अनुबंध अभिव्यक्ति वास्तव में मेटाडेटा का एक रूप है, जिसे अनुबंध पुनर्लेखक (रनटाइम अपवादों को मैन्युअल रूप से लागू करने के लिए) द्वारा व्याख्या किया जा सकता है, लेकिन स्थिर विश्लेषक द्वारा भी, जो उन्हें कारणों से उपयोग कर सकते हैं आपके आवेदन की स्थिर शुद्धता के बारे में।

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


पर विस्तार करने के लिए क्या टिप्पणीकर्ताओं कहा है, जोर के बीच का अंतर, मान लें और आवश्यक है:

  • एक Contract.Assert अभिव्यक्ति अनुबंध rewriter और स्थिर विश्लेषक द्वारा एक अभिकथन में तब्दील हो जाता अपने मौजूदा साक्ष्य के आधार पर अभिव्यक्ति को साबित करने का प्रयास करता है। यदि यह सिद्ध नहीं किया जा सकता है, तो आपको एक स्थिर विश्लेषण चेतावनी मिल जाएगी।
  • एक Contract.Assume अभिव्यक्ति अनुबंध rewriter द्वारा नजरअंदाज कर दिया है (मैं जानता हूँ कि जहाँ तक), लेकिन सबूत यह अपने स्थिर विश्लेषण में ध्यान में ले जा सकते हैं की एक नई टुकड़े के रूप में स्थिर विश्लेषक द्वारा व्याख्या की है। अनुबंध।मान लें कि स्थिर विश्लेषण में 'अंतर को भरने' के लिए प्रयोग किया जाता है, या तो जहां आवश्यक परिस्थितियों को बनाने के लिए परिष्कार की कमी होती है या जब अनुबंध के साथ सजाए गए कोड के साथ इंटर-ऑपरेटिंग नहीं होती है, तो आप उदाहरण के लिए मान सकते हैं कि एक विशेष फ़ंक्शन कॉल एक गैर-शून्य परिणाम देता है।
  • अनुबंध। आवश्यकताएं ऐसी स्थितियां हैं जो आपकी विधि कहने पर हमेशा सत्य रहनी चाहिए। वे विधि के पैरामीटर पर बाधाएं हो सकती हैं (जो सबसे आम हैं) और वे ऑब्जेक्ट के सार्वजनिक रूप से दिखाई देने वाले राज्यों पर भी बाधाएं हो सकती हैं (उदाहरण के लिए, यदि प्रारंभिक सत्य है तो आप केवल विधि को कॉल करने की अनुमति दे सकते हैं।) बाधाओं के कारण आपकी कक्षा के उपयोगकर्ताओं को या तो ऑब्जेक्ट का उपयोग करते समय प्रारंभ किया गया है (और संभावित रूप से त्रुटि को उचित तरीके से संभाल लें) या स्पष्ट करने के लिए अपनी बाधाओं और/या कक्षा आविष्कारों को स्पष्ट करें कि प्रारंभिकरण वास्तव में हुआ है।
+0

तो ... फिर 'Contract.Assert' और 'Contract.Requires' के बीच क्या अंतर है? – mpen

+2

@ राल्फ: 'अनुबंध। आवश्यक' चीजों को इंगित करता है जो विधि कहने पर सत्य होना चाहिए, 'अनुबंध। एस्र्टर्ट' मध्यवर्ती राज्यों की जांच के लिए आपकी विधि के बीच में जाना चाहिए। सही जगहों पर 'Contract.Assert' जोड़ना स्थिर विश्लेषक को आपके कोड को सही साबित करने में सहायता कर सकता है अगर यह इसे स्वयं प्रबंधित नहीं कर सकता है। –

+3

असल में, स्थिर जांचकर्ता केवल अनुबंध से प्राप्त होगा। एसम्यूम। यह विधि अनुबंध की तरह व्यवहार करती है। रनटाइम पर प्रवेश करें, लेकिन स्थिर जांचकर्ता को यह कोशिश करने और सांख्यिकीय रूप से साबित करने के लिए कहता है। – koenmetsu

2

पहली विधि एक शून्य स्थिति के परीक्षण के लिए उपयुक्त है जो कभी अस्तित्व में नहीं होनी चाहिए। यही है, यह सुनिश्चित करने के लिए विकास के दौरान इसका उपयोग करें कि यह अप्रत्याशित रूप से शून्य पर सेट नहीं होता है। चूंकि यह कोई त्रुटि प्रबंधन नहीं करता है, इसलिए यह आपके जारी उत्पाद में शून्य शर्तों को संभालने के लिए उपयुक्त नहीं है।

मैं कहूंगा कि दूसरे और तीसरे संस्करण समान हैं कि वे किसी भी तरह से इस मुद्दे को संभाल नहीं पाते हैं।

सामान्य रूप से, यदि कोई संभावना है कि चर अंतिम उत्पाद में वास्तव में शून्य हो सकता है, तो अंतिम संस्करण उपयोग करने वाला एक है। आप वहां विशेष हैंडलिंग कर सकते हैं, या आपके द्वारा किए गए अपवाद को बढ़ा सकते हैं।

+1

दरअसल, दूसरी और तीसरी विधियां संकलन-समय पर उन्हें सही साबित करने और साबित करने के लिए स्थिर विश्लेषण का उपयोग करती हैं। –

+0

@Anon: लेकिन स्थिर विश्लेषक संकलन समय पर सभी शून्य अपवादों को पकड़ने में सक्षम नहीं होगा ... अगर कोई फिसल जाता है तो क्या होता है? क्या यह अपवाद, दुर्घटना, कुछ भी नहीं करता या क्या करता है? – mpen

+1

@ राल्फ: यदि स्थैतिक विश्लेषक कुछ भी साबित नहीं कर सकता है (यह नहीं दिखा सकता कि अनुबंध कुछ मामलों में विफल हो जाएगा, लेकिन यह साबित नहीं कर सकता कि यह हमेशा सही है) यह एक संकलन चेतावनी दिखाएगा (एक नहीं त्रुटि) और इसे एक दावे के साथ प्रतिस्थापित करें। –

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