2012-01-14 14 views
6

कोई भी उदाहरण दे सकता है कि एक सरल मॉडल और केवल एक दृश्य के बजाय एमवीसी का उपयोग करना फायदेमंद क्यों होगा।मॉडल-व्यू पर मॉडल-व्यू-कंट्रोलर (एमवीसी) का क्या फायदा है?

नोट: चाहे इसे एमवीसी या एमवीपी (मॉडल-व्यू-प्रेजेंटर) कहा जाता है, मैं उस दृश्य के बारे में बात कर रहा हूं जहां व्यू इनपुट प्राप्त करता है, तो नियंत्रक कुछ क्रियाओं में इनपुट की व्याख्या करके इनपुट ईवेंट का जवाब देगा मॉडल द्वारा किया जाना चाहिए। जब मॉडल बदलता है, तो मॉडल मॉडल से होने वाली घटनाओं का जवाब देकर स्वयं अपडेट हो जाएगा।

मॉडल को दृश्य में घटनाओं का जवाब देने और इसके विपरीत होने का नुकसान उठाने का क्या नुकसान है?

एमवीसी में, अगर मैंने मॉडल को ऐसे तरीके से बदल दिया जो नियंत्रक को प्रभावित करता है तो मुझे नियंत्रक में परिवर्तन करना होगा। मॉडल-व्यू में, यदि मैं मॉडल बदलता हूं, तो मुझे दृश्य को अपडेट करना होगा।

तो ऐसा लगता है कि हम "नियंत्रक" भाग जोड़कर जटिलता पेश कर रहे हैं?

उत्तर

4

MVC में, मॉडल पर्यावरण के लिए अंधा होता है, दृश्य भी हो सकता है (अंधेरे से) इसकी घटनाओं को नियंत्रक के लिए, जो दृश्य और मॉडल के बारे में अधिक जानता है। तो जब सब कुछ कहा और किया जाता है, तो नियंत्रक प्रणाली का 'गैर-पुन: प्रयोज्य' डिस्पोजेबल हिस्सा है, क्योंकि यह सबसे संदर्भ जागरूक घटक है।

अगर मैं नियंत्रक प्रभावित करता है एक तरह से मॉडल बदल ...

मॉडल को इस तरह से सरल CRUD तरीकों का खुलासा करना चाहिए में कुछ भी पता नहीं है तरीकों का उपयोग कर उन है कि पास किए गए अद्यतन ऑब्जेक्ट के बारे में, न ही मॉडल के अंदर वास्तव में क्या होता है।

इसका मतलब है कि दृश्य, आईएमओ को पारित रिकॉर्ड बनाकर थोड़ा सा काम करना पड़ता है, क्योंकि नियंत्रकों को स्टेटलेस माना जाता है और दृश्य अधिक लगातार होता है। नियंत्रक ट्रिगर हो जाते हैं और 'किक-इन' पास किए गए ऑब्जेक्ट के साथ अपना काम करते हैं और उनके पास कोई राज्य नहीं होता है।

पारित डेटा किसी प्रकार के सामान्य सम्मेलन द्वारा बनाया गया है।

मुझे और भी आगे जाने दो।मान लीजिए कि आपके पास एक दृश्य, एक सारणी है, और एक नियंत्रण जिसकी सक्षम संपत्ति ग्रिड में चयनित है, पर क्लिक किया जाता है - आप एक ऐसा दृश्य बना सकते हैं जो आंतरिक रूप से उन नियंत्रणों और इस तर्क को संभालता है, और शायद यह जाने का तरीका होगा इस तरह के एक सरल उदाहरण में।

लेकिन जितना अधिक परमाणु आपके विचार हैं, वे जितना अधिक पुन: प्रयोज्य हो जाते हैं, इसलिए आप प्रत्येक के लिए एक दृश्य बनाते हैं, हां हर, नियंत्रण। अब आप एक ऐसी स्थिति को देख रहे हैं जहां सही सूचना के लिए खुद को पंजीकृत करने के लिए विचारों को एक दूसरे के बारे में जानना है ...

यह वह जगह है जहां नियंत्रक कदम उठाता है, क्योंकि हम इन सभी निर्भरताओं को उसके ऊपर रखना चाहते हैं, दीर्घकालिक डिस्पोजेबल एक। तो नियंत्रक इस प्रकार के व्यू-टू-व्यू अधिसूचना योजना का प्रबंधन करता है।

अब आपके विचार अज्ञानी हैं क्योंकि वे स्वतंत्र और स्वतंत्र हो सकते हैं, इस प्रकार पुन: प्रयोज्य।

आप सिस्टम के बारे में जानने के बिना, या 'व्यापार तर्क' के रूप में बिना किसी कोड को कॉल कर सकते हैं। आप अपने लक्ष्यों के बारे में बहुत कुछ जानने के बिना मॉडल को कोड कर सकते हैं (हालांकि यह मॉडल को ट्विक करने में मदद करता है ताकि इसे आपके डेटा में वापस लौटने में सक्षम बनाया जा सके) .... लेकिन नियंत्रक, वे आखिरी हैं और आपको होना है पिछले दो चीजों को एक साथ तारों से तारने से पहले पुष्टि की गई।

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

तो, अंत में इसका मतलब है एक दृश्य के कार्यों/गुण है कि इस तरह नहीं (नीचे चेतावनी) होना चाहिए:

public property BackgroundColor{get;set} 

न ही

public function ScrollBy(x,y){} 

लेकिन बजाय:

public SetProp(string name, object val){} 

और

public DoCmd(string name, object val){} 

यह थोड़ा सा योगदान है, और याद रखें मैंने अंततः कहा ... और आप पूछते हैं कि यह एक अच्छा विचार क्यों है?

दिमाग में पुन: प्रयोज्यता के साथ, मान लीजिए कि आप एक दिन WinForms से चीजों को बंद करना चाहते हैं, कहें, फ्लेक्स, या सरल एक नई-फंक्ड कंट्रोल लाइब्रेरी का उपयोग करना चाहते हैं जो समान क्षमताओं का पर्दाफाश नहीं कर सकता है।

मैं यहां 'बंदरगाह' कहता हूं, लेकिन यह वास्तव में लक्ष्य नहीं है, हम इस विशेष ऐप को पोर्ट करने के लिए चिंतित नहीं हैं, लेकिन अंतर्निहित एमवीसी तत्वों को सामान्य रूप से छोड़कर एक नए स्वाद में ले जाने के लिए पर्याप्त है - आंतरिक रूप से एक सतत और क्षमता-स्वतंत्र बाहरी इंटरफ़ेस बरकरार है।

यदि आपने ऐसा नहीं किया है, तो जब आपका नया स्वाद आता है, तो संभावित रूप से पुन: प्रयोज्य/पुन: प्रयोज्य/विस्तार योग्य नियंत्रकों में गुणों को देखने के लिए आपके सभी कठिन संदर्भों को मक्खन किया जाना चाहिए।

इसका मतलब यह नहीं है कि इस तरह के जेनेरिक सेटर्स और सीएमडीएस को आपके सभी विचार क्षमताओं के लिए इंटरफ़ेस होना चाहिए, बल्कि उन्हें 'एज केस' गुणों के साथ-साथ पारंपरिक प्रोप/cmds को पारंपरिक रूप से प्रदर्शित कर सकते हैं हार्ड लिंक रास्ता। इसे 'विस्तारित गुण' हैंडलर के रूप में सोचें।

इस तरह, (फिर से काल्पनिक), मान लीजिए आप एक रूपरेखा जहां अपने बटन नहीं रह संपत्ति buttonIcon है पर निर्माण कर रहे हैं। ठंडा हो जाता है क्योंकि आपके पास बटन दृश्य इंटरफ़ेस बनाने के लिए दूरदर्शिता थी, जहां बटन आइकन एक विस्तारित संपत्ति है, और दृश्य के अंदर आपका सशर्त कोड सेट-प्राप्त होने पर अब नो-ऑप करता है।

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

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

+0

मैं एक साधारण उदाहरण दूंगा कि मुझे लाभ क्यों नहीं मिला। मान लें कि हम एक कार के बारे में बात कर रहे हैं। कार व्यू का त्वरित बटन क्लिक किया गया, नियंत्रक मॉडल को कॉल करके जवाब देता है। एक्सेलेरेट(), फिर मॉडल की गति बदल दी गई है और मॉडल ईवेंट पर प्रतिक्रिया देखें और स्क्रीन पर स्पीड रीडिंग अपडेट करें। अब, मॉडल-व्यू (एमवी) में जब बटन क्लिक किया गया, तो कॉल मॉडल देखें। एक्सेलेरेट() और नियंत्रक के बिना भी ऐसा होता है। एमवीसी में अगर मैंने एक्सेलेरेट() को बढ़ाया स्पीड() में बदल दिया है तो मुझे कॉल करने के लिए नियंत्रक को अपडेट करना होगा यह विधि। एमवी के मामले में, मैं वही अपडेट करूँगा लेकिन दृश्य में। –

+0

निरंतर पिछली टिप्पणी: इसलिए, फायदे केवल निम्नलिखित मामलों में लागू होते हैं: 1. आपके विचार आपकी वर्तमान परियोजना (जो दुर्लभ है) के लिए विशिष्ट नहीं हैं। 2. मैं किसी के बारे में नहीं सोच सकता !!! (शायद अनुभव की कमी)। –

+0

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

1

यह वास्तव में डोमेन तर्क से वर्कफ़्लो तर्क को अलग करके जटिलता को कम करता है। यह इकाई परीक्षणों को लिखना भी आसान बनाता है और आपके एप्लिकेशन को बनाए रखने और विस्तार करने में आसान बनाता है।

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

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

इससे भविष्य में ढांचे को बदलना भी आसान हो जाएगा - मॉडल शायद अधिक नहीं बदलेगा और इसलिए अधिक पोर्टेबल होगा।

कहा करने के बाद, आप MVVM आप अपनी प्रस्तुति परत के रूप में प्रयोग कर रहे हैं, उसके आधार पर जांच करने के लिए चाहते हो सकता है: - बंद गुजर Benefits of MVVM over MVC

1

MVC/पी के लाभ एमवी से अधिक (मैं यहाँ नियंत्रक निगरानी के बारे में बात कर रहा हूँ) में शामिल हैं:

  • आप नियंत्रक में कोड बंधन जटिल डेटा संभाल कर सकते हैं यदि आवश्यक हो।

  • आप एक यूआई परीक्षण ढांचे के बिना है कि जटिल प्रस्तुति तर्क परीक्षण कर सकते हैं।

  • तुम भी एक ग्राफिक डिजाइनर अपने विचार कर गंदगी अपने कोड जब वे अपने विचारों को ठीक कर सकते हैं, और अपने कोड नहीं देखते हैं, और नहीं।

संबंधित मुद्दे