MVC (मॉडल, व्यू, कंट्रोलर) स्थिरता बनाए रखने के लिए एक एप्लिकेशन में कोड को व्यवस्थित करने के लिए एक पैटर्न है।
एक स्टूडियो में अपने कैमरे के साथ एक फोटोग्राफर की कल्पना करो। एक ग्राहक उसे एक बॉक्स का फोटो लेने के लिए कहता है।
गैर-एमवीसी आर्किटेक्चर एक साथ कसकर एकीकृत होते हैं। यदि बॉक्स, नियंत्रक और कैमरा एक-और-समान-वस्तु थे तो, हमें अलग-अलग खींचना होगा और फिर हर बार जब हम एक नया दृश्य प्राप्त करना चाहते हैं , तो बॉक्स और कैमरा दोनों को फिर से बनाएँगे । इसके अलावा, फोटो लेना हमेशा सेल्फी लेने की कोशिश करने जैसा होगा - और यह हमेशा बहुत आसान नहीं होता है।
bwaha ने लिखा:
लेखक WVPython में MVC डिज़ाइन के उदाहरण के रूप में mvctree.py को संदर्भित करता है। हालाँकि मैं अभी भी बहुत हरा हूँ इसलिए मुझे वह विशेष उदाहरण बहुत जटिल लगता है और मैं उस अलगाव को नहीं समझ रहा हूँ जिसकी लेखक सिफारिश कर रहा है।
MVC सभी चिंताओं को अलग करने के बारे में है।
मॉडल कार्यक्रम के डेटा (निजी और ग्राहक डेटा दोनों) के प्रबंधन के लिए जिम्मेदार है। दृश्य / नियंत्रक कार्यक्रम के ग्राहक डेटा के साथ बातचीत करने के लिए बाहरी दुनिया को प्रदान करने के लिए जिम्मेदार है।
मॉडल कार्यक्रम के अन्य भागों को इसके साथ बातचीत करने में सक्षम करने के लिए एक आंतरिक इंटरफ़ेस (एपीआई) प्रदान करता है। व्यू / कंट्रोलर एक बाहरी इंटरफ़ेस (GUI / CLI / वेब फॉर्म / उच्च-स्तरीय IPC / etc।) प्रदान करता है ताकि प्रोग्राम को इसके साथ संवाद करने के लिए सब कुछ सक्षम किया जा सके।
मॉडल कार्यक्रम के डेटा की अखंडता को बनाए रखने के लिए जिम्मेदार है, क्योंकि अगर वह भ्रष्ट हो जाता है तो यह सभी के लिए खेल खत्म हो गया है। यूआई की अखंडता को बनाए रखने के लिए व्यू / कंट्रोलर जिम्मेदार है, यह सुनिश्चित करता है कि सभी पाठ दृश्य अप-टू-डेट मान प्रदर्शित कर रहे हैं, मेनू आइटम अक्षम कर रहे हैं जो वर्तमान फ़ोकस पर लागू नहीं होते हैं, आदि।
मॉडल में कोई दृश्य / नियंत्रक कोड नहीं है; कोई GUI विजेट कक्षाएं, संवाद बॉक्स बिछाने या उपयोगकर्ता इनपुट प्राप्त करने के लिए कोई कोड नहीं। दृश्य / नियंत्रक में कोई मॉडल कोड नहीं है; URL को मान्य करने या SQL प्रश्नों को निष्पादित करने के लिए कोई कोड नहीं है, और कोई मूल स्थिति भी नहीं है: विगेट्स द्वारा आयोजित कोई भी डेटा केवल प्रदर्शन उद्देश्यों के लिए है, और केवल मॉडल में संग्रहीत सही डेटा का प्रतिबिंब है।
अब, यहाँ एक सच्चे एमवीसी डिज़ाइन का परीक्षण किया गया है: कार्यक्रम सार में पूरी तरह कार्यात्मक होना चाहिए, यहां तक कि एक व्यू / कंट्रोलर संलग्न किए बिना भी। ठीक है, बाहरी दुनिया को इसके साथ उस रूप में बातचीत करने में परेशानी होगी, लेकिन जब तक किसी को उचित आदर्श एपीआई आवेगों के बारे में पता है, तब तक कार्यक्रम डेटा को सामान्य रूप से पकड़ और हेरफेर करेगा।
यह क्यों संभव है? ठीक है, सरल उत्तर यह है कि यह सभी मॉडल और दृश्य / नियंत्रक परतों के बीच कम युग्मन के लिए धन्यवाद है। हालाँकि, यह पूरी कहानी नहीं है। क्या पूरे MVC पैटर्न के लिए महत्वपूर्ण है दिशा सभी निर्देश प्रवाह: जिसमें उन कनेक्शन चला जाता है से देखें / नियंत्रक करने के लिए मॉडल। मॉडल कभी भी दृश्य / नियंत्रक को बताता है कि क्या करना है।
क्यों? क्योंकि MVC में, जबकि व्यू / कंट्रोलर को मॉडल (विशेष रूप से, मॉडल के एपीआई) के बारे में थोड़ा जानने की अनुमति है, लेकिन मॉडल को व्यू / कंट्रोलर के बारे में कुछ भी जानने की अनुमति नहीं है।
क्यों? क्योंकि MVC चिंताओं के स्पष्ट पृथक्करण के बारे में है।
क्यों? नियंत्रण से बाहर कार्यक्रम जटिलता को रोकने और आपको दफनाने में मदद करने के लिए, डेवलपर, इसके तहत। बड़ा कार्यक्रम, उस कार्यक्रम में घटकों की संख्या अधिक होती है। और अधिक कनेक्शन उन घटकों के बीच मौजूद होते हैं, डेवलपर्स के लिए व्यक्तिगत घटकों को बनाए रखने / बढ़ाने / बदलने के लिए, या यहां तक कि पूरे सिस्टम के काम करने के तरीके का पालन करना कठिन होता है। अपने आप से यह पूछें: जब कार्यक्रम की संरचना के आरेख को देखते हैं, तो क्या आप एक पेड़ या बिल्ली के पालने को देखेंगे? MVC पैटर्न परिपत्र कनेक्शन को बंद करके उत्तरार्द्ध से बचता है: B A से कनेक्ट हो सकता है, लेकिन A, B से कनेक्ट नहीं हो सकता है। इस मामले में, A मॉडल है और B व्यू / कंट्रोलर है।
BTW, यदि आप तेज हैं, तो आपको 'वर्णित एक तरफ़ा' प्रतिबंध के साथ एक समस्या दिखाई देगी: मॉडल मॉडल के उपयोगकर्ता डेटा में परिवर्तन के दृश्य / नियंत्रक को कैसे सूचित कर सकता है जब मॉडल की अनुमति नहीं है पता है कि दृश्य / नियंत्रक, कभी भी उसे संदेश नहीं भेजते? लेकिन चिंता न करें: इसका एक समाधान है, और यह पहले से थोड़ा सा गोल चक्कर लगने पर भी साफ-सुथरा है। हम एक पल में वापस आ जाएंगे।
व्यावहारिक रूप से, तब, एक दृश्य / नियंत्रक वस्तु, मॉडल के एपीआई के माध्यम से, 1. मॉडल को चीजें करने के लिए कह सकती हैं (आदेशों को निष्पादित करें), और 2. मॉडल को यह चीजें (रिटर्न डेटा) देने के लिए कहें। व्यू / कंट्रोलर लेयर निर्देश को मॉडल लेयर पर
धकेलता है और मॉडल लेयर से जानकारी खींचता है ।
और यहीं से आपका पहला MyCoolListControl उदाहरण गलत हो जाता है, क्योंकि उस वर्ग के लिए API को उस जानकारी को धकेलने की आवश्यकता होती है
, इसलिए आप परतों के बीच दो तरफ़ा युग्मन होने पर वापस आ जाते हैं, MVC नियमों का उल्लंघन करते हैं और आपको सही वापस डंप करते हैं बिल्ली की पालने की वास्तुकला जिसे आप [संभवतः] पहले स्थान पर टालने की कोशिश कर रहे थे।
इसके बजाय, MyCoolListControl वर्ग को प्रवाह के साथ जाना चाहिए, नीचे की परत से इसकी ज़रूरत के डेटा को खींचकर, जब इसे ज़रूरत हो। एक सूची विजेट के मामले में, इसका मतलब है कि आम तौर पर यह पूछने के लिए कि कितने मूल्य हैं और फिर बदले में उन वस्तुओं में से प्रत्येक के लिए पूछ रहे हैं, क्योंकि ऐसा करने का सबसे सरल और शिथिल तरीका है और इसलिए यह रखता है कि वहाँ क्या युग्मन न्यूनतम है। और यदि विजेट उपयोगकर्ता को उन मानों को अच्छी वर्णमाला के क्रम में प्रस्तुत करना चाहता है, तो वह इसका प्रतिगामी है; और इसकी जिम्मेदारी, निश्चित रूप से।
अब, एक अंतिम पहेली, जैसा कि मैंने पहले बताया था: आप एमवीसी-आधारित प्रणाली में यूआई के प्रदर्शन को मॉडल की स्थिति के साथ कैसे तालमेल रखते हैं?
यहाँ समस्या यह है: कई दृश्य ऑब्जेक्ट्स स्टेटफुल हैं, उदाहरण के लिए एक चेकबॉक्स टिक या अनचाहा हो सकता है, एक टेक्स्ट फ़ील्ड में कुछ संपादन योग्य पाठ हो सकता है। हालांकि, MVC यह निर्धारित करता है कि सभी उपयोगकर्ता डेटा को मॉडल परत में संग्रहीत किया जाना चाहिए, इसलिए प्रदर्शन उद्देश्यों के लिए अन्य परतों द्वारा आयोजित कोई भी डेटा (चेकबॉक्स की स्थिति, पाठ फ़ील्ड का वर्तमान पाठ) इसलिए उस प्राथमिक मॉडल डेटा की एक सहायक प्रतिलिपि होनी चाहिए। लेकिन अगर मॉडल की स्थिति बदल जाती है, तो उस स्थिति की दृश्य प्रतिलिपि अब सटीक नहीं होगी और उसे ताज़ा करने की आवश्यकता है।
पर कैसे? MVC पैटर्न मॉडल को उस जानकारी की एक नई प्रतिलिपि को दृश्य परत में धकेलने से रोकता है। हेक, यह मॉडल को दृश्य को एक संदेश भेजने की अनुमति भी नहीं देता है कि उसका राज्य बदल गया है।
हां तकरीबन। ठीक है, मॉडल परत को अन्य परतों से सीधे बात करने की अनुमति नहीं है, क्योंकि ऐसा करने के लिए उन परतों के बारे में कुछ पता होना चाहिए, और एमवीसी नियमों का पालन करता है। हालांकि, अगर एक जंगल में एक पेड़ गिरता है और कोई भी उसे सुनने के लिए आसपास नहीं होता है, तो क्या यह एक आवाज़ करता है?
आप जो उत्तर देखते हैं, वह एक सूचना प्रणाली स्थापित करना है, एक जगह के साथ मॉडल परत प्रदान करना यह विशेष रूप से नो-वन की घोषणा कर सकता है कि उसने कुछ दिलचस्प किया है। अन्य परतें उस अधिसूचना प्रणाली के साथ श्रोताओं को उन घोषणाओं को सुनने के लिए पोस्ट कर सकती हैं, जिनकी वे वास्तव में रुचि रखते हैं। मॉडल परत को किसी के बारे में कुछ भी जानने की जरूरत नहीं है कि कौन सुन रहा है (या भले ही कोई भी सब सुन रहा हो!)। यह सिर्फ एक घोषणा पोस्ट करता है और फिर इसके बारे में भूल जाता है। और अगर कोई भी उस घोषणा को सुनता है और ऐसा महसूस करता है कि वह कुछ कर रहा है - जैसे कुछ नए डेटा के लिए मॉडल पूछना तो वह अपने ऑन-स्क्रीन डिस्प्ले को अपडेट कर सकता है - फिर महान। मॉडल सिर्फ यह सूचीबद्ध करता है कि वह अपने एपीआई परिभाषा के हिस्से के रूप में क्या सूचनाएं भेजता है; और जो कोई और उस ज्ञान के साथ करता है, वह उनके ऊपर है।
MVC संरक्षित है, और हर कोई खुश है। आपका एप्लिकेशन ढांचा अच्छी तरह से एक अंतर्निहित सूचना प्रणाली प्रदान कर सकता है, या आप अपना स्वयं का लिख सकते हैं यदि नहीं ('पर्यवेक्षक पैटर्न' देखें)।
...
वैसे भी, उम्मीद है कि मदद करता है। एक बार जब आप एमवीसी के पीछे की प्रेरणाओं को समझ लेते हैं, तो जिन कारणों से चीजों को जिस तरह से शुरू किया जाता है, वह तब भी समझ में आता है, जब पहली नजर में - वे जरूरत से ज्यादा जटिल लगते हैं।
चीयर्स,
है