2013-02-20 112 views
17

मैं सोच रहा हूँ कि क्या मैं अपवाद फेंक या फोन Contract.Requires<TException>अपवाद बनाम अनुबंध को फेंकना। <T> की आवश्यकता है?

उदाहरण के लिए चाहिए:

public static void Function(String str) 
{ 
    if (str == null) throw new ArgumentNullException("str", "Input string cannot be null."); 

    // ... 
} 

बनाम

public static void Function(String str) 
{ 
    Contract.Requires<ArgumentNullException>(str != null, "Input string cannot be null."); 

    // ... 
} 

Contract.Requires<TException> के बाद से CONTRACTS_FULL प्रतीक मैं इसे में रख सकते हैं की आवश्यकता नहीं है मेरी रिलीज भी बनाता है।

कोन:

यह मेरा विचार है आप कस्टम अपवाद प्रकार निर्माता की एक ओवरलोड संस्करण फोन नहीं कर सकते हैं। कन्स्ट्रक्टर को अतिरिक्त पैरामीटर पास करने का कोई तरीका नहीं है।

प्रो: स्टेटिक उपकरण समर्थन (उदाहरण के लिए अनुबंध उल्लंघन के कॉलर को सूचित करें)।

मुझे किस का उपयोग करना चाहिए, और किस तरह की स्थिति के लिए?

+0

अपवाद प्रकार के रचनाकारों को अधिभारित करने के लिए क्या लाभ होगा? –

+3

@ पीटररची मैं उसी कारण के लिए मानता हूं जो रचनाकार मौजूद हैं। मुझे लगता है क्योंकि यह अधिक डेटा/जानकारी प्रदान करता है। – MasterMastic

+1

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

उत्तर

7

कोडकंट्रैक्ट उपयोगकर्ता मार्गदर्शिका में दस्तावेज़ के रूप में if-then-throw और Requires<TException> के बीच मूल व्यापार-बंद यह है कि आप अपनी रिलीज बिट्स के साथ कैसे निर्माण करते हैं।

केस 1: आप केवल if-then-throw, Requires<TException> का उपयोग करते हैं। इस मामले में आप अपने डीएल/एक्सई पर अनुबंध उपकरण चलाने के बिना अपनी रिलीज बिट्स बना सकते हैं। लाभ यह है कि आपके पास तेजी से निर्माण होता है और कोई जोखिम नहीं है कि टूल बग पेश करता है। दूसरा फायदा यह है कि टीम के सदस्य कोडकंट्रैक्ट टूल्स का उपयोग करने से बाहर निकल सकते हैं। नुकसान यह है कि आपको आवश्यकता की कोई अनुबंध विरासत नहीं मिलती है, और आपके अनुबंध उपकरण के लिए जरूरी नहीं हैं (जब तक आप EndContract का उपयोग नहीं करते)। आप असेंबली मोड का उपयोग कर इस मामले को निर्दिष्ट करते हैं: कस्टम पैरामीटर सत्यापन

केस 2: आप हमेशा अपने रिलीज बिट्स पर कोडकंट्रैक्ट टूल चलाने का निर्णय लेते हैं। यह आपको Requires<TException> का उपयोग करने देता है और आपको इंटरफेस आदि के साधन सहित अनुबंधों की विरासत मिलती है। आपके अनुबंध स्वच्छ और उपकरण पहचानने योग्य हैं। नुकसान यह है कि आपके कोड बनाने वाले प्रत्येक व्यक्ति को कोडकंट्रैक्ट टूल्स इंस्टॉल होना चाहिए। आप इस मामले को असेंबली मोड का उपयोग करके निर्दिष्ट करते हैं: अनुबंध संपत्ति फलक में मानक।

इस स्पष्ट चीजों को आशा दें।

+0

वीएस2017 का उपयोग करते हुए, कोडकंट्रैक्ट टूल्स पर काम करने के लिए एक हैक है [क्या वीएस2017 कोडकंट्रैक्ट्स के साथ काम करता है?] (// stackoverflow.com/q/40767941) –

2

मैं दो कारण मैं ठेके पसंद करते हैं ...

1) कोड, बहुत neater है के रूप में आप लिख रहे हैं यकीन है कि वहाँ दो दृष्टिकोण के बीच किसी भी पृथ्वी-टूट मतभेद हैं कि नहीं कर रहा हूँ, लेकिन यहाँ कर रहे हैं विधि के शीर्ष पर एक बयान जो धारणाओं को दिखाता है जिस पर विधि आधारित है। धारणा का उल्लंघन होने पर क्या होता है इसके कार्यान्वयन के साथ आप कोड को क्लोज नहीं करते हैं।

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

कोड संकलित और चलने के बाद, मुझे नहीं लगता कि कोई महत्वपूर्ण अंतर है।

उम्मीद है कि इससे मदद मिलती है।

+1

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

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

  • कोई संबंधित समस्या नहीं^_^