हाल ही में मैं अपने कुछ कोड हासिल करने के बारे में सोच रहा हूं। मैं उत्सुक हूं कि कोई यह कैसे सुनिश्चित कर सकता है कि कोई वस्तु कभी भी सीधे नहीं बनाई जा सकती है, लेकिन केवल एक कारखाने वर्ग के कुछ तरीके के माध्यम से। हम कहते हैं कि मेरे पास कुछ "व्यावसायिक वस्तु" वर्ग है और मैं यह सुनिश्चित करना चाहता हूं कि इस वर्ग के किसी भी उदाहरण में एक वैध आंतरिक स्थिति होगी। इसे प्राप्त करने के लिए मुझे एक वस्तु बनाने से पहले कुछ जाँच करने की आवश्यकता होगी, शायद इसके निर्माता में। यह सब ठीक है जब तक मैं तय नहीं करता कि मैं इस चेक को व्यापार तर्क का हिस्सा बनाना चाहता हूं। तो, मैं अपने व्यावसायिक तर्क वर्ग में केवल किसी विधि के माध्यम से किसी व्यावसायिक वस्तु को कैसे बनाए जाने की व्यवस्था कर सकता हूं लेकिन कभी सीधे नहीं? C ++ के पुराने "मित्र" कीवर्ड का उपयोग करने की पहली प्राकृतिक इच्छा C # के साथ कम हो जाएगी। इसलिए हमें अन्य विकल्पों की आवश्यकता है ...
आइए कुछ उदाहरण देखें:
public MyBusinessObjectClass
{
public string MyProperty { get; private set; }
public MyBusinessObjectClass (string myProperty)
{
MyProperty = myProperty;
}
}
public MyBusinessLogicClass
{
public MyBusinessObjectClass CreateBusinessObject (string myProperty)
{
// Perform some check on myProperty
if (true /* check is okay */)
return new MyBusinessObjectClass (myProperty);
return null;
}
}
यह सब ठीक है जब तक आपको याद है कि आप इनपुट की जांच किए बिना सीधे MyBusinessObjectClass उदाहरण बना सकते हैं। मैं उस तकनीकी संभावना को पूरी तरह से बाहर करना चाहूंगा।
तो, समुदाय इस बारे में क्या सोचता है?
CreateBusinessObject
विधि का उद्देश्य तर्कों को मान्य करना है (किसी नई वैध वस्तु को वापस करना या किसी त्रुटि को वापस करना) एकल कॉल में तब होता है जब एक कॉलर को तुरंत पता नहीं चलता कि क्या तर्क कंस्ट्रक्टर में पारित होने के लिए मान्य हैं।
Distance
एक नकारात्मक तर्क के साथ एक उदाहरण बनाना उदाहरण के ArgumentOutOfRangeException
लिए फेंकना चाहिए , आप एक DistanceFactory
ही चेक बनाने से कुछ नहीं हासिल करेंगे। मैं अब भी नहीं देखता कि आप यहाँ क्या हासिल करने के लिए खड़े हैं।