आटोमैपर .Net के लिए एक "ऑब्जेक्ट-ऑब्जेक्ट मैपर" है, जिसका अर्थ है कि एक वर्ग से दूसरे वर्ग में वस्तुओं की नकल करना जो एक ही चीज़ का प्रतिनिधित्व करता है।
यह कभी क्यों उपयोगी है? क्या कक्षाओं का दोहराव कभी उपयोगी / अच्छा डिज़ाइन है?
आटोमैपर .Net के लिए एक "ऑब्जेक्ट-ऑब्जेक्ट मैपर" है, जिसका अर्थ है कि एक वर्ग से दूसरे वर्ग में वस्तुओं की नकल करना जो एक ही चीज़ का प्रतिनिधित्व करता है।
यह कभी क्यों उपयोगी है? क्या कक्षाओं का दोहराव कभी उपयोगी / अच्छा डिज़ाइन है?
जवाबों:
एक त्वरित Google खोज ने इस उदाहरण को प्रकट किया:
http://www.codeproject.com/Articles/61629/AutoMapper
AutoMapper का पूरी तरह से वैध उपयोग दिखा रहा है जो निश्चित रूप से खराब डिज़ाइन के लिए एक उदाहरण नहीं है। एक स्तरित अनुप्रयोग में, आपके पास अपने डेटा या व्यावसायिक परत में ऑब्जेक्ट हो सकते हैं, और आपको कभी-कभी उस डेटा ऑब्जेक्ट की विशेषताओं का एक सबसेट या अपनी UI परत में किसी प्रकार के दृश्य की आवश्यकता होती है। तो आप एक दृश्य मॉडल बनाते हैं जिसमें आपके यूआई में उन विशेषताओं के साथ ऑब्जेक्ट होते हैं जिनकी आपको आवश्यकता होती है, अधिक नहीं, और कम बायलरप्लेट कोड वाली उन वस्तुओं की सामग्री प्रदान करने के लिए ऑटोमैपर का उपयोग करें।
ऐसी स्थिति में आपकी "दृश्य वस्तुएं" मूल वर्ग की नकल नहीं हैं। उनके पास अलग-अलग तरीके हैं और शायद कुछ डुप्लिकेट विशेषताएँ हैं। लेकिन यह ठीक है कि जब तक आप केवल यूआई प्रदर्शन उद्देश्यों के लिए उस दृश्य वस्तुओं का उपयोग करते हैं और डेटा हेरफेर या व्यावसायिक कार्यों के लिए उनका दुरुपयोग शुरू नहीं करते हैं।
एक और विषय जिसे आप पढ़ सकते हैं, यह समझने के लिए बेहतर है कि फाउडर्स कमांड क्वेरी रिस्पॉन्सिबिलिटी सेग्रीगेशन पैटर्न, सीआरयूडी के विपरीत है। यह उन स्थितियों को दिखाता है जहां डेटा को क्वेरी करने और उन्हें डेटाबेस में अपडेट करने के लिए विभिन्न ऑब्जेक्ट मॉडल समझ में आते हैं। यहाँ, AutoMapper जैसे टूल द्वारा एक ऑब्जेक्ट मॉडल से दूसरे में मैपिंग भी की जा सकती है।
क्या कक्षाओं का दोहराव कभी उपयोगी / अच्छा डिज़ाइन है?
यूआई लेयर में उपयोग के लिए एक अलग व्यू मॉडल क्लास रखने की इसकी अच्छी प्रैक्टिस उसी क्लास का उपयोग करने के बजाय है जो डेटा लेयर में उपयोग की जाती है। आपके UI / वेब पेज को अन्य जानकारी को प्रदर्शित करने की आवश्यकता हो सकती है जो डेटा इकाई से कड़ाई से संबंधित नहीं हैं। इस अतिरिक्त कक्षा को बनाकर, आप समय के साथ आवश्यकताएं बदलने के साथ अपने यूआई को आसानी से ट्विस्ट करने की स्वतंत्रता दे रहे हैं।
जहाँ तक AutoMapper का उपयोग करने की बात है, मैं व्यक्तिगत रूप से 3 कारणों से इससे बचता हूँ:
मौन विफलता अधिक सामान्य है
क्योंकि AutoMapper स्वचालित रूप से गुणों के बीच मैप करता है, एक वर्ग पर एक संपत्ति का नाम बदल रहा है और दूसरा नहीं जिससे संपत्ति मैपिंग को छोड़ दिया जाएगा। संकलक को पता नहीं चलेगा। Automapper परवाह नहीं करेगा।
स्थिर विश्लेषण का अभाव
जिससे निपटने के लिए आपको एक बड़ा कोड आधार दिया गया है। एक लाख गुण वाली एक लाख कक्षाएं हैं। जैसे वे उपयोग नहीं कर रहे हैं, या डुप्लिकेट हैं जैसे दिखते हैं। विज़ुअल स्टूडियो में "सभी संदर्भ खोजें" टूल आपको यह देखने में मदद करेगा कि गुण कहाँ उपयोग किए जाते हैं और आपके सिर में एक नक्शा बनाने में मदद करते हैं कि पूरा आवेदन एक साथ कैसे लटका हुआ है। लेकिन रुकिए, आधे गुणों का कोई स्पष्ट संदर्भ नहीं है क्योंकि ऑटोमैपर का उपयोग किया जा रहा है। मेरा काम अब बहुत कठिन है।
देर से आवश्यकताएं जो जटिलता को बढ़ाती हैं
आटोमैपर सभी ठीक है और बांका है जब आप सभी करना चाहते हैं तो एक वर्ग से दूसरे में मूल्यों को कॉपी करें (जैसा कि अक्सर विकास के START पर मामला होता है), लेकिन उन आवश्यकताओं को याद रखें जो समय के साथ बदलते हैं? यदि आपको अब अपने एप्लिकेशन के अन्य हिस्सों से मान प्राप्त करने की आवश्यकता है, तो शायद उस उपयोगकर्ता के लिए विशिष्ट है जो लॉग इन या किसी अन्य संदर्भ स्थिति में है?
आवेदन शुरू होने पर एक-से-एक वर्ग मैपिंग बनाने का ऑटोमैपर का पैटर्न इस प्रकार के संदर्भ-विशिष्ट परिवर्तनों के लिए खुद को अच्छी तरह से उधार नहीं देता है। हां, शायद इसे बनाने के तरीके हैं, लेकिन मैं आमतौर पर इसे स्वयं को लिखने के लिए क्लीनर, सरल और अधिक अभिव्यंजक पाता हूं।
सारांश में, अपने आप को 30 सेकंड तक मैन्युअल रूप से सहेजने से पहले एक कक्षा से दूसरे वर्ग को मैप करने के लिए ऑटोमैपर तक पहुंचने से पहले, इस बारे में सोचें।
प्रोग्रामिंग दूसरे मानव को यह बताने की कला है कि कंप्यूटर क्या करना चाहता है। - डोनाल्ड नथ
इसे ध्यान में रखते हुए, अपने आप से पूछें "आज AutoMapper सहायक है और क्या यह कल होगा?"
मेरे अनुभव में, जब किसी ने 'बहुत अधिक बॉयलरप्लेट' के बारे में शिकायत की है और ऑटोमैपर का उपयोग करना चाहता है, तो यह निम्नलिखित में से एक है:
तथापि:
यदि आपने एक सांख्यिकीय रूप से टाइप की गई भाषा को चुना है, तो भाषा का लाभ उठाएं। यदि आप भाषा में उन नियंत्रणों को दरकिनार करने का प्रयास कर रहे हैं जो प्रतिबिंब और जादू APIs जैसे AutoMapper के अधिक उपयोग के कारण गलतियों को रोकने में मदद करते हैं, तो इसका मतलब है कि आपने अपनी आवश्यकताओं के लिए असंतोषजनक भाषा को चुना है।
इसके अलावा, सिर्फ इसलिए कि Microsoft ने C # में सुविधाओं को जोड़ा है, इसका मतलब यह नहीं है कि वे हर स्थिति में निष्पक्ष खेल हैं या वे सर्वश्रेष्ठ अभ्यास का समर्थन करते हैं। परावर्तन और 'डायनामिक' कीवर्ड, उदाहरण के लिए, उन मामलों में उपयोग किया जाना चाहिए जहां आप बस उनके बिना क्या जरूरत को पूरा नहीं कर सकते। AutoMapper किसी भी उपयोग के मामले के लिए एक समाधान नहीं है जो पहले से ही इसके बिना हल नहीं किया जा सकता है।
तो, क्या वर्गों का दोहराव खराब डिजाइन है? जरुरी नहीं।
क्या AutoMapper एक बुरा विचार है? हाँ बिल्कुल।
AutoMapper का उपयोग परियोजना में प्रणालीगत कमियों को इंगित करता है। यदि आप अपने आप को इसकी आवश्यकता पाते हैं, तो रोकें और अपने डिजाइन के बारे में सोचें। आपको हमेशा एक बेहतर, अधिक पठनीय, अधिक रख-रखाव और अधिक बग-मुक्त डिज़ाइन मिलेगा।
यहाँ एक गहरा मुद्दा है: तथ्य यह है कि C # और Java अधिकांश / सभी प्रकारों को संरचना के बजाय नाम से भिन्न होना चाहिए: उदाहरण के लिए class MyPoint2D
और class YourPoint2D
अलग-अलग प्रकार हैं भले ही उनकी सटीक परिभाषाएँ हों। जब आप चाहते हैं कि "एक x
क्षेत्र और एक y
क्षेत्र के साथ कुछ गुमनाम चीज " (यानी एक रिकॉर्ड ) है, तो आप भाग्य से बाहर हैं। इसलिए जब आप एक YourPoint2D
को एक में बदलना चाहते हैं MyPoint2D
, तो आपके पास तीन विकल्प हैं:
this.x = that.x; this.y = that.y
चॉइस 1 छोटी खुराकों में काफी आसान है, लेकिन जल्दी से एक कोर बन जाता है जब आपको मैप करने के लिए आवश्यक प्रकारों की संख्या बड़ी होती है।
चॉइस 2 वांछनीय से कम है क्योंकि अब आपको कोड बनाने के लिए अपनी निर्माण प्रक्रिया में एक अतिरिक्त कदम जोड़ना होगा, और यह सुनिश्चित करना होगा कि पूरी टीम को मेमो मिले। सबसे खराब स्थिति में आपको अपने स्वयं के कोड जनरेटर या टेम्पलेट सिस्टम को भी रोल करना होगा।
जो आपको प्रतिबिंब के साथ छोड़ देता है। आप इसे स्वयं कर सकते हैं, या आप AutoMapper का उपयोग कर सकते हैं।
ऑटोमैपर उन पुस्तकालयों / उपकरणों में से एक है जहां सम्राट सचमुच बट नग्न के आसपास चल रहा है। जब आप glitzy लोगो को पा लेते हैं, तो आपको एहसास होता है कि आप ऐसा कुछ भी नहीं कर सकते जो आप स्वयं बेहतर परिणामों के साथ नहीं कर सकते।
हालांकि मुझे पूरी तरह से यकीन नहीं है कि यह ऑटो-मैपिंग सदस्यों पर कैसे संकेत देता है, लेकिन इसमें सबसे अधिक संभावना अतिरिक्त रनटाइम लॉजिक और संभावित प्रतिबिंब शामिल है। यह समय की बचत के बदले एक महत्वपूर्ण प्रदर्शन जुर्माना हो सकता है। दूसरी ओर मैनुअल मैपिंग, संकलन समय से पहले संकेत को अच्छी तरह से निष्पादित किया जाता है।
ऐसे मामलों में जहां AutoMapper का कोई सुराग नहीं है, आपको कोड और सेटिंग झंडे के साथ मैपिंग को कॉन्फ़िगर करना होगा। यदि आप सभी सेटअप और कोड काम करने से परेशान हैं, तो आपको सवाल करना होगा कि यह मैनुअल मैपिंग पर कितना बचाता है।