सामान्य रूप से डोमेन ऑब्जेक्ट में ऐसे गुण होते हैं जिन्हें एक अंतर्निहित प्रकार द्वारा दर्शाया जा सकता है, लेकिन जिनके वैध मान उन मानों का एक सबसेट होते हैं जिन्हें उस प्रकार द्वारा दर्शाया जा सकता है।
इन मामलों में, मूल्य को अंतर्निहित प्रकार का उपयोग करके संग्रहीत किया जा सकता है लेकिन यह सुनिश्चित करने के लिए आवश्यक है कि मान हमेशा प्रवेश के बिंदु पर मान्य होते हैं, अन्यथा हम अमान्य मान के साथ काम करना समाप्त कर सकते हैं।
इसे हल करने का एक तरीका मूल्य को एक रिवाज के रूप में संग्रहीत करना है struct
जिसमें private readonly
अंतर्निहित प्रकार का एक एकल समर्थन क्षेत्र है और जिसका निर्माता प्रदान किए गए मूल्य को सत्यापित करता है। हम तो हमेशा ही इस का उपयोग करके मान्य मानों का उपयोग कर के बारे में सुनिश्चित किया जा सकता है struct
प्रकार।
हम कास्ट ऑपरेटर्स को अंतर्निहित अंतर्निहित प्रकार से भी प्रदान कर सकते हैं ताकि मान मूल रूप से दर्ज कर सकें और अंतर्निहित प्रकार से बाहर निकल सकें।
एक उदाहरण के रूप में एक ऐसी स्थिति को लें, जहां हमें एक डोमेन ऑब्जेक्ट के नाम का प्रतिनिधित्व करने की आवश्यकता है, और वैध मान किसी भी स्ट्रिंग हैं जो लंबाई में 1 और 255 वर्णों के बीच है। हम निम्नलिखित संरचना का उपयोग करके इसका प्रतिनिधित्व कर सकते हैं:
public struct ValidatedName : IEquatable<ValidatedName>
{
private readonly string _value;
private ValidatedName(string name)
{
_value = name;
}
public static bool IsValid(string name)
{
return !String.IsNullOrEmpty(name) && name.Length <= 255;
}
public bool Equals(ValidatedName other)
{
return _value == other._value;
}
public override bool Equals(object obj)
{
if (obj is ValidatedName)
{
return Equals((ValidatedName)obj);
}
return false;
}
public static implicit operator string(ValidatedName x)
{
return x.ToString();
}
public static explicit operator ValidatedName(string x)
{
if (IsValid(x))
{
return new ValidatedName(x);
}
throw new InvalidCastException();
}
public static bool operator ==(ValidatedName x, ValidatedName y)
{
return x.Equals(y);
}
public static bool operator !=(ValidatedName x, ValidatedName y)
{
return !x.Equals(y);
}
public override int GetHashCode()
{
return _value.GetHashCode();
}
public override string ToString()
{
return _value;
}
}
उदाहरण दिखाता है कि string
जैसे- implicit
जैसे यह विफल हो सकता है, लेकिन से- string
कास्ट के रूप explicit
में यह अमान्य मूल्यों के लिए फेंक देगा, लेकिन निश्चित रूप से ये दोनों implicit
या तो हो सकते हैं explicit
।
यह भी ध्यान दें कि कोई केवल इस संरचना को किसी कास्ट के माध्यम से इनिशियलाइज़ कर सकता है string
, लेकिन कोई यह परीक्षण कर सकता है कि इस तरह की कास्ट IsValid
static
विधि का उपयोग करके अग्रिम में विफल होगी या नहीं ।
यह एक अच्छा पैटर्न प्रतीत होता है कि डोमेन मूल्यों के सत्यापन को लागू किया जा सकता है जिसे सरल प्रकारों द्वारा दर्शाया जा सकता है, लेकिन मैं इसे अक्सर इस्तेमाल नहीं करता या सुझाव दिया जाता हूं और मुझे इसमें दिलचस्पी है क्यों।
तो मेरा सवाल यह है कि आप इस पैटर्न का उपयोग करने के फायदे और नुकसान के रूप में क्या देखते हैं, और क्यों?
यदि आपको लगता है कि यह एक बुरा पैटर्न है, तो मैं यह समझना चाहूंगा कि क्यों और क्या आपको लगता है कि यह सबसे अच्छा विकल्प है।
नायब मैं मूल रूप से कहा कि स्टैक ओवरफ़्लो पर इस सवाल का , लेकिन यह मुख्य रूप से राय-आधारित (विडंबना यह है कि अपने आप में व्यक्तिपरक) के रूप में रोक दिया गया - यहाँ उम्मीद है कि यह आनंद ले सकता है और अधिक सफलता।
इन सबसे ऊपर, मूल पाठ, कुछ और विचारों से नीचे है आंशिक रूप से जवाब के जवाब में वहाँ प्राप्त होने से पहले ही पकड़ आगे कहा:
- उत्तरों द्वारा किए गए प्रमुख बिंदुओं में से एक उपरोक्त पैटर्न के लिए आवश्यक बॉयलर प्लेट कोड की मात्रा के आसपास था, खासकर जब ऐसे कई प्रकार की आवश्यकता होती है। हालाँकि, पैटर्न के बचाव में, इसे खासतौर पर टेम्प्लेट का उपयोग करके स्वचालित रूप से स्वचालित किया जा सकता है और वास्तव में यह मुझे वैसे भी बहुत बुरा नहीं लगता, लेकिन यह सिर्फ मेरी राय है।
- एक वैचारिक दृष्टिकोण से, जब यह C # जैसी दृढ़ता से टाइप की गई भाषा के साथ काम करने में अजीब नहीं लगता है, केवल दृढ़ता से टाइप किए गए सिद्धांत को समग्र मूल्यों पर लागू करना है, बल्कि इसे उन मूल्यों तक पहुंचाना है जिन्हें एक उदाहरण के द्वारा दर्शाया जा सकता है। बिल्ट-इन टाइप?