2011-08-13 8 views
17

मैं कोड अनुबंधों का उपयोग शुरू कर रहा हूं, और अनुबंध के दौरान। आवश्यकताएं काफी आगे हैं, मुझे यह देखने में परेशानी हो रही है कि वास्तव में क्या सुनिश्चित करता है।अनुबंध कैसे करता है। सुनिश्चित करता है?

मैं इस तरह एक सरल विधि बनाने की कोशिश की है:

static void Main() 
{ 
    DoSomething(); 
} 

private static void DoSomething() 
{ 
    Contract.Ensures(false, "wrong"); 
    Console.WriteLine("Something"); 
} 

मैं देख रहा हूँ संदेश "गलत" यद्यपि कभी नहीं, न ही यह अपवाद या कुछ और फेंक देता है।

तो वास्तव में यह क्या करता है?

+1

मैंने आपको उदाहरण शुरू किया और एक अनचाहे अपवाद मिला 'अनुबंध अपवाद' "पोस्टकंडिशन विफल: गलत गलत" कंसोल के लिए कुछ लिखने के बाद। ऐसा लगता है कि यह अच्छा काम करता है। –

+0

स्थैतिक समर्थक कोड अनुबंधों के पीछे वास्तविक मूल्य है, हालांकि यह विशेष रूप से सुनिश्चित करता है कि स्थिति काफी विषम है, विश्लेषणात्मक रूप से बोल रही है। यह लगभग एक व्यक्ति को "यह कथन गलत है" की सत्य साबित करने के लिए कहने के बराबर है। –

+2

झूठा हिस्सा केवल यह सुनिश्चित करने के लिए था कि यह ट्रिगर किया गया था :-) – Steffen

उत्तर

20

कुछ भी फेंकने के लिए यह अजीब बात नहीं है - यदि यदि आप उपयुक्त सेटिंग्स के साथ पुनःलेखक उपकरण चला रहे हैं। मेरा अनुमान है कि आप एक ऐसे मोड में चल रहे हैं जो पोस्टकंडिशन की जांच नहीं करता है।

भ्रामक बात के बारे में Contract.Ensures कि आप यह विधि के शुरू में लिखने है, लेकिन यह विधि के अंत में निष्पादित करता है। पुनरावर्तक यह सुनिश्चित करने के लिए सभी जादू करता है कि यह उचित रूप से निष्पादित करता है, और यदि आवश्यक हो तो वापसी मूल्य दिया जाता है।

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


संपादित करें: मुझे लगता है मैं अभी तक बिंदु Contact.Ensures की नहीं व्यक्त की है। सीधे शब्दों में कहें, यह सुनिश्चित करना है कि आपकी विधि ने अंत तक कुछ किया है - उदाहरण के लिए, यह सुनिश्चित कर सकता है कि यह किसी सूची में कुछ जोड़ा गया है, या (अधिक संभावना है) कि वापसी मान गैर-शून्य, या सकारात्मक या जो भी हो। उदाहरण के लिए, आप हो सकता है:

public int IncrementByRandomAmount(int input) 
{ 
    // We can't do anything if we're given int.MaxValue 
    Contract.Requires(input < int.MaxValue); 
    Contract.Ensures(Contract.Result<int>() > input); 

    // Do stuff here to compute output 
    return output; 
} 

में पुनः के कोड में, वहाँ वापसी के बिंदु पर एक चेक सुनिश्चित करना है कि दिए गए मान वास्तव में इनपुट से अधिक है किया जाएगा।

+0

आप सही थे - प्रोजेक्ट सेटिंग्स में मोड गलत था। मेरे हिस्से पर बेवकूफ गलती :-) – Steffen

+2

@Steffen: मैंने इसे स्पष्ट करने के लिए थोड़ा और जोड़ा है जिसका अर्थ यह है कि इसका क्या अर्थ है। मुझे नहीं पता कि आपको इसकी आवश्यकता है या नहीं, लेकिन संभवतः भविष्य के पाठकों को यह उपयोगी लगेगा :) –

+0

अच्छा विस्तार - यह मुझे बहुत कुछ करने की उम्मीद थी, लेकिन यह हमेशा लिखने में अच्छा लगता है :-) – Steffen