.net-4.0 - microsoft - net fra framework 4.5 download




कोड अनुबंध-मान बनाम आवश्यक है (2)

यह केवल डिजाइन समय / स्थिर-विश्लेषण-समय को अलग करता है

संविदा.एस्यूयूयूयूयूएम: "कोड विश्लेषण उपकरण यह मानते हैं कि निर्दिष्ट शर्त सही है, भले ही इसे स्थिर रूप से सिद्ध नहीं किया जा सकता है, भले ही वह हमेशा सत्य न हो" और: चलने के समय, इस पद्धति का उपयोग करते हुए असाट (बूलियन) विधि का उपयोग करने के बराबर है।

अनुबंध। गारंटी गारंटी देगा कि दिए गए निचला सही है और स्थिर कोड विश्लेषक एक त्रुटि बढ़ा सकते हैं यदि वे 'साबित नहीं' कर सकते हैं जो मामला नहीं है। अनुबंध पर.समझें स्थिर विश्लेषक जारी रहेगा / एक चेतावनी जारी करेगा / उपकरण जो भी तय करेगा।

इन दो बयानों के बीच क्या जुबान है?

Contract.Requires(string.IsNullOrWhiteSpace(userName));

Contract.Assume(string.IsNullOrWhiteSpace(userName));

कल्पना कीजिए कि आपके पास इस तरह एक विधि है:

bool ContainsAnX(string s)
{
    return s.Contains("X");
}

अब, यह विधि हमेशा असफल हो जायेगी यदि आप इसे null पास करते हैं, तो आप यह सुनिश्चित करना चाहते हैं कि ऐसा कभी नहीं होता। यह वही है जो Contract.Requires के लिए है। यह विधि के लिए एक पूर्व शर्त निर्धारित करता है, जो सही ढंग से चलाने के लिए विधि के लिए सही होना चाहिए। इस मामले में हमारे पास होगा:

bool ContainsAnX(string s)
{
    Contract.Requires(s != null);

    return s.Contains("X");
}   

( ध्यान दें : Requires और Ensures करना हमेशा एक विधि की शुरुआत में होना चाहिए, क्योंकि वे पूरी तरह से विधि के बारे में जानकारी रखते हैं। Assume कोड में स्वयं प्रयोग किया जाता है, क्योंकि यह कोड में उस बिंदु के बारे में जानकारी है।)

अब, आपके कोड में जो विधि "ContainsAnX" कॉल करता है, आपको यह सुनिश्चित करना चाहिए कि स्ट्रिंग शून्य नहीं है। आपकी विधि इस तरह दिख सकती है:

void DoSomething()
{
    var example = "hello world";

    if (ContainsAnX(example))
        Console.WriteLine("The string contains an 'X'.");
    else
        Console.WriteLine("The string does not contain an 'X'.");
}

यह ठीक काम करेगा, और स्थिर चेकर साबित कर सकता है कि example शून्य नहीं है।

हालांकि, आप बाहरी पुस्तकालयों में बुला सकते हैं, जिनके पास उनके लौटने वाले मूल्यों के बारे में कोई जानकारी नहीं है (यानी वे कोड संविदाओं का उपयोग नहीं करते हैं)। चलिए उदाहरण को बदलते हैं:

void DoSomething()
{
    var example = OtherLibrary.FetchString();

    if (ContainsAnX(example))
        Console.WriteLine("The string contains an 'X'.");
    else
        Console.WriteLine("The string does not contain an 'X'.");
}

यदि अन्य OtherLibrary कोड संविदाओं का उपयोग नहीं करती है, तो स्थिर चेकर शिकायत करेगा कि example शून्य हो सकता है।

शायद पुस्तकालय के लिए उनके दस्तावेज का कहना है कि यह विधि कभी भी अशक्त (या कभी नहीं! इस मामले में, हम स्थिर जांचकर्ता से अधिक जानते हैं, इसलिए हम यह Assume सकते हैं कि चर निरर्थक नहीं होगा:

void DoSomething()
{
    var example = OtherLibrary.FetchString();

    Contract.Assume(example != null);

    if (ContainsAnX(example))
        Console.WriteLine("The string contains an 'X'.");
    else
        Console.WriteLine("The string does not contain an 'X'.");
}

अब यह स्थिर चेकर के साथ ठीक हो जाएगा। यदि आपके पास रनटाइम कॉन्ट्रैक्ट सक्षम हैं, तो मान लें कि रन टाइम पर भी जांच की जाएगी।

एक अन्य मामले में आपको ग्रहण करना पड़ सकता है कि जब आपकी पूर्व शर्त बहुत जटिल होती है और स्थैतिक चेकर को साबित करने में कठिन समय होता है। इस मामले में आप इसे मदद करने के लिए एक कुहनी से हलका धक्का दे सकते हैं :)

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

  • इसका अर्थ है कि इस विधि को कॉल करने वाला कोड शर्त को सुनिश्चित करेगा
  • मान लें कि यह विधि एक धारणा बना रही है, जिसे हमेशा सही रखना चाहिए।




code-contracts