2015-07-09 16 views
27

में अनुबंध क्या हैं I बी स्ट्रॉस्ट्रप द्वारा Thoughts about C++17 में अनुबंधों के बारे में पढ़ रहे थे और उनके बारे में बात करने वाली एक छोटी प्रस्तुति में सहायता की लेकिन मुझे यकीन नहीं है कि मैंने उन्हें वास्तव में समझा है।सी ++ 17

तो मैं एक कुछ पूछताछ की है और अगर यह उन्हें कुछ उदाहरण के साथ वर्णन करने के लिए संभव है:

  • ठेके सिर्फ क्लासिक assert() का एक बेहतर प्रतिस्थापन कर रहे हैं और वे एक साथ इस्तेमाल किया जाना चाहिए? सॉफ़्टवेयर देव के लिए सरल शब्दों में वास्तव में कौन से अनुबंध किए जाते हैं?

  • क्या अनुबंधों पर असर पड़ता है कि हम अपवादों को कैसे संभालेंगे? यदि हां, तो हमें अपवादों और अनुबंधों का उपयोग कैसे करना चाहिए?

  • अनुबंधों का उपयोग निष्पादन समय पर ओवरहेड का अर्थ होगा? क्या हम उन्हें रिलीज कोड पर निष्क्रिय करने की अनुमति देंगे? proposal N4415 से

संपादित करें:

एक वेक्टर वर्ग का अनुक्रमण ऑपरेटर के एक पूर्व शर्त अनुबंध लिखा जा सकता है:
T& operator[](size_t i) [[expects: i < size()]];

इसी तरह, पर एक के बाद हालत अनुबंध एक ArrayView वर्ग के एक निर्माता के रूप में व्यक्त किया जा सकता है: ArrayView(const vector<T>& v) [[ensures: data() == v.data()]];

+2

वे डीबग चेक की तरह हैं जिन्हें आप कंपाइलर को दिए गए चेकिंग के स्तर के आधार पर सक्षम या अक्षम कर सकते हैं। अक्षम स्तर के लिए किसी भी चेक को रनटाइम लागत नहीं होगी। आप उनके लिए प्रस्ताव क्यों नहीं पढ़ते? – CoffeeandCode

+0

@ बेसिलस्टारनकेविच इस सवाल को प्रोग्रामर के लिए एक खराब फिट है - इसे तुरंत नीचे बंद कर दिया जाएगा और वहां बंद कर दिया जाएगा, http://meta.programmers.stackexchange.com/questions/6483/why-was-my-question-closed- या नीचे-वोट/64 9 0 # 64 9 0 अनुशंसित पढ़ने: ** [प्रोग्रामर.एसई पर क्या चल रहा है? स्टैक ओवरफ़्लो के लिए एक गाइड] (http://meta.programmers.stackexchange.com/q/7182/31260) ** – gnat

उत्तर

19

जहां तक ​​मेरा इस दस्तावेज़ से पढ़ा है: http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2015/n4415.pdf

संविदा assert साल के लिए एक आदिम रास्ते में करने के लिए कोशिश कर रहा है कि क्या करना। वे दोनों प्रलेखन और एक रन-टाइम जोर देते हैं कि कॉलर को फ़ंक्शन को कॉल करने की अपेक्षा की जानी चाहिए और कॉलर किस कार्य को वापस लौटने के बाद कोड की अपेक्षा कर सकता है। जिन्हें आमतौर पर पूर्व-परिस्थितियों और बाद की स्थितियों या आविष्कार के रूप में जाना जाता है।

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

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

उदाहरण:

void MyVector::push_back(Elem e) [[ensures: data != nullptr]] 
{ 
    if(size >= capacity) 
    { 
     Data* p = data; 
     data = nullptr; // Just for the sake of the example... 
     data = new Data[capacity*2]; // Might throw an exception 
     // Copy p into data and delete p 
    } 
    // Add the element to the end 
} 

इस उदाहरण यहाँ में, यदि new या Data के निर्माता एक अपवाद फेंकता है, अपने बाद के हालत का उल्लंघन किया है। इसका मतलब है कि आपको यह सुनिश्चित करने के लिए इस तरह के सभी कोड को बदलना चाहिए कि आपके अनुबंध का कभी उल्लंघन नहीं हुआ है!

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

+0

उत्तर के लिए धन्यवाद। इसलिए यदि मैं दावाों का उपयोग करने का पालन करता हूं तो इसे बहिष्कृत किया जाना चाहिए और हमें इसके बजाय अनुबंधों का उपयोग करना चाहिए। क्या आप अपनी "पोस्ट स्थिति अपवाद बदल सकते हैं" भाग पर एक उदाहरण प्रदान कर सकते हैं? – coincoin

+0

@coincoin एक उदाहरण शामिल करने के लिए संपादित – KABoissonneault

+0

@coincoin Assertions को बहिष्कृत नहीं किया जाएगा क्योंकि अनुबंध फ्रेमवर्क में 0 फिट नहीं हैं, –

7

मैंने मूल दस्तावेज़ ओपी से link के साथ शुरुआत की। कुछ जवाब हैं, मुझे लगता है। मैं दृढ़ता से उस पेपर से शुरू करने की सलाह देता हूं।

संविदा एक सामान्य रिपोर्टिंग तंत्र त्रुटि नहीं हैं, न ही वे परीक्षण चौखटे के लिए विकल्प हैं: यहाँ टी एल & डॉ संस्करण है। इसके बजाय, वे प्रोग्राम के कुछ हिस्सों के बीच अपेक्षाओं के मेल के कारण गलत होने पर एक प्रोग्राम गलत होने पर मूल शमन उपाय प्रदान करते हैं। अनुबंध अवधारणात्मक रूप से अधिक assert() भाषा में एकीकृत हैं, भाषा अर्थशास्त्र नियमों द्वारा खेलते हैं - इसलिए प्रिंसिपल प्रोग्राम विश्लेषण और टूलींग के लिए आधार।

आपके प्रश्नों के बारे में:

  • यह संरचित है ज़ोर(), तो हाँ, यह कहा जा सकता है कि कुछ मामलों में जोर() के अनुबंध के साथ की जगह किया जाना चाहिए।

... एक अनुबंध की अभिव्यक्ति तार्किक आपरेशन के घोषणा का हिस्सा होना चाहिए:

  • मुझे एक और उद्धरण यहाँ का उपयोग करते हैं।

  • और उदाहरण:

    T& operator[](size_t i) [[expects: i < size()]]; 
    

    मेरी राय में, यह सिर्फ अच्छा और पठनीय है।

    • कुछ मामलों में ठेके अपवाद की जगह ले सकता:

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

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

    • मामलों के लिए अनुबंधों को चालू/बंद करने के लिए ओवरहेड को कम किया जा सकता है: सभी का उपयोग करें, केवल गैर शर्त, केवल पूर्व शर्त, केवल बाद की स्थिति का उपयोग करें। अनुबंधों पर मुड़ने से निश्चित रूप से किसी भी प्रकार के चेक के रूप में कुछ ओवरहेड जोड़ दिया जाएगा।

    कुछ उपयोग के मामलों (के रूप में मुझे लगता है कि कर सकते हैं, जबकि मैं भी एक अनुबंध डिजाइन विकसित करने के करीब नहीं कर रहा हूँ)

    1. संविदा - हमेशा की तरह assert() के मामले में अनुबंध अधिक पठनीय हैं और कम से अनुकूलित किया जा सकता है संकलन समय।
    2. आवेषण - यूनिट परीक्षणों में, परीक्षण ढांचे आदि।
    3. अपवाद - लेख में वर्णित के रूप में पूर्व वातानुकूलित अनुबंध के साथ इस्तेमाल किया जा सकता:

    किसी ऑपरेशन के पूर्व शर्त समारोह के शरीर में किसी भी अन्य बयान से पहले मूल्यांकन किया जाता है। यदि परिणाम सत्य है, तो सामान्य निष्पादन का नियंत्रण फ़ंक्शन के शरीर में पहला बयान जारी है। अन्यथा, आगे निष्पादन की गारंटी नहीं है: या तो प्रोग्राम निरस्त करता है, या अपवाद फेंकता है, या यदि इसे जारी रखने की अनुमति है तो व्यवहार अपरिभाषित है।

    भी someother अनुबंध कार्यान्वयन के बारे में सुझाव हैं, इसलिए हमारी जांच अभी समय से पहले है।

    +0

    आपके उत्तर के लिए धन्यवाद। तो आप कहते हैं कि दावा और अपवाद का उपयोग करके आपके संदर्भ के आधार पर अभी भी आवश्यकता हो सकती है? क्या दावा, अपवाद या अनुबंध का उपयोग करते समय कुछ उदाहरण प्रदान करना संभव है, दूसरे की तुलना में अधिक कानूनी? – coincoin

    +3

    @coincoin आप निश्चित रूप से अनुबंधों का उपयोग न करने वाले कार्यों की पोस्ट-स्थितियों का मूल्यांकन करने के लिए 'assert' का उपयोग करना चाहते हैं (उदा: यह कभी शून्य नहीं होना चाहिए, लेकिन बस मामले में ...)। अपवाद मेरी राय में एक प्रणाली है जो संविदा/आवेषण के लिए पूरी तरह से ऑर्थोगोनल है; अपवादों का अनुबंध अनुबंध के उल्लंघन के लिए उपयोग नहीं किया जाना चाहिए, लेकिन असाधारण परिस्थितियों के लिए, सॉकेट त्रुटि या फ़ाइल हैंडलिंग त्रुटि की तरह। इसलिए उन्हें अभी भी इस्तेमाल किया जाना चाहिए, लेकिन मेरी राय में पूर्व शर्त उल्लंघन के लिए नहीं! – KABoissonneault

    +0

    @coincoin "कोड से बाहर" समस्याओं के अपवादों का उपयोग करने के बारे में KABoissonneault के साथ सहमत हैं, कुछ जवाब मामलों में भी उपयोग किए गए हैं। –

    3

    अपने प्रश्नों के उत्तर देने में आसान नहीं है: यह निर्भर करता है। ऐसा इसलिए है क्योंकि यह अभी तक स्पष्ट नहीं है कि अनुबंध वास्तव में क्या होने जा रहे हैं। वहाँ कई प्रस्तावों और विचारों अभी चारों ओर चल रहे हैं:

    • n4378 Lakos et al. मूल रूप से एक परिष्कृत ज़ोर टूलकिट का मानकीकरण करने का प्रस्ताव है। कार्यों को क्रियान्वयन के अंदर अनुबंधों की जांच की जाती है, रनटाइम चेक की मात्रा को नियंत्रित करने के लिए 3 अलग-अलग जोर स्तर प्रदान किए जाते हैं और जोर उल्लंघन के संचालन को अनुकूलित किया जा सकता है।

    • n4415 dos Reis et al. और n4435 Brown काफी समान हैं और फ़ंक्शन इंटरफेस में पूर्व और पोस्ट स्थितियों को परिभाषित करने के लिए एक विशेषता आधारित वाक्यविन्यास का प्रस्ताव देते हैं। वे विवरण में नहीं जाते कि वे रन-टाइम चेक और उल्लंघनों पर व्यवहार पर कितना नियंत्रण देते हैं।

    इस विषय पर भी कम हाल के कागजात हैं। ऐसे कई विवरण हैं जिन्हें अभी तक तय नहीं किया गया है, और यह सुविधा कई अलग-अलग क्षेत्रों (जैसे मॉड्यूल, ऑप्टिमाइज़ेशन, बिल्डिंग/लिंकिंग) को छूती है जिनमें से कुछ मानक पर थोड़ा नियंत्रण होता है।

    अपवादों पर आपका प्रश्न विशेष रूप से कठिन है, क्योंकि अनुबंध उल्लंघन हैंडलिंग और अपवादों के बीच बातचीत अस्पष्ट है (उदाहरण के लिए अनुबंध उल्लंघन हैंडलर फेंक (परीक्षण ढांचे में उपयोगी) हो सकता है? यदि कार्य noexcept(true) है?)।

    +1

    धन्यवाद। तो मुझे लगता है कि हमें कुछ बिंदुओं को स्पष्ट करने के लिए कुछ समय इंतजार करना होगा। – coincoin

    +0

    हां, या इसमें शामिल होना शुरू करें और इसे आकार दें। –

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