जटिल MVVM (कई विचारों) के साथ मदद


18

मुझे निम्नलिखित परिदृश्य के लिए दृश्य मॉडल बनाने में मदद चाहिए:

  1. दीप, पदानुक्रमित डेटा
  2. डेटा के एक ही सेट के लिए एकाधिक दृश्य
  3. प्रत्येक दृश्य सक्रिय चयन के आधार पर एक एकल, गतिशील रूप से परिवर्तित दृश्य है
  4. एक संपत्ति के मूल्य के आधार पर, टैब नियंत्रण में विभिन्न प्रकार के टैब प्रदर्शित करते हैं

यहाँ छवि विवरण दर्ज करें

मेरे सवाल:

क्या मुझे प्रत्येक दृश्य (VM1, VM2, आदि) के लिए एक दृश्य-मॉडल प्रतिनिधित्व बनाना चाहिए?

1. Yes:
    a. Should I model the entire hierarchical relationship? (ie, SubVM1, HouseVM1, RoomVM1)
    b. How do I keep all hierarchies in sync? (e.g, adding/removing nodes)

2. No:
    a. Do I use a huge, single view model that caters for all views?

यहाँ एकल दृश्य का एक उदाहरण दिया गया है

चित्र 1: सक्रिय कमरे के आधार पर एकाधिक दृश्य अपडेट किए गए। नोटिस टैब नियंत्रण

यहाँ छवि विवरण दर्ज करें

चित्र 2: अलग सक्रिय कमरा। एकाधिक दृश्य अपडेट किए गए। ऑब्जेक्ट की संपत्ति के आधार पर टैब नियंत्रण आइटम बदल गए।

यहाँ छवि विवरण दर्ज करें

चित्र 3: विभिन्न चयन प्रकार। पूरा दृश्य बदल जाता है

यहाँ छवि विवरण दर्ज करें


btw क्या एक मुलि दृश्य है? लेखन त्रुटि है?
जेन्सजी

"मूली दृश्य" एक टाइपो था। मेरा मतलब एक ही मॉडल / व्यू मॉडल के लिए अलग-अलग विचार था। मेरा सवाल यह था कि क्या मुझे प्रत्येक दृश्य के लिए पूरे मॉडल पदानुक्रम को फिर से तैयार करना / लपेटना चाहिए, इसलिए प्रत्येक दृश्य मॉडल में केवल वही होता है जो किसी व्यक्ति की आवश्यकता है? या क्या मुझे एकल दृश्य मॉडल पदानुक्रम बनाना चाहिए जिसमें सभी विचारों से गुण हों? चूँकि मैंने यह प्रश्न पोस्ट किया था, इसलिए मैं (संयुक्त राष्ट्र) सौभाग्यशाली था कि दोनों के पक्ष / विपक्ष का पता लगाना मुश्किल था। भविष्य में मेरे अनुभव के पूर्ण निदान के साथ इस धागे को अपडेट करेंगे, एक बार जब चीजें विषम नहीं होती हैं।
ज्यारस

याद रखें कि एक डिजाइन नियम पहले सामान्य चीजों को दिखाने के लिए है, फिर विवरण में गहराई से जाएं। यह आपको एक हल्के दृश्य के साथ छोड़ देगा और यदि उपयोगकर्ता गहराई में जाता है तो नए दृश्य दिखाई देंगे। इसलिए उनके दृष्टिकोण के साथ छोटे विचारों का उपयोग करें। इस आर्टिकल डिज़ाइन यूज़र इंटरफ़ेस की
Csharls

@jsjslim मैंने पढ़ा जब मैं "सभी पदानुक्रम को सिंक में रखता हूं" पढ़ता हूं। मुझे संदेह है कि आप बहु-दृश्य के साथ गए थे, और मुझे संदेह है कि आपने इसे पछताया है (लेकिन मैं पहले गलत था)। अन्य पाठकों के लिए जिनके पास एक ही प्रश्न हो सकता है, क्या आप कम से कम हमें एक त्वरित (ईश) उत्तर दे सकते हैं?
गाय शालनाट

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

जवाबों:


13

प्रश्न का उत्तर देने के लिए, हां, प्रत्येक दृश्य का अपना दृश्य मॉडल होना चाहिए। लेकिन पूरे पदानुक्रम को मॉडल करने की आवश्यकता नहीं है। केवल दृश्य की आवश्यकता है।

MVVM के बारे में सबसे अधिक ऑनलाइन संसाधनों के साथ मुझे जो समस्या थी:

अधिकांश उदाहरणों में, दृश्य मॉडल का लगभग 1 से 1 मैपिंग है। लेकिन मेरे परिदृश्य में, जहां एक ही मॉडल के विभिन्न पहलुओं के लिए अलग-अलग विचार हैं, मैं खुद को दो विकल्पों के बीच फंसा हुआ पाता हूं:

एक अखंड दृश्य मॉडल जो अन्य सभी दृश्य मॉडल द्वारा उपयोग किया जाता है

यहाँ छवि विवरण दर्ज करें

या प्रत्येक दृश्य के लिए एक दृश्य मॉडल

यहाँ छवि विवरण दर्ज करें

लेकिन दोनों आदर्श नहीं हैं।

मॉडल-उन्मुख दृश्य मॉडल (एमवीएम), जबकि कोड दोहराव में कम है, बनाए रखने के लिए एक बुरा सपना है

व्यू-ओरिएंटेड व्यू मॉडल (VVM) प्रत्येक दृश्य के लिए अत्यधिक-विशिष्ट कक्षाएं बनाता है, लेकिन इसमें डुप्लिकेट शामिल हैं।

अंत में, मैंने फैसला किया कि प्रति दृश्य एक वीएम रखना और बनाए रखना आसान है, इसलिए मैं वीवीएम दृष्टिकोण के साथ गया।

एक बार कोड काम कर रहा है, मैंने सभी सामान्य गुणों और परिचालनों को उसके वर्तमान, अंतिम रूप में बदलना शुरू कर दिया है:

यहाँ छवि विवरण दर्ज करें

इस अंतिम रूप में, प्रत्येक VVM में सामान्य दृश्य मॉडल वर्ग की रचना की जाती है।

बेशक, मुझे अभी भी तय करना है कि क्या आम / विशेष माना जाता है। और जब कोई दृश्य जोड़ा / विलय / हटाया जाता है, तो यह संतुलन बदल जाता है।

लेकिन इसके बारे में अच्छी बात यह है कि मैं अब सदस्यों को आम से लेकर वीवीएम तक और इसके विपरीत आसानी से धकेलने में सक्षम हूं।

और वस्तुओं को सिंक में रखने के बारे में एक त्वरित टिप्पणी:

कॉमन व्यू मॉडल होने से इस सबसे ध्यान जाता है। प्रत्येक VVM में समान कॉमन व्यू मॉडल का संदर्भ हो सकता है।

मैं भी सरल कॉलबैक विधियों के साथ शुरू करते हैं, और कई श्रोताओं की आवश्यकता उत्पन्न होने पर घटना / पर्यवेक्षक के लिए विकसित हो रहे हैं।

और वास्तव में जटिल घटनाओं (यानी, अप्रत्याशित कैस्केडिंग अपडेट) के लिए, मैं एक मध्यस्थ का उपयोग करने के लिए स्विच करूंगा।

मैं उस कोड से दूर नहीं भागता जहाँ एक बच्चे के पीछे उसके माता-पिता का संदर्भ होता है। कोड काम करने के लिए कुछ भी।

और अगर रिफ्लेक्टर का अवसर पैदा होता है, तो मैं इसे ले जाऊंगा।

मैंने जो सबक सीखा:

  1. अग्ली / वर्किंग कोड> ब्यूटीफुल / नॉन-वर्किंग कोड
  2. कई छोटी कक्षाओं को मर्ज करना आसान है, इससे बड़ी कक्षा को तोड़ना है

काश मैं इसे दो बार बढ़ा पाता। यह मेरे द्वारा देखे गए विकल्पों में से एक स्पष्ट व्याख्या है।
क्लीवरपैट्रिक

3

आपके मॉकअप को देखते हुए, मैं निश्चित रूप से ViewModels के पदानुक्रम और बहुत सारे छोटे दृश्य बनाने की सलाह दूंगा। और आपको संभवतः मूल पदानुक्रम का थोड़ा सा मॉडल करना होगा।

ViewModels के बीच तालमेल रखने के लिए, या तो घटनाओं का उपयोग करें, या ViewModels के बीच एक दूसरे के गुण हैं। दृश्य और ViewModels के बीच सिंक मानक अधिसूचित गुण होना चाहिए।

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