2009-12-30 13 views
32

कोड की निम्न दो टुकड़े पर विचार करें:सी #: कोड संविदा बनाम सामान्य पैरामीटर सत्यापन

public static Time Parse(string value) 
    { 
     string regXExpres = 
      "^([0-9]|[0-1][0-9]|2[0-3]):([0-9]|[0-5][0-9])$|^24:(0|00)$"; 
     Contract.Requires(value != null); 
     Contract.Requires(new Regex(regXExpres).IsMatch(value)); 
     string[] tokens = value.Split(':'); 
     int hour = Convert.ToInt32(tokens[0], CultureInfo.InvariantCulture); 
     int minute = Convert.ToInt32(tokens[1], CultureInfo.InvariantCulture); 
     return new Time(hour, minute); 
    } 

और

public static Time Parse(string value) 
    { 
     if (value == null) 
     { 
      throw new ArgumentNullException("value"); 
     } 
     string[] tokens = value.Split(':'); 
     if (tokens.Length != 2) 
     { 
      throw new FormatException("value must be h:m"); 
     } 
     int hour = Convert.ToInt32(tokens[0], CultureInfo.InvariantCulture); 
     if (!(0 <= hour && hour <= 24)) 
     { 
      throw new FormatException("hour must be between 0 and 24"); 
     } 
     int minute = Convert.ToInt32(tokens[1], CultureInfo.InvariantCulture); 
     if (!(0 <= minute && minute <= 59)) 
     { 
      throw new FormatException("minute must be between 0 and 59"); 
     } 
     return new Time(hour, minute); 
    } 

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

तो मुझे बहुत सारी गलत चेतावनियां मिलती हैं और मुझे RegEx सत्यापन के अलावा FormatExceptions को फेंकने के बिना अनुबंधों के साथ स्ट्रिंग मानों को सत्यापित करने का कोई तरीका नहीं दिखता है।

कोई भी सुझाव कोड कोड का उपयोग करके आप इसे और समकक्ष स्थितियों को कैसे हल करेंगे?

+1

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

उत्तर

21

आदेश में चेतावनी से छुटकारा पाने के आप Contract.Assume

+0

इस तरह की समस्या मेरी हल हल करती है। यदि मैं वापसी विवरण के सामने निम्नलिखित पंक्तियां जोड़ता हूं तो सभी गलत चेतावनियां समाप्त हो जाती हैं। एकमात्र चीज जो मुझे अभी भी पसंद नहीं है वह यह है कि ये लाइनें किसी भी तरह कोड को उड़ा रही हैं। लेकिन मुझे लगता है कि कोड अनुबंधों के लिए नियमित अभिव्यक्तियों का अर्थ प्राप्त करना असंभव है। अनुबंध। एसम्यूम (0 <= घंटा और घंटा <= 24); अनुबंध। एसम्यूम (0 <= मिनट और मिनट <= 5 9); – steveee

+15

@steveee, आपको हमेशा अनुबंधों पर अनुबंधों को विभाजित करना चाहिए, ताकि 'अनुबंध। एसम्यूम (0 <= घंटा और घंटा <= 24); 'अनुबंध' बन जाता है। एसम्यूम (0 <= घंटा); अनुबंध। आइस्यूम (घंटा <= 24); ' – porges

+0

@ पोर्गेस एक दस्तावेज बता रहा है क्यों? –