क्या "मैपर" एक मान्य डिज़ाइन पैटर्न है या क्या यह "फ़ैक्टरी" पैटर्न की भिन्नता है?


37

एक सामान्य पैटर्न जो मैं देख रहा हूं वह यह है कि Mapperपैटर्न के रूप में जाना जाता है ( DataMapperजिसके साथ भ्रमित नहीं होना पूरी तरह से कुछ और है), जो एक तर्क के रूप में कुछ "कच्चे" डेटा स्रोत (जैसे एक ADO.NET DataReaderया DataSet) और फ़ील्ड को मैप करता है किसी व्यवसाय / डोमेन ऑब्जेक्ट पर गुण। उदाहरण:

class PersonMapper
{
    public Person Map(DataSet ds)
    {
        Person p = new Person();
        p.FirstName = ds.Tables[0].Rows[0]["FirstName"].ToString();
        // other properties...
        return p;
    }
}

आपके गेटवे / डीएओ / रिपॉजिटरी / आदि का विचार। लौटने से पहले मैपर में कॉल करेंगे, ताकि आपको एक समृद्ध व्यवसाय वस्तु बनाम अंतर्निहित डेटा कंटेनर मिल सके।

हालाँकि, यह संबंधित प्रतीत होता है, यदि समान नहीं, तो फैक्ट्री पैटर्न (DDD parlance, anyways) में, जो एक डोमेन ऑब्जेक्ट का निर्माण और रिटर्न करता है। विकिपीडिया यह पुनः कहता है: डीडीडी फैक्टरी:

फैक्ट्री: डोमेन ऑब्जेक्ट बनाने के तरीकों को एक विशेष फैक्ट्री ऑब्जेक्ट में सौंपना चाहिए, ताकि वैकल्पिक कार्यान्वयन आसानी से परस्पर जुड़ सकें।

केवल उस अंतर से जो मैं सोच सकता था, वह यह है कि DDD- स्टाइल फैक्ट्री को पैरामीटर बनाया जा सकता है ताकि यह एक विशेष प्रकार की वस्तु को लौटा सके यदि आवश्यकता उत्पन्न हुई (जैसे BusinessCustomer बनाम ResidentialCustomer) जबकि "मैपर" एक विशिष्ट वर्ग के लिए रखा गया है। और केवल अनुवाद करता है।

तो क्या इन दोनों प्रतिमानों में कोई अंतर है या वे मूल रूप से अलग-अलग नामों से एक ही हैं?


क्या यह ओआरएम से अलग है और यदि हां, तो अंतर कहां है?
जेबी किंग

ORM आपके लिए स्वचालित रूप से मैपिंग को संभालते हैं - यह एक ऐसे परिदृश्य के लिए अधिक है जहां आप ORM का उपयोग नहीं कर सकते (या अपनी स्वयं की डेटा परत / पतली ORM लिखना है)
वेन मोलिना

1
मैं वास्तव में यह देखने के लिए संघर्ष कर रहा हूं कि डेटामैपर कैसे "पूरी तरह से कुछ और है।"
pdr

शायद मैं गलत हूं - मुझे लगा कि DataMapperपैटर्न ने डेटाबेस को स्वयं एक्सेस किया है, जबकि यह "मैपर" डेटाबेस से नहीं खींचता है, बस किसी प्रकार के परिणाम सेट को ऑब्जेक्ट में परिवर्तित करता है।
वेन मोलिना

martinfowler.com/eaaCatalog/dataMapper.html मैं देख रहा हूँ कि आपका क्या मतलब है लेकिन, उस अंतिम पैराग्राफ को पढ़ना, यह सही है। PEAA कैटलॉग को देखें। martinfowler.com/eaaCatalog/index.html । आप जो वर्णन कर रहे हैं, वह निश्चित रूप से एक प्रकार का मैपर है, और बाकी की तुलना में डेटामैपर अधिक बारीकी से फिट बैठता है।
pdr

जवाबों:


23

हालाँकि यह पहली बार मैपर पैटर्न के बारे में सुना है, मेरे लिए यह फ़ैक्टरी के बजाय बिल्डर पैटर्न की तरह लगता है।

फैक्ट्री पैटर्न में आप कई संबंधित वर्गों की वस्तुओं को बनाने के लिए तर्क को अलग कर देते हैं। मुख्य उदाहरण एक ऐसी स्थिति होगी जहां आपको कुछ मापदंडों के आधार पर कुछ सार आधार वर्ग के किसी विशेष उपवर्ग का एक ऑब्जेक्ट बनाने की आवश्यकता होती है। इसलिए एक फैक्ट्री हमेशा एक पॉइंटर या बेस क्लास के लिए एक संदर्भ देता है, लेकिन यह वास्तव में आपके द्वारा दिए गए मापदंडों के आधार पर उपयुक्त व्युत्पन्न वर्ग का एक ऑब्जेक्ट बनाता है।

इसके विपरीत, एक बिल्डर वर्ग हमेशा एक ही वर्ग की वस्तुएं बनाता है। यदि कोई वस्तु का निर्माण जटिल है, तो आप इसका उपयोग करेंगे, जैसे कि इसके निर्माता बहुत से तर्क देते हैं, जो सभी तुरंत उपलब्ध नहीं हो सकते हैं। तो एक बिल्डर ऑब्जेक्ट एक ऐसा स्थान हो सकता है जो कंस्ट्रक्टर के तर्कों के लिए मूल्यों को संग्रहीत करता है जब तक कि आप उन सभी के पास नहीं होते हैं और "उत्पाद" बनाने के लिए तैयार होते हैं, या यह उचित डिफ़ॉल्ट मान प्रदान कर सकता है और आपको केवल उन तर्कों को निर्दिष्ट करने की आवश्यकता होती है जिनके मूल्य आपको चाहिए परिवर्तन। बिल्डर पैटर्न के लिए एक विशिष्ट उपयोग का मामला उन वस्तुओं को बनाने के लिए है जिनकी आपको एक इकाई परीक्षण में आवश्यकता हो सकती है, ताकि सभी सृजन तर्क के साथ परीक्षा कोड को अव्यवस्थित करने से बचा जा सके।

मेरे लिए एक मैपर एक बिल्डर के संस्करण की तरह लगता है, जहां निर्माण पैरामीटर डेटाबेस रिकॉर्ड या कुछ अन्य "कच्चे" डेटा संरचना के रूप में आते हैं।


हम्म मैंने बिल्डर के बारे में सुना था, लेकिन 100% इस बात से अवगत नहीं था कि यह क्या हुआ - इससे स्पष्ट बातें सामने आईं! यह लगभग प्रमुख अंतर की तरह लगता है फैक्ट्री एक इंटरफ़ेस / अमूर्त वर्ग देता है जो वास्तव में एक ठोस वर्ग है जो मापदंडों पर आधारित है (यदि यह समझ में आता है) जबकि एक बिल्डर / मैपर वास्तविक डेटा लेता है और उन गुणों के बिना मैप करता है, बिना (यदि कोई हो) तर्क के। ?
वेन मोलिना

1
@Waine एम: बहुत ज्यादा। हालांकि एक बिल्डर में बहुत सारे तर्क हो सकते हैं, क्योंकि गुणों के लिए डेटा की मैपिंग सीधे आगे नहीं हो सकती है। वास्तव में, एक बिल्डर में अन्य बिल्डरों के पैरामीटर का निर्माण हो सकता है। :)
दिमा

5
बिल्डर पैटर्न आपको समय के साथ एक जटिल (आमतौर पर अपरिवर्तनीय) वस्तु का निर्माण करने के लिए आवश्यक सभी जानकारी डालने की अनुमति देता है और फिर प्रक्रिया के अंत में वस्तु को तुरंत हटा देता है। यहां ऐसा नहीं है।
पीडीआर

+1 सहमत हैं कि यह एक समझदार दृष्टिकोण है, जिसमें डीटीओ ऑब्जेक्ट्स और डोमेन मॉडल ऑब्जेक्ट्स के बीच मध्यस्थ के रूप में कार्य करने के लिए एक अलग 'मैपर' वर्ग है। यह तब भी काम आता है जब निर्माण के समय डोमेन मॉडल ऑब्जेक्ट को कुछ विशेष स्थिति में रखा जाना चाहिए (यानी .NET ISupportInitialize इंटरफ़ेस)।
15

@pdr, मैं मानता हूं कि एक मैपर बिलकुल बिल्डर जैसा नहीं है, क्योंकि सभी डेटा एक ही बार में उपलब्ध हैं। लेकिन यह बहुत समान है, क्योंकि यह केवल एक प्रकार की वस्तुओं का निर्माण करता है।
दीमा

8

मैपर, बिल्डर और फैक्ट्री के बारे में एकमात्र सामान्य बात यह है कि वे एक "निर्मित उत्पाद" - और एक प्रकार का ऑब्जेक्ट उदाहरण प्रदान करते हैं। किसी भी भ्रम से बचने के लिए, मैं उनकी संबंधित परिभाषा के लिए निम्नलिखित चर्चा कर रहा हूं।

  1. मैपर - जो यहां बताया गया है उसके करीब: http://www.codeproject.com/KB/library/AutoMapper.aspx । यह बिल्कुल ऊपर जैसा नहीं है - लेकिन निकटतम मैं मैपर के बारे में पाया।

  2. बिल्डर - जैसा कि यहाँ परिभाषित किया गया है: http://www.oodesign.com/builder-pattern.html

  3. फैक्टरी - यहाँ परिभाषित किया गया है: http://www.oodesign.com/factory-pattern.html

मैपर अनिवार्य रूप से बाहर के अंदर एक निर्माता है। कुछ समय के लिए मान लीजिए, यदि आपके पास मैपर नहीं है - जब आपको वैसे भी कई मापदंडों के सेट की आवश्यकता होती है, तो वे कंस्ट्रक्टर पर सभी तर्क होते हैं। अब जैसे-जैसे चीजें विकसित होती हैं, कुछ अनुप्रयोगों को अतिरिक्त विशेषताओं के बारे में पता नहीं होता है, जिन्हें निर्माणकर्ता के अधीन जाने की आवश्यकता होती है, जहां या तो यह गणना करता है या डिफ़ॉल्ट का उपयोग करता है। महत्वपूर्ण बात यह है कि मैपर आपके लिए ऐसा कर सकता है - और यह अधिक उपयोगी होगा यदि निर्माण के लिए इस तरह के एल्गोरिदम को तय करने के लिए बाहरी वस्तुओं से जुड़ाव हो।

बिल्डर मैपर से बहुत अलग है। एक बिल्डर आवश्यक है जब वस्तु के कई हिस्सों का उपयोग करके एक पूर्ण वस्तु की रचना की जाती है। यह कई हिस्सों को एक साथ फिट करके वस्तुओं को इकट्ठा करने जैसा है। यहां तक ​​कि व्यक्तिगत भाग की वस्तुओं का आरंभीकरण अन्य भागों के अस्तित्व से संबंधित है।

फैक्ट्री पैटर्न शुरू में बहुत सरल लगता है। यह एक नई निर्मित वस्तुओं को लौटाता है। यदि कोई भी सामान्य कंस्ट्रक्टर मुझे नए () जैसे ऑपरेटर का उपयोग करके पूरी तरह कार्यात्मक उदाहरण दे सकता है? मुझे ऐसे कारखाने की आवश्यकता क्यों होगी जो मुझे समान परिणाम दे?

हालांकि, फ़ैक्टरी पैटर्न का उपयोग आमतौर पर बहुत विशिष्ट है; हालांकि सबसे अधिक बार, साहित्य में प्रदर्शित नहीं किया जाता है जहां यह लागू होता है। आमतौर पर, एक एप्लिकेशन एक फैक्ट्री बनाता है जिसे विभिन्न ऑब्जेक्ट्स को साझा किया जाता है जिन्हें निष्पादन के दौरान इस तरह के उत्पाद ऑब्जेक्ट बनाने की आवश्यकता होती है। जब ऐसे कई उत्पाद बनाए जाते हैं, तो फैक्ट्री विधि उदाहरण के लिए कुछ नीति के आधार पर वस्तुओं के निर्माण की अनुमति देती है , एक निश्चित टेम्प्लेट को बाध्य कर सकती है जिसका उपयोग फैक्ट्री विधि द्वारा किया जाता है जब सभी ऑब्जेक्ट बनाए जाते हैं। यह न तो एक बिल्डर विधि की तरह है; यहाँ उत्पाद केवल एक (और स्वतंत्र) है। यह भी मैपर की तरह नहीं है; ग्राहक के अनुसार वस्तु बनाने के लिए बाहरी डेटा सेट वास्तव में न्यूनतम है। फैक्ट्री पैटर्न वास्तव में प्रदान करता है (जैसा कि नाम से पता चलता है) एक समान समान उत्पाद वस्तुएं!

Dipan।


4

आपके प्रश्न का उत्तर: "मैपर" एक वैध डिज़ाइन पैटर्न है? हां है। मैपर पैटर्न, अनुवादक पैटर्न की तरह भी जाना जाता है और एक प्रलेखित पैटर्न है: http://www.iro.umontreal.ca/~keller/Layla/translator.pdf


4

जैसा कि मैं जवाबों को देखता हूं मैं उत्तरदाताओं को सभी शब्दार्थिक गलत उत्तर प्रदान करता हूं। मुझे लगता है कि यह इसलिए है क्योंकि आप सभी प्रश्न पर केंद्रित हैं, जो इस बात पर केंद्रित है कि मैपर कारखाने या बिल्डर से कैसे संबंधित है।

जब वास्तव में मैपर कारखाने या बिल्डर के समान नहीं है। मैपर एडॉप्टर पैटर्न (GoF parlance का उपयोग करके) की तरह है। एडेप्टर पैटर्न एक प्रतिनिधित्व को दूसरे में बदलने के लिए कार्यक्षमता प्रदान करता है। ओपी ADO.NET में DataSet और DataReader को संदर्भित करता है - अच्छी तरह से SqlDataAdapter के बारे में कैसे? जवाब नाम में है। मैपर उस चीज का एक नया नाम है जिसे पुराने प्रोग्रामर लंबे समय से जानते हैं: एडेप्टर।

मैपर एक प्रतिनिधित्व को दूसरे में बदल देता है - एडेप्टर पैटर्न की बहुत परिभाषा।


1

यहां जो आप कर रहे हैं वह वास्तव में कुछ प्रकार का रूपांतरण है (आप अपने कच्चे डेटा को एक व्यावसायिक वस्तु में बदलते हैं)। आप फैक्ट्री पैटर्न का उपयोग सटीक तरीके से करने के लिए कर सकते हैं (यानी, प्रकार रूपांतरण), इसलिए, हाँ, किसी तरह से, आपकी कक्षा एक कारखाना है (हालांकि मैं उसके लिए एक स्टेटिक फैक्टरी का उपयोग करूंगा )।


0

ऑब्जेक्ट बनाने के लिए बिल्डर्स जटिल व्यावसायिक तर्क को अतिक्रमण करते हैं। दूसरी ओर मैपर को एक से दूसरे खेत को कॉपी करना चाहिए।

उदाहरण के लिए नक्शा करने के लिए डोमेन कर्मचारी वस्तु डाटाबेस कर्मचारी वस्तु से, नक्शा से ग्राहकों का अनुबंध करने के लिए डोमेन कर्मचारी वस्तु।

दूसरी ओर बिल्डर्स ऑब्जेक्ट बनाने के लिए कई व्यावसायिक निर्णयों की मेजबानी करते हैं । सिंगल रिस्पॉन्सिबिलिटी के दृष्टिकोण से, यह समझ में आता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.