2011-05-25 17 views
6

पर मान्यता जोड़ने मैं चर है कि मैं द्वारा सी # में परिभाषित की एक जोड़ी:सी # एक सेटर विधि

public String firstName { get; set; } 
public String lastName { get; set; } 
public String organization { get; set; } 

क्या मैं चाहता हूँ इन तरीकों को मान्यता जोड़ने के लिए जब आप एक मूल्य सेट करने का प्रयास है। आइए कहें कि आप पहले नाम के लिए एक मूल्य निर्धारित करने जा रहे हैं, मुझे एक्टुअल रूप से सेट करने के लिए एक regexp फेंकना चाहिए, अन्यथा एक अपवाद फेंक दिया जाना चाहिए। क्या यह "शॉर्ट सिंटैक्स" के साथ निर्माण करना संभव है या क्या मुझे मानक (जैसे जावा में) गेटर्स और सेटर्स के लिए जाना चाहिए और वहां डेटा को मान्य करना चाहिए?

उत्तर

25

यदि आप संपत्ति सेट करते समय मान्य करना चाहते हैं, तो आपको गैर-ऑटो गुणों का उपयोग करने की आवश्यकता है (यानी मैन्युअल रूप से परिभाषित get और set विधियों)।

लेकिन मान्य करने का एक और तरीका डोमेन ऑब्जेक्ट से सत्यापन तर्क अलग है।

class Customer { 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Organization { get; set; } 
} 

interface IValidator<T> { 
    bool Validate(T t); 
} 

class CustomerValidator : IValidator<Customer> { 
    public bool Validate(Customer t) { 
     // validation logic 
    } 
} 

फिर, आप कह सकते हैं:

  1. एक Customer अपने स्वयं के डेटा को मान्य करने के लिए जिम्मेदार नहीं करना चाहिए, कि एक और responsibility और इसलिए है:

    Customer customer = // populate customer 
    var validator = new CustomerValidator(); 
    if(!validator.Validate(customer)) { 
        // head splode 
    } 
    

    यह दृष्टिकोण मैं पसंद है कहीं और रहना चाहिए।

  2. अलग-अलग स्थितियां एक ही डोमेन ऑब्जेक्ट के लिए अलग-अलग सत्यापन तर्क के लिए कॉल करती हैं।
+3

मैं सहमत नहीं हूं, भले ही आपकी सत्यापन विफल हो, आपका ग्राहक डेटा अमान्य है। यदि आप बाहरी सत्यापन को गड़बड़ करते हैं तो उसे कचरा लिखने से रोकने के लिए क्या करना है? – Blindy

+0

@ ब्लिंडी: आपकी दृढ़ता परत को वैधकर्ताओं के साथ तारित किया जाना चाहिए जो वैधता विफल होने पर जारी नहीं रहें। – jason

+0

@ ब्लिंडी ग्राहक डेटाबेस को लिखने के लिए ज़िम्मेदार नहीं होना चाहिए। यह एक और ज़िम्मेदारी होगी कि ग्राहक के पास नहीं होना चाहिए। – Phil

6

अब आपके पास "ऑटो-प्रॉपर्टी" कहा जाता है, और केवल एक सरल "get/set" होता है।

private string _firstName; 
public string FirstName 
{ 
    get {return _firstName;} 
    set 
    { 
     Validate(value); _firstName = value; 
    } 
} 

ध्यान दें कि मैं string को String बदल गया है और बड़े अक्षरों में प्रॉपर्टी का नाम, निम्नलिखित स्वीकार किए जाते हैं सी # नामकरण में: get या set के व्यवहार को अनुकूलित करने के लिए, आप क्षेत्र समर्थित करने के लिए गुण गुण परिवर्तित करने की आवश्यकता होगी सर्वोत्तम प्रथाएं।

+0

क्या यह मान्य (मूल्य) नहीं होना चाहिए? – TDull

+0

@TDull: हाँ, मैंने इसे ठीक किया है। :-) – StriplingWarrior

0

आपको इसके लिए पूर्ण संपत्ति वाक्यविन्यास का उपयोग करना होगा।

3

मैं setter में सत्यापन नहीं जोड़ूंगा। इसके बजाय, मैं validate नामक एक फ़ंक्शन बनाउंगा ... इस तरह आपका सभी सत्यापन कोड एक स्थान पर है बल्कि आपके setters में बिखरा हुआ है।

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