2010-10-12 12 views
9

कोड अनुबंध तब तक बढ़िया काम करते हैं जब तक आपको ढांचे कोड से बाहर आने वाले परिणामों के लिए bazillion Contract.Assume(...) जोड़ना न पड़े। उदाहरण के लिए, MemoryStream.ToArray() कभी भी एक शून्य सरणी नहीं लौटाता है, जैसा कि मैं इसे परावर्तक में देखने से कह सकता हूं, लेकिन इसे अनुबंध के रूप में दस्तावेज नहीं किया गया है, इसलिए मुझे इसे हर जगह Assume करना है।मैं मौजूदा ढांचे (बीसीएल) कोड के लिए कोड अनुबंध कैसे निर्दिष्ट कर सकता हूं?

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

+2

यह "कभी भी एक शून्य सरणी नहीं देता" * *, वैसे भी। अनुबंध के बारे में चीजों में से एक यह है कि आपको इसे बदलना नहीं है। इस तरह के एक अनुबंध की अनुपस्थिति * शायद * सुझाव दे सकता है कि यह * बदल सकता है। शायद। –

+0

एक उचित बिंदु है, लेकिन कोड अनुबंध के मामले में, मुझे संदेह है क्योंकि अनुबंध टीम के पास हर जगह अनुबंध जोड़ने का समय नहीं है। Http://social.msdn.microsoft.com/Forums/en-NZ/codecontracts/thread/d8e2c2ad-de37-42ef-a854-02052d821975 देखें, जहां टीम के सदस्यों में से एक नोट करता है "हम तेजी से अंतराल भरने पर काम कर रहे हैं जैसा कि हम कर सकते हैं, लेकिन यह मुख्य रूप से हमारे द्वारा संचालित होता है या आप पाते हैं कि महत्वपूर्ण अंतर क्या हैं। आदर्श रूप में, हम पुस्तकालयों के माध्यम से व्यवस्थित रूप से जाते हैं और उन्हें एनोटेट करते हैं। फिलहाल हमारे पास मनुष्य शक्ति नहीं है। " –

उत्तर

1

मुझे नहीं लगता कि आप सीधे कर सकते हैं। करने के लिए कई चीजें हैं:

कोड अनुबंध अनुबंध मंच पर this thread में अनुबंध को जोड़ने का अनुरोध करें।

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

static class Contracted 
{ 
    byte[] ToArrayContracted(this MemoryStream s) 
    { 
     Contract.Requires(s != null); 
     Contract.Ensures(Contract.Result<byte[]>() != null); 

     var result = s.ToArray(); 
     Contract.Assume(result != null); 
     return result; 
    } 
} 

इस तरह, आप s.ToArray() के बजाय s.ToArrayContracted() उपयोग करते हैं, और एक बार अनुबंध प्रकार पर उपलब्ध हैं, तुम बस खोज और जगह ले सकता है के लिए ToArrayContractedToArray

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