c# - ठेके और कन्स्ट्रक्टर द्वारा डिजाइन




.net c#-4.0 (4)

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

    public ArrayList(int capacity) {
        Contract.Requires(capacity > 0);
        Contract.Ensures(Size == capacity);

        _array = new T[capacity];
    }

    public ArrayList() : this(32) {
        Contract.Ensures(Size == 32);
    }

मैं हाँ कहूँगा, प्रत्येक विधि का एक अच्छी तरह से परिभाषित अनुबंध होना चाहिए। दूसरी तरफ, अगर यह सिर्फ "मुख्य" कन्स्ट्रक्टर को काम सौंपने का काम करता है तो उसे क्यों रखा जाए? तर्कसंगत, मुझे इसकी आवश्यकता नहीं होती।

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

इसके अलावा, क्या कोई किताबें हैं जो कि सिद्धांतों के आधार पर गहराई से डिजाइन और कॉन्ट्रैक्ट्स द्वारा डिजाइन का उपयोग करती हैं? एक बात यह है कि एक भाषा में कॉन्ट्रैक्ट्स का उपयोग कैसे करें (सी #, इस मामले में), अन्य यह जानते हैं कि इसका उपयोग कैसे और कब करना चाहिए मैंने कई ट्यूटोरियल और इसके बारे में गहराई के लेख में जॉन स्कीट का सी # पढ़ा है, लेकिन यदि संभव हो तो मैं थोड़ा गहरा जाना चाहता हूं।

धन्यवाद


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

साहित्य के बारे में - सबसे अच्छा स्रोत हैं:

HTH! थॉमस


मैं पूरी तरह से थॉमस के उत्तर से असहमत हूं। जब तक आप ArrayList() के कार्यान्वयन में चुनाव कर रहे हैं, तब तक आपके पास एक अनुबंध होना चाहिए, जो इन विकल्पों का दस्तावेज करता है

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

जवाब "यह मुख्य कन्स्ट्रक्टर को कॉल करता है, इसलिए मुख्य निर्माता का अनुबंध काम करता है" इस तथ्य को पूरी तरह से अनदेखा करता है कि अनुबंध आपको कार्यान्वयन को देखने के लिए बचाने के लिए है रन-टाइम कथित जांच के आधार पर एक सत्यापन रणनीति के लिए, ऐसे छोटे कन्स्ट्रक्टर / विधियों के लिए लेखन अनुबंध का नुकसान भी है जो कि किसी अन्य निर्माता / विधि से सीधे कॉल करता है कि आप चीजों को दो बार जांचते हैं हां, यह बेमानी लगता है, लेकिन रन-टाइम अभियोग जांच केवल एक सत्यापन रणनीति है, और डीबीसी के सिद्धांत इसके मुकाबले स्वतंत्र हैं। सिद्धांत है: अगर इसे कहा जा सकता है, तो उसे दस्तावेज देने के लिए अनुबंध की जरूरत है कि वह क्या करता है।


क्लाइंट कोड (कोड कॉन्ट्रैक्ट्स का उपयोग करके) जो कि ArrayList का उपयोग करता है, वह नहीं जानता कि खाली कन्स्ट्रक्टर Ensure कि Size == 32 जब तक कि आप स्पष्ट रूप से किसी Ensure का उपयोग नहीं करते।

तो (उदाहरण के लिए):

var x = new ArrayList();
Contract.Assert(x.Size == 32)

आपको "चेतावनी सिद्ध नहीं" चेतावनी देगी

आपको स्पष्ट रूप से सभी अनुबंधों की आवश्यकता है; कोड अनुबंध लिखना / स्थिर जांचकर्ता किसी भी निहितार्थ को देखने के लिए "विधि के माध्यम से" नहीं देखेगा - संबंधित प्रश्न का उत्तर देखें "क्या हमें अनुबंध निर्दिष्ट करना होगा।


मैं बर्ट्रेंड मेयर से ऑब्जेक्ट ओरिएंटेड सॉफ्टवेयर कंसट्रक्शन, द्वितीय संस्करण , या शायद टच ऑफ क्लास को पढ़ने की सलाह देता हूं। वैकल्पिक रूप से, आप 1992 लेख को उसी लेखक से "अनुबंध द्वारा डिजाइन" आवेदन कर सकते हैं।

संक्षेप में:

  • वर्ग अपरिवर्तक को कन्स्ट्रक्टर (उनमें से कोई) समाप्त होने और कक्षा के किसी भी सार्वजनिक विधि के निष्पादित होने के पहले और बाद के बाद रखना होगा।
  • विधि पूर्वनिर्धारित और पोस्टकंडिशन अतिरिक्त शर्तों हैं जो अव्यवस्था के साथ-साथ किसी भी सार्वजनिक विधि को प्रवेश और बाहर निकलते हैं।

तो आपके मामले में, अपरिवर्तनीय में ध्यान केंद्रित करें। एक सही वस्तु का निर्माण करें (एक जो वर्ग अपरिवर्तनीयता को संतुष्ट करता है), कोई फर्क नहीं पड़ता कि कन्स्ट्रक्टर का उपयोग किया जाता है।

इस संबंधित उत्तर में मैंने एक उदाहरण सहित, इसी तरह के विषयों पर चर्चा की।





design-by-contract