कंस्ट्रक्टरों पर स्थिर ऑब्जेक्ट निर्माण विधियों के पेशेवरों और विपक्ष क्या हैं?
class Foo {
private Foo(object arg) { }
public static Foo Create(object arg) {
if (!ValidateParam(arg)) { return null; }
return new Foo(arg);
}
}
कुछ ऐसा जो मैं सोच सकता हूँ:
पेशेवरों:
- अपवाद फेंकने के बजाय अशक्त लौटें (इसे नाम दें
TryCreate)। यह क्लाइंट की तरफ कोड को और अधिक स्पष्ट और स्वच्छ बना सकता है। ग्राहक शायद ही कभी निर्माणकर्ता से असफल होने की उम्मीद करते हैं। - स्पष्ट शब्दार्थ के साथ विभिन्न प्रकार की वस्तुएँ बनाएँ, जैसे
CreatFromName(String name)औरCreateFromCsvLine(String csvLine) - यदि आवश्यक हो, या एक व्युत्पन्न कार्यान्वयन एक कैश्ड वस्तु वापस कर सकते हैं।
विपक्ष:
- कम खोज योग्य, स्किम कोड को और अधिक कठिन।
- कुछ पैटर्न, जैसे क्रमांकन या प्रतिबिंब अधिक कठिन हैं (उदाहरण के लिए
Activator<Foo>.CreateInstance())
Foo x = Foo.TryCreate(); if (x == null) { ... }) है। एक ctor अपवाद को हैंडल करना ( Foo x; try { x = new Foo(); } catch (SomeException e) { ... }) है। सामान्य तरीके से कॉल करते समय, मैं त्रुटि कोड के अपवादों को प्राथमिकता देता हूं, लेकिन ऑब्जेक्ट निर्माण के साथ, TryCreateक्लीनर लगता है।
Nameऔर CsvLineटाइप करने के लिए बेहतर हो सकते हैं । यह आपको Create को ओवरलोड करने की अनुमति देगा। दोनों के लिए तार का उपयोग "आदिम जुनून" माना जा सकता है (यह मानते हुए कि आपने प्रदर्शन के कारणों के लिए यह विकल्प नहीं बनाया है)। यह पता लगाने के लिए एक मजेदार तरीके से ऑब्जेक्ट कैलिसथेनिक्स की जाँच करें।