मॉडल-दृश्य-प्रस्तोता

मॉडल-व्यू-प्रस्तोता (एमवीपी) मॉडल-व्यू-कंट्रोलर (एमवीसी) वास्तुशिल्प पैटर्न की व्युत्पत्ति है और इसका उपयोग अधिकतर यूजर इंटरफेस के निर्माण के लिए किया जाता है।

एमवीपी में, प्रस्तोता "मिडिल मैन" की कार्यक्षमता मानता है। एमवीपी में, सभी प्रेजेंटेशन तर्क प्रस्तोता को भेज दिए जाते हैं।

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

1998 में टैलिगेंट के बंद होने के बाद, डॉल्फिन स्मॉलटॉक के एंडी बोवर और ब्लेयर मैकग्लाशन ने अपने स्मॉलटॉक यूजर इंटरफेस फ्रेमवर्क के लिए आधार बनाने के लिए एमवीपी पैटर्न को अपनाया। 2006 में, माइक्रोसॉफ्ट ने .NET फ्रेमवर्क में यूजर इंटरफेस प्रोग्रामिंग के लिए अपने दस्तावेज़ीकरण और उदाहरणों में एमवीपी को सम्मिलित करना प्रारम्भ किया था।

एमवीपी पैटर्न के विकास और कई वेरिएंट, जिसमें एमवीपी का एमवीसी जैसे अन्य डिज़ाइन पैटर्न से संबंध सम्मिलित है, पर मार्टिन फाउलर के लेख में और डेरेक ग्रीर के अन्य लेख में विस्तार से चर्चा की गई है।

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

सामान्यतः, व्यू कार्यान्वयन कंक्रीट प्रस्तोता ऑब्जेक्ट को त्वरित करता है, स्वयं को एक संदर्भ प्रदान करता है। निम्नलिखित C # कोड सरल व्यू निर्माता को प्रदर्शित करता है:

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

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

.NET
.NET एनवायरनमेंट किसी भी अन्य डेवलोपमेन्ट एनवायरनमेंट की तरह एमवीपी पैटर्न का समर्थन करता है। एक ही मॉडल और प्रस्तोता वर्ग का उपयोग एकाधिक इंटरफ़ेस का समर्थन करने के लिए किया जा सकता है, जैसे ASP.NET वेब एप्लिकेशन, विंडोज़ फॉर्म एप्लिकेशन या सिल्वरलाइट एप्लिकेशन। प्रस्तोता एक इंटरफ़ेस के माध्यम से व्यू से/में जानकारी प्राप्त करता है और सेट करता है जिसे इंटरफ़ेस (व्यू) घटक द्वारा एक्सेस किया जा सकता है।

पैटर्न को मैन्युअल रूप से प्रयुक्त करने के अतिरिक्त, एमवीपी पैटर्न को अधिक स्वचालित तरीके से समर्थन देने के लिए मॉडल-व्यू-प्रस्तोता फ्रेमवर्क का उपयोग किया जा सकता है।

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

जावा वेब-आधारित अनुप्रयोगों के लिए समान दृष्टिकोण का उपयोग किया जा सकता है क्योंकि आधुनिक जावा घटक-आधारित वेब फ्रेमवर्क मोटे क्लाइंट के समान घटक दृष्टिकोण का उपयोग करके क्लाइंट-साइड लॉजिक के विकास की अनुमति देते हैं।

गूगल वेब टूलकिट में एमवीपी प्रयुक्त करने के लिए केवल यह आवश्यक है कि कुछ घटक व्यू इंटरफ़ेस प्रयुक्त करें। वाडिन या इको2 वेब फ्रेमवर्क का उपयोग करके भी यही दृष्टिकोण संभव है।

जावा फ्रेमवर्क में निम्नलिखित सम्मिलित हैं:


 * जावाएफएक्स
 * इको2
 * गूगल वेब टूलकिट
 * जेफ़ेस
 * स्विंग
 * वादिन
 * ज़ेडके

पीएचपी
जहां तक पीएचपी के फ्लेक्सिबल रनटाइम एन्वॉयरमेंट का विषय है, एप्लिकेशन लॉजिक के दृष्टिकोण की व्यापक संभावनाएं हैं। मॉडल लेयर का कार्यान्वयन अंतिम एप्लिकेशन प्रोग्रामर पर छोड़ दिया गया है।

पीएचपी फ्रेमवर्क में निम्नलिखित सम्मिलित हैं:


 * कोडइग्नाइटर
 * लारवेल
 * नेट फ्रेमवर्क

यह भी देखें

 * मल्टीटियर आर्किटेक्चर
 * मॉडल-व्यू-नियंत्रक
 * मॉडल-व्यू-व्यूमॉडल
 * प्रस्तोता प्रथम (सॉफ़्टवेयर दृष्टिकोण)

बाहरी संबंध

 * Model View Presenter Example from the GWT project.
 * Model-View-Presenter implementation thoughts at StackExchange