मॉडल-व्यू-कंट्रोलर: क्या उपयोगकर्ता व्यू के साथ या कंट्रोलर से इंटरैक्ट करता है? [बन्द है]


14

मैंने हाल ही में एमवीसी डिजाइन पैटर्न के बारे में सीखा है। मैं हेड फर्स्ट डिज़ाइन पैटर्न बुक से सीख रहा हूँ।

इस पुस्तक के अनुसार (यदि मैं सही ढंग से समझता हूं):

मॉडल अधिकांश एप्लिकेशन लॉजिक और डेटा है।

दृश्य मूल रूप से GUI है जो उपयोगकर्ता को नेत्रहीन रूप से मॉडल का प्रतिनिधित्व करता है।

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

हालाँकि, वेब पर बहुत सी जगह विरोधाभास है जो मैं उस पुस्तक से समझता हूं। उनका दावा है कि आमतौर पर उपयोगकर्ता नियंत्रक के साथ बातचीत करता है, न कि दृश्य के साथ।

कौन सा सही है या अधिक सामान्य? क्या उपयोगकर्ता नियंत्रक के साथ सीधे या दृश्य के साथ सीधे संपर्क करता है? क्या दोनों दृष्टिकोण स्वीकार्य हैं? जो अधिक सामान्य है?


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

1
2 जवाब, दोनों ने कहा, एक "दृश्य के साथ बातचीत करता है" दूसरे का कहना है कि "नियंत्रक के साथ बातचीत करें" .... मुझे लगता है कि एमवीसी एक अच्छा वास्तुकला नहीं है अगर यह इस तरह के एक मौलिक स्तर पर उलझन में है!
gbjbaanb


क्या आप एप्लिकेशन के नियंत्रण या डेटाबेस प्रश्नों पर क्लिक करते हैं? इंटरैक्शन सीधे उपयोगकर्ता इंटरफ़ेस के साथ है, जो स्वयं एक दृश्य है। दृश्य आमतौर पर सर्वर (वेब ​​ऐप के मामले में) के अनुरोधों को आमंत्रित करता है या उन पर पंजीकृत हुक (क्लाइंट ऐप्स के मामले में) को कॉल करता है। बगल में कि पूरे MVC सिर्फ बकवास है।
luke1985

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

जवाबों:


18

उपयोगकर्ता दृश्य के साथ सहभागिता करता है , लेकिन दृश्य को नियंत्रक को क्रियाओं को संप्रेषित करना होगा । नियंत्रक अद्यतन कर सकते हैं मॉडल है, लेकिन यह हर / किसी भी परिवर्तन के साथ आवश्यक नहीं है।

मैं जो विवरण प्रदान कर रहा हूं वह एमवीसी के .NET कार्यान्वयन के साथ मेरे व्यक्तिगत अनुभव पर आधारित है। आपका कार्यान्वयन अलग हो सकता है।

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

देखें केवल एक फैशन है कि उपयोगकर्ता को समझ सकता हूँ में जानकारी प्रदर्शित करने के लिए जिम्मेदार होना चाहिए। नियंत्रक और मॉडल दोनों के साथ यहां कुछ क्रॉस किया जा सकता है क्योंकि सिंगल पेज एप्लिकेशन (एसपीए) जैसी चीजें उपयोगकर्ता के लिए डेटा सत्यापन प्रतिक्रिया होगी। किसी भी अन्य क्रॉस ओवरों पर भारी दबाव पड़ता है।

मॉडल डेटा से संबंधित है। इसमें डेटा का सत्यापन (जहां लागू हो) शामिल है। डेटा लेयर और रिट्रीवल को भी इस लेयर में संभाला जाता है।


अपडेट करें

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

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

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

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

मॉडल निर्धारित करता है कि कैसे और कहाँ डाटा स्टोर करने की। यह स्टोर करने से पहले उस डेटा का सत्यापन भी कर सकता है (इसे ऐसा करना चाहिए क्योंकि लोग मौके पर व्यू को बायपास कर देंगे)।


विकिपीडिया पर MVC पर एक लेख है

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

Microsoft के MVC के अवलोकन से

  • मॉडल। मॉडल ऑब्जेक्ट एप्लिकेशन के कुछ भाग हैं जो एप्लिकेशन के डेटा डोमेन के लिए तर्क को लागू करते हैं। अक्सर, मॉडल ऑब्जेक्ट एक डेटाबेस में मॉडल स्टेट को पुनः प्राप्त और स्टोर करते हैं। उदाहरण के लिए, कोई उत्पाद ऑब्जेक्ट डेटाबेस से जानकारी प्राप्त कर सकता है, उस पर काम कर सकता है, और फिर किसी SQL सर्वर डेटाबेस में उत्पाद तालिका में वापस अद्यतन जानकारी लिख सकता है।

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

  • दृश्य। दृश्य वे घटक हैं जो एप्लिकेशन के उपयोगकर्ता इंटरफ़ेस (UI) को प्रदर्शित करते हैं। आमतौर पर, यह UI मॉडल डेटा से बनाया जाता है। एक उदाहरण एक उत्पाद तालिका का एक संपादित दृश्य होगा जो उत्पाद वस्तु की वर्तमान स्थिति के आधार पर पाठ बक्से, ड्रॉप-डाउन सूची और चेक बॉक्स प्रदर्शित करता है।

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


यदि आपके पास सभी कार्यों के लिए GUI नहीं है तो क्या होगा? क्या होगा यदि आपके पास कुछ विशिष्ट भागों के लिए केवल एपीआई लागू है? क्या इसका मतलब है कि उपयोगकर्ता कभी-कभी दृश्य के साथ और कभी-कभी नियंत्रक से सीधे संपर्क करता है?
महदी

1
मेरे नजरिए से, नहीं। एपीआई दृश्य की जगह लेता है।
एडम जुकरमान

लेकिन एपीआई एक सरल url-routes, में रखा जा सकता है Controller। मेरा मतलब है कि कोई भी दृश्य नहीं ...
महदी

1
@AdamZuckerman जवाब देने के लिए धन्यवाद। अगली टिप्पणी में मैं वर्णन करता हूँ कि मुझे लगता है कि एक सामान्य एमवीसी कार्यान्वयन कैसे काम करता है, कृपया पुष्टि करें कि यह सही है या नहीं। साभार
अवीव कोहन

2
@ मेहदी एक एपीआई, परिभाषा के अनुसार, एक प्रोग्रामिंग इंटरफ़ेस के रूप में है, उपयोगकर्ता इंटरफ़ेस नहीं है । कार्यक्रम एपीआई के साथ बातचीत करते हैं, उपयोगकर्ता दृश्य के साथ बातचीत करते हैं।
एरिक किंग

4

उपयोगकर्ता नियंत्रक के साथ बातचीत करता है । तकनीकी दृष्टि से , आप व्यू के साथ इंटरैक्ट नहीं कर रहे हैं, आप इसे कंट्रोलर के साथ इंटरैक्ट करने के लिए उपयोग कर रहे हैं ।

सतह पर ऐसा लगता है कि उपयोगकर्ता GUI के साथ बातचीत कर रहा है - एक गैर-प्रोग्रामर के लिए भी यह अधिक समझ में आता है, हालांकि एक बटन पर क्लिक करके आप मूल रूप से नियंत्रक से बात कर रहे हैं दृश्य नहीं ।

सभी एप्लिकेशन भी नहीं - यहां तक ​​कि MVC वेब-एप्लिकेशन में भी GUI है। आप एक एपीआई के माध्यम से नियंत्रक के साथ बातचीत कर सकते हैं - url-routesउदाहरण के लिए, केवल नियंत्रक में रखा गया ।

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


2
+1 यह सही है। मेनू और टूलबार जैसी चीजें जीयूआई का हिस्सा हैं लेकिन दृश्य का हिस्सा नहीं हैं, और सीधे नियंत्रक के पास जाते हैं। कीस्ट्रोक्स वैसे ही।
david.pfx

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

1
@ मैहदी मैं कहूंगा कि उस स्थिति में, कोई उपयोगकर्ता सहभागिता नहीं है, यह नियंत्रक के साथ संवाद करने वाला दृश्य है। उपयोगकर्ता द्वारा शुरू की गई केवल इंटरैक्शन दृश्य के माध्यम से होती हैं।
एरिक किंग

1
@ david.pfx कीस्ट्रोक ब्राउजर विंडो से सीधे कंट्रोलर के पास नहीं जा सकता।
एडम जुकरमान

1
@ इज़काता "दृश्य उस कोड का हिस्सा है जिसे अनुरोध भेजा जाता है" - क्षमा करें, लेकिन यह सबसे खराब चीज है जिसे मैंने यहां सुना है। यह ऐसे कैसे संभव है? क्या आप इसे एक लेख या पुस्तक में एक संदर्भ प्रदान करके वापस कर सकते हैं?
महदी

1

आइए उपयोगकर्ताओं के विचारों और नियंत्रकों के साथ सीधे संपर्क क्यों करते हैं, इसके एक ठोस उदाहरण का उपयोग करें।

IPhone पर संगीत ऐप में, एक उच्च स्तरीय सुविधा एक प्लेलिस्ट खेलने के लिए है। "Play a playlist" ऐप के कंट्रोलर का एक फंक्शन है।

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

प्रत्येक दृश्य में प्रतिक्रिया भी अलग है। सिरी आपको बताएगा कि यह आपके द्वारा अनुरोधित संगीत को चला रहा है। संगीत ऐप आपको एक दृश्य प्रतिक्रिया दिखाएगा कि यह प्लेलिस्ट खेल रहा है।

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