एमवीवीएम का उपयोग किन परिस्थितियों में उचित है?


47

Microsoft द्वारा यूआई विकास प्लेटफार्मों को लक्षित करने के लिए मॉडल व्यू व्यू-मॉडल विकसित किया गया था जो एक्सएएमएल और .NET भाषाओं का उपयोग करके .NET प्लेटफॉर्म पर विशेष रूप से विंडोज प्रेजेंटेशन फाउंडेशन (WPF) और सिल्वरलाइट का समर्थन करता है। के बाद के वर्षों में, कई जावास्क्रिप्ट फ्रेमवर्क जैसे कि कोणीय, नॉकआउट और एक्सटीजेएस ने पैटर्न को अपनाया है।

यहाँ छवि विवरण दर्ज करें

अधिकांश सॉफ्टवेयर पैटर्न की तरह, MVVM के पास इसके उचित उपयोग और इसके दुरुपयोग हैं। एमवीवीएम का उपयोग किन परिस्थितियों में उचित है? यह कब बीमार है?


4
अफसोस की बात है कि वास्तविक दुनिया में बहुत सी जटिलताएँ हैं जिन्हें ठीक से परिभाषित नहीं किया जा सकता है। एक निश्चित बिंदु से परे, यह कहना संभव नहीं है कि यह किस पर निर्भर करता है - हालांकि प्रत्येक विशेष मामला दुर्लभ है, संभव विशेष मामलों की सीमा अनंत है, और वे सभी तब तक स्पॉट नहीं किए जा सकते जब तक वे नहीं होते। कुछ बिंदु पर, आपको बस पैटर्न आदि के लिए अंतर्निहित लक्ष्यों के बारे में पता होना चाहिए, और उन लक्ष्यों को प्राप्त नहीं होने पर पहचानने में सक्षम होना चाहिए। इसके लिए कोई सही योजना नहीं है, लेकिन अनुभव मदद करता है।
स्टीव 314

1
@ स्टीव 314 यह तर्कपूर्ण है। मैं कहता हूं कि यह इस पर निर्भर करता है: MVVM को एक सुंदर डिज़ाइन के रूप में प्राप्त न होने दें, और निश्चित रूप से इसे अपने उत्पाद को शिपिंग करने से रोकने न दें।
ल्यूक पुप्लेट

@ ल्यूक - यह सच है, लेकिन मेरी बात यह भी थी कि आपको अपने उत्पाद को शिपिंग के लिए एक सुंदर डिज़ाइन को बंद नहीं करने देना चाहिए। एक अच्छा डिजाइन पैटर्न केवल इतना अच्छा है जब तक आप इसे उचित रूप से उपयोग करते हैं, और जब तक वास्तविक दुनिया खुद व्यवहार नहीं करती है।
स्टीव ३४

@ स्टीव 314 रोजर कि।
ल्यूक पुप्लेट

जवाबों:


19

MVVM का उपयोग करने का इरादा है जहां उच्च-निष्ठा UI का उपयोग करने वाले जटिल उपयोगकर्ता इंटरैक्शन की आवश्यकता होती है (यानी WPF )।

MVVM को आधुनिक UI डेवलपमेंट प्लेटफ़ॉर्म (Windows Presentation Foundation, या WPF, और Silverlight) पर लक्षित किया गया है, जिसमें एक उपयोगकर्ता अनुभव (UXi) डेवलपर है, जिसके पास अधिक "पारंपरिक" डेवलपर (जैसे कि व्यावसायिक तर्क की ओर उन्मुख) से भिन्न आवश्यकताएं हैं बैक एंड डेवलपमेंट)। MVVM का व्यू-मॉडल "मूल रूप से स्टेरॉयड पर एक वैल्यू कन्वर्टर है", जिसका अर्थ है कि व्यू-मॉडल मॉडल से डेटा ऑब्जेक्ट्स को इस तरह से उजागर करने के लिए जिम्मेदार है कि उन ऑब्जेक्ट्स को आसानी से प्रबंधित और उपभोग किया जाता है। इस संबंध में, व्यू-मॉडल व्यू की तुलना में अधिक मॉडल है, और सभी के डिस्प्ले लॉजिक नहीं होने पर सबसे अधिक संभालता है।

MVVM को WPF में विशिष्ट कार्यों का उपयोग करने के लिए डिज़ाइन किया गया था ताकि व्यू लेयर से लगभग सभी "कोड-पीछे" को हटाकर बाकी लेयर से व्यू लेयर डेवलपमेंट को अलग किया जा सके। दृश्य कोड लिखने के लिए इंटरएक्टिव डिजाइनरों की आवश्यकता के बजाय, वे मूल WPF मार्कअप भाषा XAML का उपयोग कर सकते हैं और ViewModel के लिए बाइंडिंग बना सकते हैं, जो कि एप्लिकेशन डेवलपर्स द्वारा लिखा और बनाए रखा जाता है। भूमिकाओं का यह अलगाव इंटरएक्टिव डिजाइनरों को प्रोग्रामिंग या व्यावसायिक तर्क के बजाय यूएक्स की जरूरतों पर ध्यान केंद्रित करने की अनुमति देता है, जिससे एक आवेदन की परतों को कई कार्य धाराओं में विकसित किया जा सकता है।

UI के लिए जहां इस तरह की समृद्ध सहभागिता की आवश्यकता नहीं है, MVVM ओवरकिल हो सकता है; एमवीपी एक अधिक प्राकृतिक विकल्प हो सकता है। वेब अनुप्रयोगों के लिए, एमवीसी एक बेहतर फिट है। बहुत छोटे अनुप्रयोगों के लिए जो कभी भी बड़े नहीं होंगे (जैसे कि छोटे Winforms उपयोगिताओं), कोड-पीछे पर्याप्त है।


1
कुछ वर्षों में तेजी से आगे बढ़ें: आप नॉकआउट के बारे में कैसा महसूस करते हैं? WPF से आने के बाद मैंने इसका इस्तेमाल किया और यह जानकर सुखद आश्चर्य हुआ कि WPF की तुलना में यह कितना हल्का महसूस हुआ और इसने मेरे लिए बहुत सारे "ओवरकिल" पहलू को छीन लिया।
जे त्राना

15

कभी-कभी एमवीवीएम एक जाल हो सकता है। मेरे अनुभव से यह CRUD जैसे एप्लिकेशन (डेटा पर प्रपत्र) बनाम अधिक कार्य-उन्मुख UI के पक्ष में है। मैं यह नहीं कह रहा हूं कि यह एप्लिकेशन में बैक एंड / अन्य लेयर्स के लिए खराब आर्किटेक्चर का अर्थ है, लेकिन मैंने "DDD लाइट" आर्किटेक्चर के साथ बहुत सारे MVVM एप्लिकेशन को आते देखा है। मुझे नहीं पता कि हो सकता है कि शायद इसलिए क्योंकि बंधन इतना आसान है और POCO / Anemic डोमेन ऑब्जेक्ट का उपयोग करके ORM और MVVM / बाइंडिंग के साथ एप्लिकेशन सेटअप करना बहुत सरल है।


10
कल्पना के विकासकर्ता की कमी पैटर्न की विफलता नहीं है। टास्क-ओरिएंटेड ViewModels बनाने में काफी आसान है।
शॉन

6
आप उन कुछ योगों का विस्तार करना चाह सकते हैं।
रोमन रेनर

13

MVVM खराब डिज़ाइन की गई डेटा बाइंडिंग परतों के लिए एक बैंड-सहायता है। विशेष रूप से, WPF / XAML में डेटा बाइंडिंग में सीमाओं के कारण WPF / सिल्वरलाइट / WP7 दुनिया में इसका बहुत उपयोग देखा गया है।

अब से, हम यह मानने जा रहे हैं कि हम WPF / XAML के बारे में बात कर रहे हैं क्योंकि इससे चीजें अधिक स्पष्ट होंगी। एमवीवीएम को WPF / XAML में हल करने के लिए कुछ कमियों को देखते हैं।

यूआई आकार बनाम डेटा आकार

MVVM में 'VM', C # में परिभाषित वस्तुओं का एक समूह बनाता है, जो XAML में परिभाषित प्रस्तुति वस्तुओं के एक सेट पर मैप करता है। ये C # ऑब्जेक्ट आमतौर पर प्रस्तुति ऑब्जेक्ट्स पर DataContext गुणों के माध्यम से XAML से जुड़े होते हैं।

परिणामस्वरूप, viewmodel ऑब्जेक्ट ग्राफ़ को आपके एप्लिकेशन की प्रस्तुति ऑब्जेक्ट ग्राफ़ पर मैप करने की आवश्यकता होती है। यह कहने के लिए नहीं है कि मैपिंग को एक-से-एक होने की आवश्यकता है, लेकिन यदि एक सूची नियंत्रण एक विंडो नियंत्रण द्वारा निहित है, तो उस सूची के डेटा का वर्णन करने वाले ऑब्जेक्ट के लिए विंडो के DataContext ऑब्जेक्ट से प्राप्त करने का एक तरीका होना चाहिए।

व्यूमॉडल ऑब्जेक्ट ग्राफ यूआई ऑब्जेक्ट ग्राफ से मॉडल ऑब्जेक्ट ग्राफ को सफलतापूर्वक डिकोड करता है, लेकिन एक अतिरिक्त दृश्यमॉडल परत की कीमत पर जिसे बनाया और बनाए रखा जाना चाहिए।

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

आसन्न डेटा बाइंडिंग के आसपास काम करना

WPF / XAML बाइंडिंग अपर्याप्त रूप से अभिव्यंजक हैं। आप मूल रूप से एक ऑब्जेक्ट प्राप्त करने का एक तरीका प्रदान करते हैं, ट्रैवर्स के लिए एक संपत्ति पथ, और प्रस्तुति ऑब्जेक्ट के लिए डेटा प्रॉपर्टी के मूल्य को अनुकूलित करने के लिए कन्वर्टर्स को बाइंड करते हैं।

यदि आपको C # से अधिक जटिल किसी संपत्ति को बांधने की आवश्यकता है, तो आप मूल रूप से भाग्य से बाहर हैं। मैंने कभी भी एक बाध्यकारी कनवर्टर के बिना WPF ऐप नहीं देखा है जो विज़िबल / Collapsed में सच / गलत निकला है। कई WPF एप्स में NegatingVisibilityConverter या इसी तरह की कुछ चीजें होती हैं जो ध्रुवता को प्रवाहित करती हैं। यह अलार्म घंटियाँ सेट किया जाना चाहिए।

एमवीवीएम आपको अपने सी # कोड को संरचित करने के लिए दिशानिर्देश देता है जिसका उपयोग इस सीमा पर सुचारू करने के लिए किया जा सकता है। आप SomeButtonVisibility नामक अपने व्यूमॉडल पर एक संपत्ति का पर्दाफाश कर सकते हैं और इसे केवल उस बटन की दृश्यता के लिए बाध्य कर सकते हैं। आपका XAML अब अच्छा और सुंदर है ... लेकिन आपने खुद को एक क्लर्क में बना लिया है - अब आपको अपने यूआई के विकसित होने पर दो स्थानों (यूआई और सी # में कोड) में बाइंडिंग को अपडेट करना होगा। यदि आपको किसी अन्य स्क्रीन पर होने के लिए समान बटन की आवश्यकता है, तो आपको एक समान संपत्ति को एक व्यूमोडल पर उजागर करना होगा जो उस स्क्रीन तक पहुंच सकता है। इससे भी बदतर, मैं अभी XAML को नहीं देख सकता और देखूंगा कि बटन कब दिखाई देगा। जैसे ही बाइंडिंग थोड़ी नॉनवेज हो जाती है, मुझे C # कोड में जासूसी का काम करना पड़ता है।

डेटा तक पहुंच आक्रामक रूप से बंद है

चूंकि डेटा आमतौर पर DataContext गुणों के माध्यम से UI में प्रवेश करता है, इसलिए आपके पूरे ऐप में लगातार वैश्विक या सत्र डेटा का प्रतिनिधित्व करना कठिन है।

"वर्तमान में लॉग इन उपयोगकर्ता" का विचार एक महान उदाहरण है - यह अक्सर आपके ऐप के उदाहरण के भीतर वास्तव में एक वैश्विक चीज है। WPF / XAML में लगातार तरीके से वर्तमान उपयोगकर्ता तक वैश्विक पहुंच सुनिश्चित करना बहुत मुश्किल है।

मैं जो करना चाहता हूं वह डेटा बाइंडिंग में "करंटयूजर" शब्द का उपयोग करने के लिए स्वतंत्र रूप से वर्तमान में लॉग इन उपयोगकर्ता को संदर्भित करने के लिए है। इसके बजाय, मुझे यह सुनिश्चित करना होगा कि प्रत्येक DataContext मुझे वर्तमान उपयोगकर्ता ऑब्जेक्ट को प्राप्त करने का एक तरीका देता है। एमवीवीएम इस पर विचार कर सकता है, लेकिन व्यूमाडल्स गड़बड़ाने वाले हैं क्योंकि इन सभी को इस वैश्विक डेटा तक पहुंच प्रदान करनी है।

एक उदाहरण जहां MVVM गिरता है

कहें कि हमारे पास उपयोगकर्ताओं की एक सूची है। प्रत्येक उपयोगकर्ता के बगल में, हम "उपयोगकर्ता हटाएं" बटन प्रदर्शित करना चाहते हैं, लेकिन केवल अगर वर्तमान में लॉग इन उपयोगकर्ता एक व्यवस्थापक है। साथ ही, उपयोगकर्ताओं को स्वयं को हटाने की अनुमति नहीं है।

आपकी मॉडल ऑब्जेक्ट को वर्तमान में लॉग इन किए गए उपयोगकर्ता के बारे में नहीं पता होना चाहिए - वे आपके डेटाबेस में उपयोगकर्ता रिकॉर्ड का प्रतिनिधित्व करेंगे, लेकिन किसी भी तरह वर्तमान में लॉग इन उपयोगकर्ता को आपकी सूची पंक्तियों के भीतर डेटा बाइंडिंग के संपर्क में होना चाहिए। MVVM तय करता है कि हमें प्रत्येक सूची पंक्ति के लिए एक व्यूअमॉडल ऑब्जेक्ट बनाना चाहिए जो वर्तमान में उस सूची पंक्ति द्वारा प्रतिनिधित्व किए गए उपयोगकर्ता के साथ लॉग इन करता है, फिर उस व्यूमॉडल ऑब्जेक्ट पर "DeleteButtonVisibility" या "CanDelete" नामक एक संपत्ति को उजागर करें (आपकी भावनाओं के आधार पर) बाध्यकारी कन्वर्टर्स के बारे में)।

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

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

इससे भी बदतर, यह परत आपके यूआई की जटिलता के साथ मापता है, आपके डेटा मॉडल की जटिलता के साथ नहीं। अक्सर एक ही डेटा को कई स्थानों पर और आपके UI में दर्शाया जाता है - यह केवल एक परत नहीं जोड़ता है, यह बहुत अधिक सतह क्षेत्र के साथ परत जोड़ता है!

चीजें कैसे हो सकती थीं

ऊपर वर्णित मामले में, मैं कहना चाहूंगा:

<Button Visibility="{CurrentUser.IsAdmin && CurrentUser.Id != Id}" ... />

करेंटयूसर को मेरे ऐप में सभी एक्सएएमएल को विश्व स्तर पर उजागर किया जाएगा। आईडी मेरी सूची पंक्ति के लिए DataContext पर एक संपत्ति का उल्लेख करेगी। दृश्यता स्वचालित रूप से बूलियन से परिवर्तित होगी। Id, CurrentUser.IsAdmin, CurrentUser, या CurrentUser.Id में कोई भी अपडेट इस बटन की दृश्यता के लिए एक अद्यतन ट्रिगर करेगा। बहुत आसान।

इसके बजाय, WPF / XAML अपने उपयोगकर्ताओं को एक पूर्ण गड़बड़ बनाने के लिए मजबूर करता है। जहाँ तक मैं बता सकता हूँ, कुछ रचनात्मक ब्लॉगर्स ने उस गड़बड़ पर एक नाम दिया और वह नाम था MVVM। मूर्ख मत बनो - यह गोफ़ डिज़ाइन पैटर्न के समान वर्ग में नहीं है। यह एक बदसूरत डेटा बाध्यकारी प्रणाली के आसपास काम करने के लिए एक बदसूरत हैक है।

(इस दृष्टिकोण को कभी-कभी "कार्यात्मक प्रतिक्रियाशील प्रोग्रामिंग" के रूप में संदर्भित किया जाता है, यदि आप आगे पढ़ने के लिए देख रहे हैं)।

निष्कर्ष के तौर पर

यदि आपको WPF / XAML में काम करना चाहिए, तो भी मैं MVVM की सिफारिश नहीं करता।

आप चाहते हैं कि आपके कोड को "कैसे चीजें हो सकती हैं" की तरह संरचित किया गया है, उदाहरण के लिए यह होगा - मॉडल सीधे देखने के लिए उजागर होता है, जटिल डेटा बाइंडिंग अभिव्यक्तियों + लचीले मूल्य के साथ। यह बेहतर तरीका है - अधिक पठनीय, अधिक लिखने योग्य, और अधिक बनाए रखने योग्य।

एमवीवीएम आपको अपने कोड को अधिक क्रियात्मक, कम रखरखाव योग्य तरीके से संरचना करने के लिए कहता है।

MVVM के बजाय, आपको अच्छे अनुभव के बारे में जानने में मदद करने के लिए कुछ सामानों का निर्माण करें: अपने UI पर लगातार वैश्विक स्थिति को उजागर करने के लिए एक सम्मेलन का विकास करें। अपने आप को बाइंडिंग कन्वर्टर्स, मल्टीबाइंडिंग आदि से कुछ टूलींग बनाएँ, जिससे आप अधिक जटिल बाइंडिंग एक्सप्रेशन व्यक्त कर सकते हैं। अपने आप को बाध्यकारी कन्वर्टर्स की एक लाइब्रेरी बनाएँ, जो सामान्य ज़बरदस्ती के मामलों को कम दर्दनाक बनाने में मदद करे।

इससे भी बेहतर - XAML को कुछ अधिक अभिव्यंजक के साथ बदलें। XAML C # ऑब्जेक्ट्स को इंस्टेंट करने के लिए एक बहुत ही सरल XML फॉर्मेट है - अधिक अभिव्यंजक संस्करण के साथ आना मुश्किल नहीं होगा।

मेरी अन्य सिफारिश: टूलकिट का उपयोग न करें जो इस प्रकार के समझौतों को मजबूर करते हैं। वे आपके समस्या डोमेन पर ध्यान केंद्रित करने के बजाय MVVM जैसी बकवास की ओर धकेलकर आपके अंतिम उत्पाद की गुणवत्ता को चोट पहुंचाएंगे।


23
-1: इनमें से अधिकांश बिंदु उथले हैं, और कुछ WPF सुविधाओं का उपयोग करके अधिकांश समस्याओं को दूर किया जा सकता है। मुझे लगता है कि आप एमवीपी पैटर्न के बिंदु से पूरी तरह चूक गए हैं।
फाल्कन

14
उदाहरण: "यहां एक बड़ी खामी है - डेटा अक्सर उस तरह से काम नहीं करता है। आपके डेटा का आकार आपके यूआई के आकार से बहुत भिन्न हो सकता है।" सही - इसलिए आपके पास पहली जगह में एक ViewModel है।
फाल्कन

8
यह थोड़ा बहुत FUD tbh है। मेरा मतलब है, शुरुआत के लिए, WPF विधानसभाओं में एक बूलियनट्विसिबिलिटी काइंटरनेट है, इसलिए किसी को बनाने की आवश्यकता नहीं है। तब आप x का उपयोग कर सकते हैं: स्टेटिक यदि आप वास्तव में सत्र से आने वाली स्थिर जानकारी को बांधना चाहते थे। अधिक संभावना है कि आप कुछ उच्चतर VM जानकारी तक पहुंचने के लिए RelativeSource जैसी चीजों का उपयोग करते हैं। फिर कई चीजें जो आप टेम्प्लेट और स्टाइल के साथ करते हैं, उन समस्याओं को हल करते हैं जिनका आप वर्णन कर रहे हैं। फिर आप मल्टी-बाइंडिंग कर सकते हैं। सूची आगे
बढ़

8
मुझे लगता है कि इस उत्तर में प्रश्न का कुछ उद्देश्य खो गया था और यह WPF / SL पर एक शेख़ी बन गया। यह जवाब ज्यादातर कठिनाइयों से बना है, एक विशिष्ट कार्यान्वयन भूमिका और सिद्धांतों पर बहस करने के बारे में नहीं है जो पैटर्न ऑफ़र में कहा गया है। इसके अलावा ईमानदारी से इस उत्तर में वर्णित बहुत सी चीजों को रेखांकित करने के लिए केवल एमवीवीएम की कोशिश की गई तकनीक में अधिक ज्ञान की आवश्यकता होती है। उल्लिखित कई मुद्दों के समाधान हैं। ViewModel की भूमिका इस उत्तर में भूल गई लगती है।
केली सोमरस 20

8
ऐसा लगता है कि लोकतंत्र सरकार का सबसे खराब रूप है (पिछले सभी रूपों के लिए पाठ्यक्रम को छोड़कर), इस तरह का बयान। निश्चित रूप से WPF में समस्याएँ हैं, लेकिन यह सुनिश्चित करता है कि नर्क winforms को हरा दे। एमवीवीएम के साथ एक WPF निश्चित रूप से MVVM का उपयोग न करने से आसान है, एक तुच्छ ऐप से बड़ा कुछ के लिए।
जोएल बारसोटी

8

मुझे वास्तव में MVVM पसंद है और मैं इसकी चुनौतियों को प्रेरित करने और कई लाभों को देखने के लिए मिल रहा हूं, लेकिन ...

  1. ऐसे एप्लिकेशन या गेम्स के लिए जिन्हें संपूर्ण रखने के दौरान बहुत सारे कस्टम व्यवहार जोड़ने के लिए बहुत सारे UI / इंटरैक्शन कोड की आवश्यकता होती है - अक्सर थोड़ा गंदा MVVM का उपयोग करना बेहतर होता है - इसका उपयोग तब करें जब यह उपयोगी हो या अधिक डेटा सेंट्रिक के विपरीत हो कोड के सहभागिता क्षेत्र। कहते हैं कि आप एक नियंत्रण बनाना चाहते हैं और इसे विभिन्न अभिभावकों के नियंत्रण के बीच ले जाते हैं या अन्यथा इसे कैश करते हैं ...

  2. इसमें एक बहुत ही कठिन सीखने की अवस्था है, इसलिए जब तक आपके पास समय न हो, WPF / SL में बहुत कुछ विकसित करने की योजना बनाएं, डिजाइनरों को ब्लेंड में कुशल होना चाहिए, अपने यूआई के लिए परीक्षण कोड लिखने की आवश्यकता महसूस होगी या अन्यथा आपके रखरखाव के वर्षों की अपेक्षा की जाएगी। परियोजना - यह भुगतान नहीं हो सकता है।

  3. बहुत सारे डिजाइनर ब्लेंड को नहीं जानते हैं, सभी परियोजनाएं प्रस्तुति परत पर स्वचालित परीक्षण को ध्यान में रखने के लायक नहीं हैं, क्योंकि इसे मैन्युअल रूप से किसी भी तरह से परीक्षण करने की आवश्यकता है और इस तरह से आपको अपने वीएम का परीक्षण करके नहीं, बल्कि सबसे महत्वपूर्ण कीड़े मिलेंगे।

  4. यह वास्तव में एक निवेश है। आपको पहले WPF / SL और XAML की मूल बातें समझनी होगी, फिर बाइंडिंग को सही करने के तरीकों का पता लगाना होगा, किसी क्रम में बनाम vms को हुक करना होगा, अपना कमांडिंग अधिकार प्राप्त करना होगा, ज्यादातर मामलों में एक रूपरेखा चुनें। लाइसेंस के कारण समस्याग्रस्त हो, कुशलता से कोड करने के लिए एक सिपेट लाइब्रेरी का निर्माण करें, केवल यह पता लगाने के लिए कि प्लेटफ़ॉर्म हमेशा बाइंडिंग के साथ अच्छी तरह से काम नहीं करता है और व्यवहार के एक पुस्तकालय का निर्माण करने की आवश्यकता है जो आपको मिलता है।

हालांकि कुल मिलाकर - यदि आप सभी बाधाओं को दूर करते हैं और पैटर्न में काफी कुशल हो जाते हैं - यह सब स्पष्टता, स्थिरता और ... डींग मारने के अधिकारों का भुगतान करता है? :)


मैं असहमत हूं कि इसमें एक सीखने की अवस्था है। इसके साथ उत्पादक होने के लिए एक दोपहर में MMVM के बारे में पर्याप्त सीख सकते हैं। इसके अलावा, ब्लेंड को जानना MVVM के लिए एक आवश्यकता नहीं है।
शॉन

6
@ शॉन, क्षमा करें, मैं अपने तीसरे दिन पर हूँ, और अभी भी संघर्ष कर रहा हूँ :( शायद ऐसा इसलिए है क्योंकि मैं संवाद बॉक्स खोलने, या अपने मॉडल से ट्रीव्यू में चयनित आइटम सेट करने जैसी 'जटिल' चीजें करने की कोशिश कर रहा हूँ ...
बेंजोल

8

एमवीवीएम पर ट्रेडिंग सिस्टम जैसे विशाल अनुप्रयोगों के निर्माण के लिए मैं वर्षों से WPF / सिल्वरलाइट प्रोग्रामर रहा हूं।

मेरे लिए, जैसे-जैसे वर्षों बीत गए हैं, मैंने सीखा है कि सख्त MVVM समय खाता है और पैसे खर्च करता है। कड़ाई से, मेरा मतलब है कि "पीछे कोई कोड नहीं" जैसे नियम।

यह कुछ भी असंभव है, लेकिन सबसे बुनियादी रूप / डेटाबेस ऐप, कोड-पीछे नहीं होना है।

आपका डिज़ाइनर उस दिन कुछ निर्दिष्ट करेगा जो मानक नियंत्रणों के साथ संभव नहीं है, इसलिए आपको MVVM के साथ काम करते समय इंटरैक्शन प्रतिमान का समर्थन करने के लिए कस्टम नियंत्रणों की एक श्रृंखला का निर्माण करना चाहिए या मौजूदा नियंत्रणों को लपेटना चाहिए।

मैंने गणित, जड़ता, इशारों आदि का उपयोग करते हुए सभी प्रकार के swish UI नियंत्रण लिखे हैं और इसकी कड़ी मेहनत की है।

लेकिन यह सब कोड-पीछे है, यह सिर्फ देखने में नहीं है। आपको बटन क्लिक, स्क्रॉलिंग, ड्रैगिंग आदि को संभालना है, लेकिन इसके सभी अच्छी तरह से नियंत्रण के एक सेट में लिपटे हुए हैं, जो किसी तरह इस कोड-बैक को ठीक बनाता है।

यह अक्सर केवल कोड-पीछे और चालाक यूआई सामान को देखने के लिए आसान बनाता है, इसके बजाय सिर्फ इसके लिए नियंत्रण का एक सेट बनाने के बजाय।

MVVM का लक्ष्य यूआई लॉजिक से एप्लिकेशन / बिजनेस लॉजिक को अलग करना है। बाध्यकारी प्रणाली और MVVM ऐसा करने का एक अच्छा तरीका है।

अन्य लक्ष्य जैसे कि एक डेस्क पर XAML डिज़ाइनर, दूसरे पर C # प्रोग्रामर, VS में दूसरे ब्लेंड में काम करने वाला, एक पतन है।

UI को तेज़ी से रीडिज़ाइन करने में सक्षम होना एक और गिरावट है। यह कभी नहीं होता है, इसका समय से पहले अनुकूलन; किसी भी प्रमुख कार्य को देखने के लिए बहुत काम करने की जरूरत है मॉडल। Tweaking एक बात है, लेकिन त्वरित UI ओवरहाल संभव नहीं है; व्यू मॉडल्स को इंटरैक्शन प्रतिमान फिट करना चाहिए, इसलिए युग्मन आपको महसूस होने की तुलना में सख्त है।

मेरे लिए, मैं अपने एप्लिकेशन लॉजिक को अलग रखने के लिए MVVM का उपयोग करता हूं (मैं आमतौर पर एक परीक्षण करने योग्य नियंत्रक और लॉजिकलेस मॉडल का एक सेट का उपयोग करता हूं), लेकिन मेरे UI को देखने और सेक्सी तरीके से काम करने के लिए जो भी कोड और ट्रिक्स आवश्यक हैं, मैं नहीं करता। पसीना बहाओ।

इसके अलावा, आप अपने डिजाइनों, शांत एनिमेशन आदि पर राज कर रहे हैं, सिर्फ इसलिए कि एमवीवीएम-यह कैसे हुआ, इसका अंदाजा आप सभी के दिमाग को भांप जाता है।

MVVM, जीवन की अधिकांश चीजों की तरह, दो चरम सीमाओं के बीच कहीं-कहीं एक मीठा स्थान है ।

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


7

यदि आपके आवेदन के लिए आवश्यक है कि आप वास्तविक समय में अत्यधिक मात्रा में डेटा से बंधे हैं, तो MVVM वास्तव में रास्ते में आ सकता है क्योंकि यह अमूर्तता को पेश कर रहा है जो प्रक्रिया को धीमा कर देता है और, अभी हम WPF / सिल्वरलाइट / WP7 के बारे में बात कर रहे हैं, बाध्यकारी इंजन वर्तमान में उतना कुशल नहीं है; हालांकि एन्हांसमेंट रास्ते में हैं।

MVVM, जैसा कि यह खड़ा है, यह भी समीकरण का एकमात्र हिस्सा नहीं है जिसे आपको विचार करने की आवश्यकता है। शुद्ध MVVM को आपको डिस्कनेक्ट किए गए ViewModels में संवाद करने की अनुमति देने के लिए मध्यस्थ पैटर्न जैसे बुनियादी ढांचे के साथ समर्थन करने की आवश्यकता है।

ऊपर ब्ल्यूज़ की राय के बावजूद, MVVM GoF पैटर्न की कतार में है। यदि आप पैटर्न पर एक नज़र डालते हैं, तो MVVM मॉडल व्यू पैसिव प्रस्तुतकर्ता पैटर्न के बराबर है, जो MVVM के समान ही दिखाई देता है। आप अक्सर यहां लोगों को विशुद्ध रूप से MVVM की जटिलता के बारे में शिकायत करते हैं क्योंकि वे समझ नहीं पाते कि इसका उपयोग कैसे करें।

एक अन्य क्षेत्र जो मुझे MVVM के साथ समस्याओं का पता चला है, जहां आपको एक तृतीय पक्ष तकनीक को शामिल करने की आवश्यकता है जो इसे समर्थन करने के लिए डिज़ाइन नहीं किया गया है (जैसे कि एमएस डायनेमिक्स के लिए UII ढांचा)। कई बार आपको खुद से यह पूछना पड़ता है कि एमवीवीएम के साथ काम करने के लिए अन्य तकनीक के आसपास "हैकिंग" के दर्द के लायक है या नहीं।

यदि आप अपने WPF समाधान में Win Forms जैसी किसी चीज़ को मिलाते और मिलाते हैं, तो समाधान का वह हिस्सा शायद MVVM के लिए भी उपयुक्त नहीं होगा। मुझे उम्मीद है कि यह आपको कुछ क्षेत्रों का विचार देगा जहां एमवीवीएम लागू नहीं है।


4

जब MVVM का उपयोग करने का कोई मतलब नहीं है:

  • आप WPF या सिल्वरलाइट के साथ काम नहीं कर रहे हैं
  • आप एक अवधारणा का परीक्षण कर रहे हैं

बस। मैं वास्तव में सोच भी नहीं सकता कि WPF / सिल्वरलाइट के साथ काम करने पर आप MVVM का उपयोग क्यों नहीं करेंगे, जब तक कि आप एक अलग प्रोजेक्ट में कुछ परीक्षण या डिबगिंग नहीं कर रहे हैं। मुझे WPF / सिल्वरलाइट विकास के लिए डिज़ाइन पैटर्न आदर्श लगता है क्योंकि XAML बाइंडिंग के काम करने का तरीका।

MVVM की पूरी बात यह है कि आपका पूरा आवेदन आपके ViewModels में चलता है, और आपके दृश्य बस एक सुंदर परत है जिसका उपयोग उपयोगकर्ता आपके ViewModels के साथ सहभागिता करने के लिए कर सकते हैं। आप एक बटन पर क्लिक करना चाहते हैं, आप वास्तव में एक ViewModel विधि चला रहे हैं। आप पृष्ठ बदलना चाहते हैं, आप वास्तव में ViewModel में CurrentPage गुण बदल रहे हैं।

मैं सभी WPF / सिल्वरलाइट विकास, यहां तक ​​कि छोटे, सरल सिंगल-पेज प्रोजेक्ट्स के लिए MVVM का उपयोग करता हूं, हालांकि मैं MVVM का उपयोग कैसे करता हूं यह परियोजना के आकार और मुझे क्या चाहिए, के आधार पर अलग-अलग है। एक बार जब मैंने एमवीवीएम के बिना एक छोटा सा ऐप किया, तो मुझे इसका पछतावा हुआ (इसे बाद में अपडेट को शामिल करते हुए एमवीवीएम का उपयोग करने के लिए रिफैक्ट किया गया)


3

मैंने एक क्लाइंट के लिए एक प्रोजेक्ट पर कुछ काम किया था जो MVVM में परिवर्तित होने के प्रयास में कोड-पीछे था और इसे एक विशाल गड़बड़ी थी। यह कहने के लिए नहीं है कि सभी कोड-बैक प्रोजेक्ट गड़बड़ हैं। दृश्य त्रुटि या क्रैश ब्लेंड होंगे जो डिजाइनरों के लिए समस्याएं पैदा करते थे।

मैंने RoR के साथ डब किया है और ASP.NET वेबफॉर्म के साथ कुछ भी करने में बहुत कंजूसी की है, लेकिन जब ASP.NET MVC बाहर आया तो मैंने जितना संभव हो उतना सीखने की कोशिश की, अक्सर एक संदर्भ के रूप में ASP.NET MVC का उपयोग एक्शन बुक्स और कोडकम्प्रेसर में किया जाता है । हालाँकि यह एक अलग पैटर्न है जिसमें मैंने SL / MVVM विकास में इन एक्शन पुस्तकों से सीखी गई कई चीजों का उपयोग किया है।

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

मैंने उत्कृष्ट एमवीवीएम-लाइट के साथ शुरुआत की , जिसने मुझे पैटर्न की बेची गई समझ हासिल करने में मदद की। मैंने बाद में कैलीबर्न माइक्रो के साथ काम करना शुरू किया और फिर रोशनी चली गई। मेरे लिए Caliburn Micro , ASP.NET MVC का ASP.NET वेबफॉर्म पर उपयोग करने जैसा है। इसलिए, यहां तक ​​कि छोटे नमूना अनुप्रयोगों के लिए, मैं प्रोजेक्ट बनाता हूं, नुगेट सीएम, और मैं बंद और चल रहा हूं। मैं ViewModel पहले दृष्टिकोण का पालन करता हूं और अपने दृश्यों को ब्लेंड में काम करने के लिए गूंगा और आसान रखता हूं। यदि आप उस के साथ हैं और सीएम के साथ मेरे वीएम परीक्षण योग्य हैं, तो जटिल स्क्रीन लेआउट के आसपास गोफन करना बहुत आसान है।


2

आप इस विकल्प को देखने का आनंद ले सकते हैं। यह विकल्प डेटाबाइंडिंग, डेटाटेम्पलेट्स और MVVM के WPF तरीके को दरकिनार करता है। यह विकल्प पुराने, सरल, भरोसेमंद WinForms डिज़ाइनर .cs दृष्टिकोण की तरह अधिक है।

WPF कंपोजिट

http://wpfcomposites.codeplex.com/

यहां, WPF के लिए संक्षिप्त C # कोड-पीछे ग्रिड-आधारित कंपोजिट के माध्यम से UI के शीर्ष पर एक साधारण मैट्रिक्स को ओवरले करके बनाया गया है। यदि एक आधुनिक XAML UI में केवल कुछ पाठ लेबल और फ़ोटो का एक लिस्टबॉक्स शामिल है, तो इसे कोड की सरल रेखा द्वारा परिभाषित क्यों नहीं किया जा सकता है: grid.AddText (गाइड, x निर्देशांक, y समन्वय)? ध्यान दें, यह एक कैनवास पर नहीं है, लेकिन फिर भी WPF कंटेनरों के भीतर: ग्रिड, डॉकपेल, आदि WPF बेहद शक्तिशाली है। यह दृष्टिकोण केवल इसका लाभ उठाता है।

डेवलपर्स आमतौर पर मेट्रिसेस और इंडेक्स को ध्यान में नहीं रखते हैं। GUID द्वारा डेटा ट्रांसफर ऑब्जेक्ट्स (DTO) या POCO's द्वारा परिभाषित मोटे-अनाज वाले कंटेनर स्तर के साथ शुरू करें, फिर इन पंक्तियों वाले कंटेनरों को संभावित पंक्तियों और स्तंभों के महीन-दाने वाले मैट्रिक्स द्वारा सराहें?

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

यह विचार सूचकांक और एक अच्छी तरह से परिभाषित यूआई तत्व संरचना का लाभ उठाने के लिए है (यह एक PresentationFramework.Aero थीम्ड लिस्टबॉक्स को आधार के रूप में शुरू करने के लिए) डाटटैम्पलेट के बजाय। यह नया दृष्टिकोण जानबूझकर सीमित करता है कि क्या किया जा सकता है लेकिन पैदावार संक्षिप्त करने से, सी # कोड के पीछे मजबूत होता है जो सहज है। स्क्रॉलबार स्टाइल करने या सरल कार्यों के लिए कई डेटा टेम्पलेट्स के साथ समाधान बंद करने के लिए नियंत्रण टेम्पलेट समाधान के लिए शिकार करने की आवश्यकता नहीं है।


-2

एमवीवीएम ज्यादातर यूआई फ्रेमवर्क के आसपास आधारित होता है जिसका मैं उपयोग कर रहा हूं। तो WPF या सिल्वरलाइट जैसी किसी चीज़ के साथ, जो एक डेटाकैनेक्स्ट के लिए बाइंडिंग के आधार पर एक प्रतिमान है, उस डेटाकोटेक्स्ट को हमेशा एक व्यू मॉडल कहा जा सकता है।

तो मेरे लिए सवाल यह है कि आप एक बड़ी मोटी अलग श्रेणी का निर्माण करते हैं जो इस नियंत्रण / खिड़की / अनुप्रयोग के लिए दृश्य मॉडल है और जब आप पहले से निर्मित वस्तुओं का उपयोग करके दूर हो सकते हैं।

इसलिए हमें अमूर्तता की एक परत जोड़ने के बारे में एक क्लासिक सवाल मिला है। वीएम एक परियोजना के लिए वजन, जड़ता और संरचना को जोड़ने जा रहा है। इसे बनाना आसान होगा, लेकिन इसे बदलना और निर्माण में अधिक कठिन होगा। उन चीजों में से कोई भी आसानी से मात्रात्मक।

सस्ते उत्तर के लिए, MVVM कमांड लाइन ऐप या वेब सेवाओं के लिए उपयुक्त नहीं है :)

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