मैं मानचित्रण प्रकारों के बारे में सर्वोत्तम प्रथाओं के बारे में और C # में विस्तार विधियों का उपयोग करके कुछ प्रश्न पूछना चाहता हूं। मुझे पता है कि इस विषय पर पिछले कुछ वर्षों में कई बार चर्चा हुई है, लेकिन मैंने बहुत सारी पोस्ट पढ़ी हैं और अभी भी संदेह है।
मेरे सामने जो समस्या थी, वह थी कक्षा को "कन्वर्ट" कार्यक्षमता के साथ। मान लीजिए कि मेरे पास वर्ग "व्यक्ति" है जो एक वस्तु का प्रतिनिधित्व करता है जिसका उपयोग कुछ तर्क द्वारा किया जाएगा। मेरे पास एक वर्ग "ग्राहक" भी है जो बाहरी एपीआई से प्रतिक्रिया का प्रतिनिधित्व करता है (वास्तव में एक से अधिक एपीआई होंगे, इसलिए मुझे प्रत्येक एपीआई की प्रतिक्रिया को सामान्य प्रकार: व्यक्ति से मैप करना होगा)। मेरे पास दोनों वर्गों के स्रोत कोड तक पहुंच है और सैद्धांतिक रूप से मैं अपने स्वयं के तरीकों को लागू कर सकता हूं। मुझे ग्राहक को व्यक्ति में बदलने की आवश्यकता है ताकि मैं इसे डेटाबेस में सहेज सकूं। परियोजना किसी भी स्वचालित मैपर का उपयोग नहीं करती है।
मेरे पास 4 संभावित समाधान हैं:
.ToPerson () उपभोक्ता वर्ग में विधि। यह सरल है, लेकिन यह मेरे लिए सिंगल रिस्पॉन्सिबिलिटी पैटर्न को तोड़ने जैसा लगता है, विशेष रूप से यह कि उपभोक्ता वर्ग को अन्य वर्गों (कुछ अन्य बाहरी एपीआई द्वारा आवश्यक) के लिए मैप किया जाता है, इसलिए इसे कई मैपिंग विधियों को शामिल करना होगा।
कंस्यूमर को एक तर्क के रूप में लेते हुए क्लास में कंस्ट्रक्शन मेपिंग। आसान भी है और सिंगल रिस्पॉन्सिबिलिटी पैटर्न को तोड़ने जैसा भी लगता है। मुझे कई मैपिंग कंस्ट्रक्टर की आवश्यकता होगी (क्योंकि एक और एपीआई से क्लास होगी, कंज्यूमर के समान डेटा प्रदान करना लेकिन थोड़े अलग प्रारूप में)
विस्तारक विधियों के साथ कन्वर्टर्स वर्ग। इस तरह से मैं लिख सकता हूँ। उपभोक्ता वर्ग के लिए .PPerson () विधि और जब एक और API को उसके स्वयं के NewConsumer वर्ग के साथ पेश किया जाता है, तो मैं बस एक और विस्तार विधि लिख सकता हूँ और इसे एक ही फ़ाइल में रख सकता हूँ। मैंने एक राय सुनी है कि विस्तार के तरीके सामान्य रूप से बुरे हैं और इसका उपयोग केवल तभी किया जाना चाहिए जब बिल्कुल आवश्यक हो ताकि मुझे वापस पकड़ा जा सके। अन्यथा मुझे यह समाधान पसंद है
कनवर्टर / मैपर वर्ग। मैं एक अलग वर्ग बनाता हूं जो रूपांतरणों को संभालेगा और उन तरीकों को लागू करेगा जो स्रोत वर्ग के उदाहरण को तर्क के रूप में लेंगे और गंतव्य वर्ग के उदाहरण को वापस करेंगे।
संक्षेप में, मेरी समस्या को प्रश्नों की संख्या तक कम किया जा सकता है (जो मैंने ऊपर वर्णित है, उसके संदर्भ में):
क्या रूपांतरण विधि (POCO?) ऑब्जेक्ट को अंदर रखा जा रहा है (जैसे .Toerson () विधि को उपभोक्ता वर्ग में) एकल जिम्मेदारी पैटर्न को तोड़ने के रूप में माना जाता है?
एकल जिम्मेदारी पैटर्न को तोड़ने पर विचार करने वाले (डीटीओ-जैसे) वर्ग में कंस्ट्रक्टिंग कंस्ट्रक्टर का उपयोग किया जाता है? विशेष रूप से अगर ऐसे वर्ग को कई स्रोत प्रकारों से परिवर्तित किया जा सकता है, तो एकाधिक परिवर्तित निर्माणकर्ताओं की आवश्यकता होगी?
क्या मूल विधि स्रोत कोड तक पहुँच प्राप्त करते समय विस्तार विधियों का उपयोग करना बुरा व्यवहार माना जाता है? क्या इस तरह के व्यवहार को तर्क को अलग करने के लिए व्यवहार्य पैटर्न के रूप में इस्तेमाल किया जा सकता है या यह एक विरोधी पैटर्न है?
Person
क्लास एक डीटीओ है? क्या इसमें कोई व्यवहार है?