एमवीसी पर कई विचार एक ही नियंत्रक हो सकते हैं या एक दृश्य में एक अद्वितीय नियंत्रक होना चाहिए?


15

एमवीसी के आसपास एक परियोजना के लिए एक वास्तुकला डिजाइन करते समय मुझे कुछ प्रश्न हैं। (यह एक सी ++ / मुरब्बा एसडीके परियोजना है, मैं किसी विशेष एमवीसी ढांचे का उपयोग नहीं कर रहा हूं, मैं एक बना रहा हूं।)

कई लेखों पर (जैसे मूल स्टीव बर्कब लेख पर ) मैं "एमवीसी ट्रायड" अवधारणा को पढ़ता रहता हूं, जो मुझे इस अवधारणा के बजाय, क्योंकि मैंने इस अवधारणा को सचमुच लिया है। जब मैंने इसे पहली बार पढ़ा, तो ऐसा लगा जैसे "MVC ट्रायड" इकाइयों के आसपास एक एप्लिकेशन बनाया गया है - प्रत्येक यूआई पीस के लिए जो मुझे चाहिए था - लेकिन मुझे लगता है कि यह अन-फ्लेक्सिबल है और मुझे लगता है कि एमवीसी का उपयोग करने का इरादा नहीं था। फिर, इस मुद्दे पर आगे शोध करते हुए, मुझे नियंत्रक और दृश्य के तंग युग्मन के कई उदाहरण मिले, अर्थात्, 1 से 1 संबंध - TextEditView में TextEditController है।

लेकिन जब मैं अपनी परियोजना में वापस आता हूं तो मुझे पता चलता है कि एक नियंत्रक ('तार्किक इकाई' द्वारा, AddElementController की तरह) उपयोगी हो सकता है और उस विशेष नियंत्रक के लिए कई विचार हो सकते हैं।

मैं एक AddElementController की तरह कुछ के बारे में स्पष्ट रूप से सोच रहा हूं जिसमें कुछ प्रकार का टैब UI होना चाहिए। क्या मेरे पास एक AddElementController होनी चाहिए जिसमें एक AddElementTabView है और टैब के लिए कई AddImageView, AddSoundView, आदि हैं? या मेरे पास प्रत्येक टैब दृश्य के लिए एक अलग 'उप-नियंत्रक' होना चाहिए?

संक्षेप में, और एमवीसी पैटर्न के बारे में (एक्स पैटर्न विशेष समझ / इस पैटर्न के कार्यान्वयन के बारे में नहीं), क्या किसी नियंत्रक के लिए कई विचार रखना सही है या प्रत्येक दृश्य के लिए यह विशेष नियंत्रक होना चाहिए?

इसके अलावा, नियंत्रक पर कुछ राज्य की जानकारी रखना सही है या क्या यह स्टेटलेस होना चाहिए (इसका अर्थ है कि राज्य को कुछ गैर-डोमेन राज्य मॉडल पर रखा जाना चाहिए)?

सभी को अग्रिम धन्यवाद।

जवाबों:


14

समस्या यह है कि MVC पैटर्न एक ऐसी प्रणाली में डिज़ाइन किया गया था जो वास्तव में अब मौजूद नहीं है। इसका आविष्कार स्मॉलटॉक में उस समय किया गया था जब UI लाइब्रेरी मौजूद नहीं थीं। एक विंडो डायलॉग बनाने के लिए, आपने सभी बॉक्सों को आकर्षित किया, उचित वर्गों को हाइलाइट किया, यह सुनिश्चित किया कि आप जिस टेक्स्ट को ड्रॉ कर रहे थे, वह सही जगह पर समाप्त हो गया ... आदि ...

कल्पना कीजिए कि एक बड़े कैनवस के अलावा और कुछ नहीं एक डायलॉग ऐप लिखना क्या होगा। यही दुनिया एमवीसी से आती है।

इस प्रणाली में एक "दृश्य" एक पाठ बॉक्स था और यह एक वर्ग था जो बॉक्स को आकर्षित करने, पाठ, चयनित क्षेत्रों को खींचने, पाठ में परिवर्तन का जवाब देने आदि के लिए जिम्मेदार था ...

एक "नियंत्रक" एक अन्य वर्ग था जो माउस घटनाओं को ले गया था जो इस बॉक्स में माउस ले जाना, कुंजी डाउन, कुंजी अप, क्लिक्स, आदि जैसे थे ... और यह तय करेगा कि क्या हुआ। क्या हमें पाठ बदलना चाहिए? क्या हमें चयन बदलना चाहिए? इस तरह के सामान।

एक "मॉडल" अभी तक एक अन्य वर्ग था जो मूल डेटा और घटक की स्थिति का प्रतिनिधित्व करता था। एक टेक्स्ट बॉक्स मॉडल में निश्चित रूप से, फ़ॉन्ट, चयन, आदि का पाठ होगा ...

जैसा कि आप देख सकते हैं, इस तरह की स्थिति में तीन घटक एक विचार के प्रतिनिधित्व में बहुत उलझ गए हैं। यह इस संदर्भ में "त्रय" की बात करता है।

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

एक प्रणाली में मैंने हाल ही में उदाहरण के लिए हमें लगभग 10+ एक एकल दस्तावेज़ "धारक" और इसके सक्रिय दस्तावेज़ का अवलोकन करते हुए देखा था। एक मुख्य ड्राइंग इंटरफ़ेस ने दस्तावेज़ के लेआउट के साथ बातचीत की, विभिन्न संपत्ति के विचार जो चयनित आइटम का अवलोकन करते हैं और एक रिकॉर्ड इंटरफ़ेस प्रदान करते हैं, और मुख्य दृश्य का एक छोटा पैमाने का प्रतिनिधित्व है जो केवल दृश्यमान विंडो के बजाय पूरे दस्तावेज़ को दिखाता है। इनमें से कुछ विचारों में अलग-अलग जटिलता के नियंत्रक थे जिन्होंने GUI घटनाओं को दस्तावेज़ में बदल दिया, जो बदले में इसके विभिन्न विचारों को सूचित करेंगे।

क्या आप अभी भी ऐसे रिश्ते को "त्रय" कह सकते हैं? शायद, लेकिन मुझे लगता है कि यह एमवीसी के पूर्व, पुराने आवेदन के बहुत अधिक है।

क्या आप विभिन्न विचारों के साथ नियंत्रकों को साझा कर सकते हैं? निर्भर करता है कि विचार समान कैसे हैं। मैंने पाया है कि आम तौर पर इस प्रकार की वस्तु को बोलने का व्यवहार विशिष्ट होता है, जिसे वह नियंत्रित करता है और जिस मॉडल में हेरफेर होता है वह बहुत पुन: प्रयोज्य होता है ... लेकिन हमेशा अपवाद होता है।


5

निर्भर करता है। एमवीसी के कई संस्करण हैं, कुछ जहां केवल 1: 1 संबंध समझ में आता है (जैसे "विनम्र संवाद बॉक्स"), अन्य जहां यह मामला नहीं है। मैं सबसे महत्वपूर्ण MVC वेरिएंट की व्याख्या करते हुए, " बिल्ड योर ओन कैब " श्रृंखला को पढ़ने की सलाह दूंगा।


3

MVC में दृश्यों का नियंत्रण नहीं है। नियंत्रक बॉस है, इसलिए एक नियंत्रक तय करता है कि कौन सा दृश्य प्रस्तुत किया जाना है और कौन सा नियंत्रक दृश्य का अनुरोध नहीं करता / करती है।

एक नियंत्रक से आपके पास बिल्कुल / कई दृश्य होंगे। यदि आप MVC पैटर्न के साथ रहना चाहते हैं तो प्रत्येक दृश्य के लिए एक मॉडल बनाने के बारे में सोचें।


3

नियंत्रक का बिंदु आपके डोमेन मॉडल के साथ उपयोगकर्ता की बातचीत को नियंत्रित करना है - अर्थात, यह उपयोगकर्ता (दृश्य) और आपके अनुप्रयोगों (मॉडल) की स्थिति को देखने के बीच अप्रत्यक्ष स्तर है।

जब उपयोगकर्ता एक अनुरोध करता है, तो इसे एक नियंत्रक को निर्देशित किया जाता है। नियंत्रक तय करता है कि आवेदन के लिए उस अनुरोध को कैसे रिले किया जाए, आमतौर पर किसी प्रकार के सेवा वर्ग के माध्यम से। यह तब उस सेवा वर्ग से प्रतिक्रिया की व्याख्या करता है और उपयोगकर्ता को वापस भेजने के लिए क्या दृश्य तय करता है।

एक नियंत्रक हमेशा एक ही दृश्य (1: 1) वापस कर सकता है यदि उपयोगकर्ता केवल एक ही प्रकार का अनुरोध कर सकता है, तो उपयोगकर्ता को हमेशा उसी तरह की प्रतिक्रिया की आवश्यकता होती है। उदाहरण के लिए, HelloWorldControllerहमेशा एक HelloWorldViewप्रदर्शन "हैलो, वर्ल्ड!" लौटाएगा ।

दूसरी ओर, एक नियंत्रक को अक्सर अलग-अलग विचारों पर निर्णय लेना पड़ता है, जो इस बात पर निर्भर करता है कि मॉडल उसे क्या बताता है। TeamRosterControllerएक वापस कर सकती है RugbyTeamRosterViewया एक FootbalTeamRosterViewटीम का अनुरोध के प्रकार पर निर्भर करता है,।

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

मैं अत्यधिक वास्तविक MVC फ्रेमवर्क को देखने की सलाह देता हूं, यह देखने के लिए कि यह क्या करता है और यह कैसे काम करता है। आपको इसका उपयोग करने की आवश्यकता नहीं है, लेकिन आप अपना निर्माण करने से पहले एक बेहतर समझ प्राप्त करेंगे।

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