उचित मॉडल-देखें -_____ डिजाइन


14

मैं मॉडल व्यू कंट्रोलर, मॉडल व्यू प्रस्तुतकर्ता, मॉडल व्यू व्यूमॉडल इत्यादि के बारे में पढ़ रहा हूं, और आम तौर पर, अंतर्निहित अवधारणा समझने में बहुत आसान लगती है: सुंदर दृश्यों और विज्ञानमय हिम्मत को एक दूसरे से अलग और अज्ञानी के रूप में रखें। मुमकिन। डिज़ाइन चॉकलेट में लॉजिक पीनट बटर नहीं मिल रहा है; शांत, मुझे यह पसंद है।

समस्या यह है कि मैं अभी भी उस तीसरे भाग के रूप में थोड़ा सा फजी हूं ... न कि मॉडल-या-व्यू। हर किसी को लगता है कि उसे क्या कॉल करना है, उसे क्या करना चाहिए, क्या उचित है, क्या सीधा सादा गलत है ... और मैं यह जानने की कोशिश कर रहा हूं कि जब एक प्रेजेंटर एक ViewModel बन जाता है और जब एक दृश्य देखना चाहिए ' टी ऐसा कर रहे हैं क्योंकि वह प्रस्तुतकर्ता का काम है और--

मैं जुआ खेल रहा हूं।

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

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

नोट: मैं मॉडल-व्यू के रहस्यमय तीसरे भाग के लिए "ब्रिज" का उपयोग करूंगा? किसी भी अवचेतन सुझाव से बचने के लिए कि यह क्या होना चाहिए।

नमूना

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

राय

  • उपयोगकर्ता को डेटा को देखने और हेरफेर करने का एक तरीका प्रदान करने से संबंधित है।
  • ब्रिज से डेटा अपडेट के बारे में जानकारी प्राप्त करता है।
  • उपयोगकर्ता को डेटा और नियंत्रण प्रस्तुत करने के लिए सभी तर्क सम्‍मिलित और निष्पादित करता है।
  • पुल को सूचित करता है जब उपयोगकर्ता ने एक कार्रवाई की है जो (संभवतः) मॉडल को प्रभावित करता है।
  • ब्रिज को सूचित करता है कि उसे किस जानकारी में दिलचस्पी है।
  • मॉडल का शून्य ज्ञान है।

पुल

  • मॉडल और दृश्य के बीच समन्वयक और अनुवादक है।
  • मॉडल और दृश्य के बीच पारित होने वाली जानकारी के लिए कोई भी उपयुक्त स्वरूपण परिवर्तन करता है।
  • "जो जानने की आवश्यकता है, उस पर जानकारी रखता है"।
  • मॉडल और दृश्य दोनों का ज्ञान है।

अतिरिक्त नोट्स

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

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

और हमेशा की तरह, अपने समय के लिए धन्यवाद।


2
व्यू ब्लॉक में एक कॉपी-पेस्ट-त्रुटि है। मुझे लगता है कि अंतिम बुलेट को "मॉडल के शून्य कोनवॉलेज को पढ़ना चाहिए।" और 1 अतिरिक्त नोट का अंतिम वाक्य शायद "मॉडल" के साथ समाप्त होना चाहिए "पुल" नहीं ??
जोहान्स एस।

जवाबों:


7

आपका मुहावरा

"मॉडल और व्यू के बीच समन्वयक और अनुवादक है।"

इंगित करता है कि आपका ब्रिज एमवीपी वास्तुकला में प्रस्तुतकर्ता है।

एमवीपी और एमवीसी बहुत समान हैं, सिवाय इसके कि एमवीपी में केवल प्रस्तुतकर्ता ही मॉडल का अवलोकन करता है जबकि एमवीसी में व्यू को सीधे मॉडल (प्रस्तुतकर्ता के बिना "ब्रिज" के रूप में) देखने की अनुमति है।

आपकी मॉडल जिम्मेदारी

"डेटा बदलने पर ब्रिज को सूचित करता है (डेटा के लिए ब्रिज ने रुचि व्यक्त की है)।"

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

"राज्य या गणना परिणामों की निगरानी के लिए बाहर के ग्राहकों (जिसके बारे में इसे कुछ भी नहीं पता है) को अनुमति देता है।"

यदि आपके मॉडल में आपके नियंत्रक या दृश्य पर कोई निर्भरता नहीं है, तो परीक्षण करना आसान है और अधिक पोर्टेबल है।


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

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

1
लगता है कि आप एक अच्छा डिजाइन मिल गया है, तो। PS एमवीपी पर एमवीसी पर विचार करने का कारण यह है कि, अनुशासन के बिना, प्रस्तुतकर्ता बोझ बन सकता है।
लैरी ओब्रायन

1
एमवीसी और एमवीपी के बीच अंतर बताने के लिए +1। ओपी की तरह, इंटरनेट के बाकी हिस्सों ने मुझे पूरी तरह से खो दिया है कि क्या ये जोड़ियां थोड़ी अलग थीं।
Ixrec

5

मुझे उन चीजों में से एक पर संदेह है जो आपको भ्रमित कर रही हैं कि दो पूरी तरह से अलग-अलग पैटर्न हैं जिन्हें आमतौर पर मॉडल-व्यू-कंट्रोलर कहा जाता है।

वहाँ मूल है, जैसा कि छोटेटॉक में लागू किया गया है और जो स्थानीय गुई सिस्टम के लिए उपयोगी है, और इसके साथ ही मैं वेब-एमवीसी के बारे में सोचता हूं, जो विचारों और नियंत्रकों की कुछ जिम्मेदारियों के आसपास स्वैप करता है ताकि नियंत्रक सर्वर पर बैठ सकें। ग्राहक पर विचार किया जा रहा है (शायद html के रूप में, या शायद ajax के माध्यम से)।

आपका विवरण मुझे ऐसा लगता है जैसे यह वेब-एमवीसी की अधिकांश परिभाषाओं के भीतर बैठेगा।


यह समझा सकता है कि मुझे अवधारणा के चारों ओर अपना सिर लपेटने में इतनी परेशानी क्यों हो रही है। धन्यवाद; यह जानना अच्छा है कि मैं (शायद) एमवीसी की अवधारणा के साथ कुछ भी गलत नहीं कर रहा हूं।
KoratDragonDen

आधुनिक सिंगल-पेज वेब एप्लिकेशन के लिए, हम क्लाइंट की तरफ क्लासिक MVC पैटर्न में वापस आ गए हैं।
केविन क्लाइन

2

इस सटीक नामकरण के बारे में प्रोग्रामिंग समुदाय में बहुत चर्चा है। कोई भी किसी भी चीज के बारे में ज्यादा सहमत नहीं है।

मेरे लिए, पुल को किस तरह से देखने के लिए वायर्ड किया जाता है, ज्यादातर नाम निर्धारित करता है।

  • यदि प्रति पुल पर विचारों का संग्रह हो सकता है, तो पुल एक नियंत्रक है।
  • यदि प्रति पुल पर हमेशा एक दृश्य होता है, तो पुल एक प्रस्तोता है।
  • यदि प्रति दृश्य पुलों का संग्रह हो सकता है, तो पुल एक दृश्य मॉडल है।

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


एक साइड नोट के रूप में, मुझे इस तरह की जिम्मेदारियों को पूरा करना पसंद है:

नमूना

प्राथमिक ज़िम्मेदारी: डेटा
सेकेंडरी रोल्स: मान्य अपडेट, अपडेट के पर्यवेक्षकों को सूचित करें

राय

प्राथमिक जिम्मेदारी: वर्तमान डेटा
सेकेंडरी रोल्स: इनपुट स्वीकार करें, वर्तमान UX

पुल

प्राथमिक जिम्मेदारी: अपडेट डेटा
सेकेंडरी रोल्स: क्लीन इनपुट, सिंक डेटा और व्यूज


0

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

मैं निम्नलिखित पैटर्न (एमी पैलामाउंट की बात राज्य के शत्रु से लिया गया) का उपयोग करके आपके विचारों का विस्तार करने की सलाह देता हूं :

मॉडल

  • डेटा स्टोर के साथ सिंक स्थिति
  • नए / अपडेट किए गए डेटा का सत्यापन
  • जब वे राज्य बदलते हैं तो घटनाओं को उठाएं

दृश्य

  • रेंडर टेम्प्लेट
  • मॉडल ईवेंट्स को हैंडल करें
  • डोम घटनाओं को संभालें
  • मॉडल और डोम के बीच बातचीत को मध्यस्थता करता है

नियंत्रकों

  • का प्रबंध ज्यादा से ज्यादा एक जोड़े मॉडल और दृश्य की
  • एक कंटेनर के भीतर दृश्य का ट्रैक रखता है

मॉड्यूल

  • एक नियंत्रक और उसके दृश्य और मॉडल की तार्किक समूहीकरण
  • परीक्षण योग्य
  • छोटे और रखरखाव योग्य (एकल जिम्मेदारी)
  • निर्देशांक (नियंत्रक के माध्यम से) इसमें देखे जाने वाले मॉडल और मॉडल की स्थिति और घटनाएँ हैं
  • अपने स्वयं के दृश्य प्रस्तुत करने के लिए स्वतंत्र
  • यह देखने के लिए कि इसके दृश्य प्रस्तुत करने के लिए स्वतंत्र नहीं है

लेआउट प्रबंधक

  • लेआउट रचना के लिए जिम्मेदार
  • डोम में उन क्षेत्रों के साथ एक अनुप्रयोग शेल को परिभाषित करता है जो मॉड्यूल अपनी सामग्री प्रस्तुत कर सकते हैं

डिस्पैचर

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

आवेदन

  • समग्र सेटअप के लिए जिम्मेदार, चीजों को तुरंत करता है जैसे:
    • डिस्पैचर
    • रूटर
    • पबसब स्ट्रीम
    • वालों
    • आदि

इस तरह के पैटर्न से आपके एप्लिकेशन को कंपोजिटेबल होने की अनुमति मिलती है, यूनिट टेस्ट की जाती है, उस जटिलता को दूर करती है जो एक पुल का निर्माण समय के साथ होगा, चिंताओं को अच्छी तरह से अलग करता है, आदि।

जैसा कि एमी बताते हैं: ग्राहक पर सर्वर बनाने के लिए सावधान रहें। और सावधान रहें कि "मैं एक एमवी * फ्रेमवर्क बना रहा हूं, इसलिए इसके सिद्धांत में नहीं पड़ना चाहिए, इसलिए मुझे ___ चाहिए!" इसके बजाय, इन सभी विचारों (और यहां अन्य उत्तरों) को लें, और जानें कि आपके आवेदन और टीम के लिए सबसे अच्छा क्या काम करता है।

मैं अत्यधिक राज्य के एमी पालमाउंट की बात के दुश्मन (जिसमें से ये विचार आए थे), या कम से कम बात से स्लाइड देखने की सलाह देते हैं

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