इंजेक्शन से पहले एक कारखाने के भीतर एक वर्ग 'प्रारंभिक विधि को कॉल करने के लिए एक अच्छा डिज़ाइन विकल्प है, मैं स्पेगेटी कोड के बजाय बड़े हिस्से को पुन: सक्रिय करने की प्रक्रिया में हूं। संक्षेप में यह एक बड़ी "ईश्वर की तरह" कक्षा है जो कुछ स्थितियों के आधार पर दो अलग-अलग प्रक्रियाओं में शाखाएं होती है। दोनों प्रक्रियाएं लंबी हैं और बहुत सारे डुप्लिकेट कोड हैं।क्या यह
तो मेरा पहला प्रयास उन दो प्रक्रियाओं को अपने स्वयं के वर्गों में निकालने और सामान्य कोड को उन माता-पिता में डालने के लिए किया गया है, जिन्हें वे दोनों प्राप्त करते हैं।
public class ExportProcess
{
public ExportClass(IExportDataProvider dataProvider, IExporterFactory exporterFactory)
{
_dataProvider = dataProvider;
_exporterFactory = exporterFactory;
}
public void DoExport(SomeDataStructure someDataStructure)
{
_dataProvider.Load(someDataStructure.Id);
var exporter = _exporterFactory.Create(_dataProvider, someDataStructure);
exporter.Export();
}
}
मैं मार्क सीनैन के ब्लॉग का एक उत्साही पाठक हूं और this entry में वे बताते हैं इस कोड को एक अस्थायी युग्मन गंध है के बाद से यह आवश्यक है पर लोड विधि कॉल करने के:
यह कुछ इस तरह दिखता इससे पहले डेटा प्रदाता एक उपयोगी राज्य में है।
उस आधार पर, और के बाद से वस्तु वैसे भी कारखाना द्वारा लौटाए गए लोगों के इंजेक्शन की जा रही है, मैं कारखाने से बदल रहा यह करने के लिए की सोच रहा हूँ:
public IExporter Create(IExportDataProvider dataProvider, SomeDataStructure someDataStructure)
{
dataProvider.Load(someDataStructure.Id);
if(dataProvider.IsNewExport)
{
return new NewExportExporter(dataProvider, someDataStructure);
}
return new UpdateExportExporter(dataProvider, someDataStructure);
}
नाम की वजह से
"dataProvider" आप शायद अनुमान लगाया गया है कि लोड विधि वास्तव में डेटाबेस पहुंच कर रही है।
कुछ मुझे बताता है कि एक सार कारखाने के निर्माण विधि के अंदर डेटाबेस पहुंच करने वाला कोई ऑब्जेक्ट एक अच्छा डिज़ाइन नहीं है।
क्या कोई दिशानिर्देश, सर्वोत्तम प्रथाएं या कुछ ऐसा कहता है जो प्रभावी रूप से एक बुरा विचार है?
आपकी मदद के लिए धन्यवाद।
जाहिर dataProvider.Load पक्ष प्रभाव के कुछ प्रकार है, एक संपत्ति में कुछ का एक उदाहरण प्राप्त करने में कठिनाई की तर्ज पर? क्या बाकी फैक्ट्री-विधि वास्तव में 'डेटाप्रोवाइडर' और 'कुछ डेटा संरचना' का उपयोग करती है? यदि ऐसा नहीं होता है, तो फैक्ट्री-विधि के लिए आपके तर्कों को वास्तव में आवश्यक तर्कों को स्वीकार करने में दोबारा प्रतिक्रिया दी जानी चाहिए। – PatrikAkerstrand
@PatrikAkerstrand: अच्छा बिंदु Patrik। कारखाने द्वारा बनाए गए ऑब्जेक्ट्स वास्तव में डेटा प्रदाता का भारी उपयोग करते हैं क्योंकि इसकी लोड विधि आवश्यक कुछ गुणों को पॉप्युलेट करती है। यह एक बहुत पहले रिफैक्टरिंग प्रयास है, लेकिन दुर्भाग्यवश यह तकनीकी ऋण का एक टुकड़ा है जिसे कम रन में भुगतान नहीं किया जा सकता है। –
ठीक है, तो इस पर विचार करें: यदि DataProvider.Load को कई बार बुलाया जाएगा, तो क्या इससे कोई समस्या आएगी? ** यदि नहीं **: कूल, मैं 'लोड'-कॉल को फ़ैक्टरी विधि में ले जाऊंगा क्योंकि यह ग्राहकों को सरल बना देगा (सभी कॉल। फैक्टरी विधि के अंदर होंगी)। ** यदि हां **: आपके पास कारखाने के बाहर रखने के अलावा कोई विकल्प नहीं है, क्योंकि आप यह नहीं जान सकते कि यह प्रारंभ किया गया है या नहीं – PatrikAkerstrand