मैं इसे इस तरह से सोचना पसंद करता हूं:
दृश्य, जैसा कि आप कहते हैं, गूंगा है। एमवीवीएम पर सेमिनल और अक्सर लिंक किए गए एमएसडीएन लेख के लेखक जोश स्मिथ ने कहा है कि विचार "कपड़े जो डेटा का उपयोग करते हैं।" दृश्य में वास्तव में कभी भी डेटा नहीं होता है या इसे सीधे हेरफेर नहीं किया जाता है, वे केवल आपके व्यूअमॉडल के गुणों और आदेशों से बंधे होते हैं।
मॉडल ऑब्जेक्ट हैं जो आपके एप्लिकेशन के डोमेन को मॉडल करते हैं , जैसा कि व्यावसायिक वस्तुओं में। क्या आपका एप्लिकेशन म्यूज़िक स्टोर है? शायद आपके मॉडल ऑब्जेक्ट कलाकार, एल्बम और गाने होंगे। क्या आपका एप्लिकेशन ऑर्ग-चार्ट ब्राउज़र है? शायद आपके मॉडल ऑब्जेक्ट मैनेजर और कर्मचारी होंगे। ये मॉडल ऑब्जेक्ट किसी भी तरह के विज़ुअल रेंडरिंग से संबंधित नहीं हैं, और वे सीधे उस एप्लिकेशन से भी संबंधित नहीं हैं जिन्हें आप उन्हें डाल रहे हैं - आपके मॉडल ऑब्जेक्ट्स को पूरी तरह से अपने आप पर वस्तुओं के परिवार के रूप में समझ में आना चाहिए जो किसी तरह का प्रतिनिधित्व करते हैं डोमेन का। मॉडल लेयर में आमतौर पर सर्विस एक्सेसर्स जैसी चीजें भी शामिल होती हैं।
यह हमें Viewmodels में लाता है। वे क्या हैं? वे ऑब्जेक्ट हैं जो GUI एप्लिकेशन को मॉडल करते हैं, मतलब वे विचारों द्वारा उपयोग किए जाने वाले डेटा और कार्यक्षमता प्रदान करते हैं। वे वही हैं जो आपके द्वारा बनाए जा रहे वास्तविक अनुप्रयोग की संरचना और व्यवहार को परिभाषित करते हैं। मॉडल ऑब्जेक्ट्स के लिए, डोमेन वह है जो आप चुनते हैं (संगीत स्टोर, ऑर्ग-चार्ट ब्राउज़र, आदि), लेकिन व्यूमोडल के लिए, डोमेन एक ग्राफिकल एप्लिकेशन है। आपके व्यूअमॉडल आपके एप्लिकेशन द्वारा किए जाने वाले व्यवहार और हर चीज़ के डेटा को इनकैप्सुलेट करने वाले हैं। वे वस्तुओं और सूचियों को संपत्तियों के साथ-साथ कमांड जैसी चीजों को उजागर करने जा रहे हैं। एक कमांड सिर्फ एक व्यवहार है (इसके सरलतम, एक विधि कॉल पर) एक वस्तु में लिपटे हुए है जो इसे चारों ओर ले जाता है - यह विचार महत्वपूर्ण है क्योंकि दृश्य डेटाबाइंडिंग द्वारा संचालित होते हैं, जो वस्तुओं को दृश्य नियंत्रण देते हैं। MVVM में, आप बटन को क्लिक हैंडलर विधि नहीं देते हैं,
मेरे लिए, सबसे भ्रामक बिट्स निम्नलिखित थे:
- भले ही viewmodels एक चित्रमय अनुप्रयोग के मॉडल हैं, लेकिन वे सीधे दृश्य अवधारणाओं का संदर्भ या उपयोग नहीं करते हैं। उदाहरण के लिए, आप अपने ViewModels में Windows नियंत्रण के संदर्भ नहीं चाहते हैं - वे चीजें दृश्य में जाती हैं। ViewModels बस डेटा और व्यवहार को नियंत्रित करने के लिए या अन्य वस्तुओं को उजागर करता है जो उन्हें बांधेंगे। उदाहरण के लिए - क्या आपके पास इसमें लिस्टबॉक्स के साथ एक दृश्य है? आपका व्यूमॉडल लगभग निश्चित रूप से इसमें किसी प्रकार का संग्रह है। क्या आपके विचार में बटन हैं? आपका दृश्यमॉडल लगभग निश्चित रूप से इसमें कुछ कमांड रखने वाला है।
- कुछ प्रकार की वस्तुएं हैं जिन्हें "दृश्यमॉडल" माना जा सकता है। समझने के लिए सरलतम प्रकार का दृश्य वह है जो सीधे 1: 1 संबंध में एक नियंत्रण या स्क्रीन का प्रतिनिधित्व करता है, जैसा कि "स्क्रीन में XYZ में एक टेक्स्टबॉक्स, एक सूची बॉक्स और तीन बटन होते हैं, इसलिए दृश्यमॉडल को एक स्ट्रिंग, एक संग्रह की आवश्यकता होती है, और तीन आज्ञाएँ। " एक अन्य प्रकार की वस्तु जो दृश्यमॉडल परत में फिट होती है, एक मॉडल ऑब्जेक्ट के चारों ओर एक आवरण होता है जो इसे व्यवहार देता है और इसे एक दृश्य द्वारा अधिक प्रयोग करने योग्य बनाता है - यह वह जगह है जहां आप "मोटी" और "पतली" दृश्यमॉडल परतों की अवधारणाओं में मिलते हैं। एक "पतली" दृश्यमॉडल परत दृश्यमॉडल का एक सेट है जो आपके मॉडल ऑब्जेक्ट्स को सीधे विचारों से उजागर करता है, जिसका अर्थ है कि मॉडल ऑब्जेक्ट्स पर सीधे संपत्तियों के लिए बाइंडिंग समाप्त होती है। यह सरल, केवल पढ़ने वाले विचारों जैसी चीजों के लिए काम कर सकता है, लेकिन क्या होगा अगर आप प्रत्येक वस्तु के साथ व्यवहार करना चाहते हैं? आप मॉडल में ऐसा नहीं चाहते, क्योंकि मॉडल एप्लिकेशन से संबंधित नहीं है, यह केवल आपके डोमेन से संबंधित है। आप इसे एक ऐसी वस्तु में रख सकते हैं जो आपके मॉडल ऑब्जेक्ट को लपेटता है और अधिक बाध्यकारी-अनुकूल डेटा और व्यवहार प्रदान करता है। इस आवरण वस्तु को भी एक दृश्यदर्शी माना जाता है, और उनके परिणामस्वरूप "मोटी" दृश्यमॉडल परत होती है, जहां आपके विचार कभी भी मॉडल वर्ग पर किसी भी चीज़ के लिए सीधे बाध्यकारी नहीं होते हैं। कलेक्शन में व्यूमॉडल शामिल होंगे जो केवल खुद को मॉडल रखने के बजाय मॉडल लपेटते हैं। आप इसे एक ऐसी वस्तु में रख सकते हैं जो आपके मॉडल ऑब्जेक्ट को लपेटता है और अधिक बाध्यकारी-अनुकूल डेटा और व्यवहार प्रदान करता है। इस आवरण वस्तु को एक दृश्यदर्शी भी माना जाता है, और उनके परिणामस्वरूप "मोटी" दृश्यमॉडल परत होती है, जहां आपके विचार कभी भी मॉडल वर्ग पर किसी भी चीज़ के लिए सीधे बाध्यकारी नहीं होते हैं। कलेक्शन में व्यूमॉडल शामिल होंगे जो केवल स्वयं के मॉडल वाले मॉडल के बजाय लपेटते हैं। आप इसे एक ऐसी वस्तु में रख सकते हैं जो आपके मॉडल ऑब्जेक्ट को लपेटता है और अधिक बाध्यकारी-अनुकूल डेटा और व्यवहार प्रदान करता है। इस आवरण वस्तु को एक दृश्यदर्शी भी माना जाता है, और उनके परिणामस्वरूप "मोटी" दृश्यमॉडल परत होती है, जहां आपके विचार कभी भी मॉडल वर्ग पर किसी भी चीज़ के लिए सीधे बाध्यकारी नहीं होते हैं। कलेक्शन में व्यूमॉडल शामिल होंगे जो केवल खुद को मॉडल रखने के बजाय मॉडल लपेटते हैं।
खरगोश छेद गहरा हो जाता है - वैल्यूकोवर्टर्स की तरह यह पता लगाने के लिए बहुत सारे मुहावरे हैं जो एमवीवीएम को काम करते रहते हैं, और लागू करने के लिए बहुत कुछ है जब आप ब्लेंडेबिलिटी, परीक्षण जैसी चीजों के बारे में सोचना शुरू करते हैं, और अपने ऐप में डेटा कैसे पास करें और यह सुनिश्चित करें प्रत्येक व्यूमॉडल के पास उस व्यवहार की पहुंच है जिसकी उसे आवश्यकता है (यह वह जगह है जहां निर्भरता इंजेक्शन आता है), लेकिन उम्मीद है कि ऊपर एक अच्छी शुरुआत है। कुंजी आपके दृश्य, आपके डोमेन और तीन अलग-अलग चीजों के रूप में आपके वास्तविक एप्लिकेशन की संरचना और व्यवहार के बारे में सोचने के लिए है।