2010-03-25 17 views
14

रिफैक्टरिंग मैं PRISM/MVVM/WPF एप्लिकेशन लिख रहा हूं। यह एक LOB आवेदन है, इसलिए बहुत सारे जटिल नियम हैं। मैंने देखा है कि व्यू मॉडल फूला हुआ शुरू हो रहा है। दो मुख्य मुद्दे हैं।ब्लोएटेड व्यू मॉडेल

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

अन्य समस्या मेरे वीएम में कमांड की संख्या है। अभी चार आदेश हैं। मैं जोश स्मिथ के रिले कॉमांड (मूल रूप से PRISM में प्रतिनिधिमंडल) का उपयोग कर वीएम में आदेशों को परिभाषित कर रहा हूं, इसलिए सभी व्यावसायिक तर्क वीएम में रहते हैं। मैंने प्रत्येक कमांड को कामों की अलग इकाई में ले जाने पर विचार किया। मुझे यकीन नहीं है कि ऐसा करने का सबसे अच्छा तरीका है।

क्या आप अपने वीएम को साफ रखने के लिए उपयोग कर रहे हैं पैटर्न? मैं पहले से ही किसी को "आपका विचार और वीएम बहुत जटिल है, जवाब दे रहा हूं, आपको उन्हें कई दृश्य/वीएम में तोड़ना चाहिए"। यह निश्चित रूप से यूएक्स परिप्रेक्ष्य से बहुत जटिल नहीं है - इसमें 2 बटन, एक combobox, और एक सूची बॉक्स हैं। इसके अलावा, एक तार्किक परिप्रेक्ष्य से, यह एक समेकित डोमेन है। ऐसा कहकर, मुझे यह जानने में बहुत दिलचस्पी है कि अन्य इस तरह के मुद्दे से कैसे निपट रहे हैं।

आपके इनपुट के लिए धन्यवाद।

+1

बेवकूफ टिप्पणी, लेकिन मैं विरोध नहीं कर सकता: "ब्लोट के साथ क्या गलत है"? यह जीवन का एक तरीका है, सॉफ्टवेयर विकास का एक तरीका ;-) –

+0

महान प्रश्न। एमवीवीएम ठीक से करने की कोशिश करते समय डब्ल्यूपीएफ में चारों ओर सीमाएं प्राप्त करने के लिए मेरा डब्ल्यूपीएफ व्यूमोडेल हैक्स से भरा है। WinForms एमवीपी ऐप में इनमें से अधिकतर चीजें तुच्छ हैं। – Damien

+0

आप एमवीपीवीएम देख सकते हैं। यह अनिवार्य रूप से वीएम को विभाजित करता है ताकि वीएम सिर्फ डेटा बाध्यकारी से संबंधित हो और प्रस्तुतकर्ता कमांड को संभालता है। मुझे यह पसंद नहीं है कि आप बाध्यकारी कमांड की सुविधा कैसे खो देते हैं लेकिन यह एक क्लीनर वीएम के लिए बनाता है। – bygrace

उत्तर

4

मुझे आपका दर्द महसूस होता है। एमवीवीएम ऐप्स पर काम करते समय मैं इस तरह के सवालों के साथ बहुत कुश्ती करता हूं। इन दिनों में से एक मैं आपके द्वारा किए गए अन्य लोगों से इनपुट प्राप्त करने के लिए प्रश्नों की एक कपड़े धोने की सूची पोस्ट करूंगा।

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

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

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

यह अच्छा होगा अगर इस तरह के सामान के लिए कठिन और तेज़ नियम थे लेकिन मुझे लगता है कि ढांचे और पैटर्न दोनों अभी भी विकासवादी चरण में हैं।

+0

आपकी प्रतिक्रिया जोश के लिए धन्यवाद। हाँ, मैं मानता हूं कि ढांचा अभी भी युवा है। Bloated = बदलने के एक से अधिक तरीके, इस प्रकार एसआरपी का उल्लंघन। – Noel

+0

ओह, ठीक है तो उस मामले में ... शुभकामनाएं! :) मुझे लगता है कि एसआरपी पूरी तरह से अतिरंजित है। असली दुनिया में यह मूल रूप से प्रति वर्ग एक विधि निर्धारित करता है। हालांकि यह कमांड कक्षाओं के लिए ठीक हो सकता है, मैं इसे मॉडल और व्यूमोडल्स पर लागू करने पर बेचा नहीं जाता हूं। – Josh

0

व्यूमोडेल के विनिर्देशों को जानने के बिना यह कहना मुश्किल है कि ब्लोट कहां से आ रहा है। यह मॉडल से पूछताछ करने के लिए बहुत सी लाइनों की तरह गैर-यूआई संबंधित हो सकता है। या यह UI सुविधाएं हो सकती हैं जो यूआई में ट्रिगर या कुछ के साथ बेहतर ढंग से कार्यान्वित की जाती हैं।

क्या आप संभवतः अपने व्यूमोडेल के बारे में विस्तृत जानकारी दे सकते हैं?

संपादित करें टिप्पणियों के आधार पर।

सहेजें ग्राहक और हटाएं ग्राहक मॉडल या सेवा विधियों की तरह ध्वनि, इसलिए मैं उन्हें किसी प्रकार की दृढ़ता परत में रखूंगा।

ग्राहक वीडियो अपलोड/डाउनलोड करें: फिर, ये व्यू मॉडेल विशिष्ट नहीं हैं (आप इन्हें अन्य व्यूमोडेल में करना चाहते हैं) इसलिए मैं उन्हें एक वेब सेवा में रखूंगा और ViewModel कमांड को कॉल करूँगा।

आम तौर पर एक सेवा में सामान्य कोड डालने के लायक है (जो एकाधिक व्यू मॉडेल का उपयोग करना चाहते हैं) और फिर उस सेवा को आपके आईओसी में फेंकना। इस तरह आपके व्यूमोडल्स दृश्य से जानकारी के हल्के वजन "निदेशक" या तो मॉडल या सेवा तक समाप्त होते हैं।

+0

ब्लोएट 4 आदेशों से आ रहा है और ऊपर वर्णित दृश्य विशिष्ट गुणों से आ रहा है।मेरा प्रश्न एक सार है: व्यूमोडेल के बाहर काम की इकाइयों में तर्क को अमूर्त करने के लिए लोग किस पैटर्न का उपयोग कर रहे हैं? आप दृश्य और वीएम विशिष्ट तर्क के बीच रेखा कहां खींचते हैं? उदाहरण के तौर पर, इन चार आदेशों का उपयोग करें: SaveCustomer, DeleteCustomer, ग्राहक वीडियो अपलोड करें (लंबे समय तक चल रहा है), ग्राहक वीडियो डाउनलोड करें (लंबे समय तक चल रहा है)। दृश्य को लंबे समय तक चलने वाले वीडियो कमांड की स्थिति से अवगत होना चाहिए। – Noel

+0

और प्रतिक्रिया के लिए धन्यवाद :) – Noel

+0

रिलेकॉमैंड्स एप्लिकेशन के अन्य परतों में विभिन्न घटकों और सेवाओं को कॉल करते हैं, लेकिन मुझे अभी भी अपने वीएम में परिभाषित रिलेकॉमैंड की आवश्यकता है ताकि मेरा विचार उनसे जुड़ सके। तो डाउनलोड ग्राहक वीडियो कमांड के लिए, वीएम वीडियो प्राप्त करने के लिए एक webservice कॉल करता है, प्रतिक्रिया पर कुछ बाइट स्तर मैनिपुलेशन करता है, फिर एक अलग घटक का उपयोग कर वीडियो खोलता है। हो सकता है कि मैं रिलेकॉमैंड/डेलेगेट कमांड तर्क के मांस को एक अलग वर्ग में निकाल सकूं, और रिलेकॉमैंड्स को एक पतली लिबास बना सकूं जो केवल नई कक्षा में प्रतिनिधि हो। – Noel

0

मेरे पास इस पर दो मुख्य विचार हैं, लेकिन वाईएमएमवी।

सबसे पहले मैं वीएम से कार्यान्वयन विशिष्ट कोड को 'सेवा' में ले जाऊंगा जो मूल रूप से केवल एक वर्ग है जो काम करता है। यह उदाहरण के लिए एक 'ग्राहक सेवा' वर्ग हो सकता है जिसमें सहेजने, हटाने, अद्यतन विधियों का कार्यान्वयन हो, और रिलेकॉमैंड कार्यान्वयन सेवा को करने के लिए सेवा को कॉल करेगा, और उचित रूप से किसी भी दृश्य गुण को अद्यतन करेगा।

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

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

देखें स्वयं को जितना संभव हो उतना छोटा कोड होना चाहिए, आपको 0 कोड-पीछे के लिए लक्ष्य रखना चाहिए (हालांकि ऐसी चीजें हैं जो दुर्भाग्य से कोड में ही की जा सकती हैं)।

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

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