Decoupling अवयव
MVC में, आप घटकों के बीच एक त्रिकोणीय रिश्ता है। यही है: नियंत्रक दृश्य और मॉडल का मालिक है। दृश्य मॉडल की परिभाषा पर निर्भर करता है। मॉडल को दृश्य की आवश्यकताओं को पूरा करने की आवश्यकता है।एक हब (नियंत्रक) और बोलने वाले आर्किटेक्चर (देखें और मॉडल) के बारे में सोचें
एमवीवीएम में, उस त्रिभुज के बारे में सोचें कि प्रत्येक घटक के साथ केवल श्रृंखला में एक दूसरे के बारे में जानना है। यह है: देखें-> ViewModel-> मॉडल
मॉडल स्टैक पर कुछ भी अनजान है। व्यूमोडेल केवल मॉडल के बारे में अवगत है, व्यू केवल मॉडल के बारे में जागरूक है - यह मॉडल से अनजान है।
यह महत्वपूर्ण क्यों है?
यह मूल प्रश्न का मूल है।
मुख्य उद्देश्य आपके वास्तुकला का और अधिक अमूर्त है। यह आमतौर पर थोड़ा और कोड ले जाएगा, लेकिन वस्तुओं के बीच संपर्क के कम अंक। संपर्क के कम बिंदु महत्वपूर्ण हैं क्योंकि इससे अधिक चुस्त कोड होता है। अधिक युग्मन/संपर्क कक्षा ए कक्षा बी के साथ है, कक्षा ए में बदलाव पर अधिक असर होगा। परिवर्तन के प्रभाव को कम करना अच्छी वास्तुकला के प्रमुख लाभों में से एक है।
इसे पूरी तरह से समझने के लिए, यह समझने में मददगार है कि घटक वास्तव में क्या प्रतिनिधित्व करते हैं। व्यू, कंट्रोलर, व्यू मॉडेल या मॉडल क्या है? क्या वे शाब्दिक परिभाषाएं हैं, या एक अमूर्त अवधारणा के अधिक हैं?
मेरे अनुभव में, मॉडल को कक्षाओं/वस्तुओं के समूह के रूप में मानने के लिए अधिक फायदेमंद रहा है जो डेटा के निर्माण और दृढ़ता से निपटते हैं। यह गुणों के साथ सिर्फ एक सादा-पुरानी वस्तु नहीं है। यह एक वर्ग है जो डेटा fetches, डेटा बचाता है, एक कारखाना जो सादे-पुराने वस्तुओं का निर्माण करता है। यह एक मुखौटा परत है जो डेटा में एक स्पष्ट एपीआई प्रदान करता है। क्या इस मुखौटे परत को सीधे दृश्य से संदर्भित किया जाना चाहिए?
मेरी राय में, यह नहीं होना चाहिए। एमवीसी में, वह जवाब भी "नहीं" है। नियंत्रक मॉडल से डेटा प्राप्त करता है। उस संबंध में, एमवीसी और एमवीवीएम एक ही लक्ष्य प्राप्त करते हैं। जहां दो आर्किटेक्चर भिन्न हैं, डेटा और दृश्य कैसे जुड़े हुए हैं।
मॉडल की तरह, दृश्य कक्षाओं का एक संग्रह हो सकता है जो एक दूसरे के साथ समन्वय में हो, एक प्रेजेंटेशन व्यू प्रस्तुत करें। इसमें मोबाइल प्लेटफार्मों के मामले में एक व्यू कंट्रोलर + व्यू शामिल हो सकता है (आईओएस पर नियंत्रक देखें, एंड्रॉइड पर गतिविधि देखें)। कई मामलों में, आपको दृश्य दस्तावेज़ को स्मृति में लोड करने और दृश्य गुणों को अपडेट करने के लिए कक्षा की आवश्यकता होती है। यहां करने के लिए बहुत सारे काम हैं। एमवीसी में, नियंत्रक जल्दी से 'रसोई सिंक' वर्ग बन जाता है - वर्तमान उपयोगकर्ता संदर्भ से संबंधित किसी भी चीज़ के लिए डंपिंग ग्राउंड का एक प्रकार।
जब आप अपने आवेदन के भीतर संभावित विचारों के दर्जनों से अधिक गुणा, आप अपने बैक-एंड मॉडल कोड और अपने सामने के अंत देखें कोड के बीच गहरे dependancies का एक बहुत साथ खत्म। बड़े नियंत्रक वर्गों के साथ, ये निर्भरता तुरंत स्पष्ट नहीं होती है।
अपने निर्भरता बाहर सपाट
MVVM निर्भरता बाहर सपाट। यह फोकस बनाता है। फोकस क्या है? अन्य सभी निर्भरताओं के व्याकुलता के बिना कार्यक्षमता के एक टुकड़े पर काम करने की क्षमता। अब आप कोड पर यूनिट परीक्षण लिखना शुरू कर सकते हैं जिसे पहले अवांछित समझा जाता था।
व्यू मॉडल व्यू और मॉडल के बीच एक मुखौटा के रूप में कार्य करता है। व्यू मॉडल व्यू की ज़रूरतों को पूरा करता है - तकनीकी रूप से दृश्य को व्यू मॉडल का मालिक होना चाहिए। यदि दृश्य को एकाधिक स्रोतों से डेटा की आवश्यकता होती है, तो व्यू मॉडल अलग-अलग डेटा स्रोतों की संरचना को एकल, एकीकृत, डी-सामान्यीकृत ऑब्जेक्ट में समाहित करता है।यदि दृश्य को मॉडल या अन्य गंतव्यों में वापस कॉल करने की आवश्यकता है, तो व्यू मॉडल उपयुक्त कॉल को हुक और मार्ग प्रदान करता है।
विचार करें कि नेटवर्किंग पैच-पैनल कैसे काम करता है। पहली नज़र में, यह अनावश्यक लगता है - क्यों न केवल अपने ईथरनेट को बिंदु ए से बिंदु बी तक ले जाएं। लेकिन अनुभव के साथ, आप समझेंगे कि एक पैच पैनल आपको अमूर्तता का एक प्रमुख टुकड़ा प्रदान करता है जो आपको पॉइंट के मार्गों को बदलने की अनुमति देता है बी प्वाइंट ए को प्रभावित किए बिना बी। आपका व्यू मॉडल क्या कर रहा है।
अब आपके पास अपने दृश्य और मॉडल के बीच एक साफ अमूर्तता है, परिणाम यह होना चाहिए कि आपका व्यू/नियंत्रक केवल प्रेजेंटेशन से संबंधित है। इसका मतलब है कि इसे स्थानीयकरण या स्वरूपण से निपटना नहीं चाहिए - यह डेटा प्राप्त करता है और डेटा प्रस्तुत करता है। आपका व्यू मॉडल इस तरह के प्री-व्यू डेटा मालिश करने के लिए एक आदर्श स्थान है। मान लें कि आपको मानदंडों के आधार पर डेटा फ़िल्टर करने की आवश्यकता है। फिर, व्यू मॉडल मॉडल डेटा के बारे में जानकार है (आपका दृश्य नहीं है) और इस तरह के कोड को रखने के लिए एक शानदार जगह है।
एक बार जब आप इस फैशन में अपनी आवेदन आवश्यकताओं को व्यवस्थित करना शुरू कर देते हैं, तो आपका व्यू/कंट्रोलर कोड क्लीनर बन जाता है, और जब कुछ बदलने की जरूरत होती है, तो प्रभाव अधिक स्पष्ट होते हैं, जिससे कम कीड़े होती हैं।
Testability testability पर
एक अंतिम ध्यान दें: निर्भरता बाहर सपाट करके, यह यह आसान अपने परीक्षण में नकली निर्भरता इंजेक्षन है। यह परीक्षण को आसान और अधिक संक्षेप में बनाता है। आपका व्यू मॉडल कुछ ऐसा हो जाता है जिसके खिलाफ आप स्पष्ट टेस्ट केस परिभाषित कर सकते हैं।
इससे मदद मिल सकती है: http://stackoverflow.com/questions/667781/what-is-the-difference-between-mvc-and-mvvm – SeanJA