2009-07-27 17 views
5

मैंने आज इस लेख को http://dotnetslackers.com/articles/silverlight/Silverlight-3-and-the-Data-Form-Control-part-I.aspx को एक Silverlight ऐप के भीतर एमवीवीएम पैटर्न के उपयोग के बारे में पढ़ा है जहां आपके पास अपनी डोमेन इकाइयां हैं और वास्तविक इकाइयां देखें जो मूल रूप से वास्तविक इकाई वस्तुओं का सबसेट है। क्या यह DRY सिद्धांत का स्पष्ट उल्लंघन नहीं है? और यदि ऐसा है तो आप इसे एक अच्छे तरीके से कैसे निपट सकते हैं?मॉडल-व्यू-व्यू मॉडल पैटर्न डीआरवाई का उल्लंघन?

उत्तर

7

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

+0

सहमत हैं, वीएम मॉडल के उन हिस्सों को होना चाहिए जिनके बारे में दृश्य को पता होना चाहिए। –

2

डीआरवाई एक सिद्धांत है, कठिन नियम नहीं है। आप एक इंसान हैं और अंतर कर सकते हैं। ईजी। यदि DRY वास्तव में एक कठिन नियम था तो आप दो अलग-अलग चरों को एक ही मान निर्दिष्ट नहीं करेंगे। मुझे लगता है कि किसी भी गैर-तुच्छ कार्यक्रम में आपके पास एक से अधिक वैरिएबल होंगे।

आम तौर पर बोलते हुए: DRY आमतौर पर डेटा पर लागू नहीं होता है। जो लोग विशिष्ट इकाइयां देखते हैं, वे शायद किसी भी उल्लेखनीय तर्क के बिना डेटा ट्रांसफर ऑब्जेक्ट्स होंगे। सभी प्रकार के कारणों के लिए डेटा डुप्लीकेट किया जा सकता है।

+0

फिर भी मुझे यह बहुत बुरा लगता है क्योंकि आप व्यूमोडेल के लिए प्रकाश इकाई वर्ग बनाएंगे और वास्तविक इकाइयों के लिए दोहराएंगे – terjetyl

+0

आपको यह बुरा क्यों लगता है? – EricSchaefer

+0

मुझे लगता है कि यह शुष्क का बुरा उल्लंघन है क्योंकि आप विरासत – terjetyl

1

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

तो ViewCategoryViewModel की तरह कुछ के लिए, मेरे पास श्रेणी में फ़ील्ड का डुप्लिकेशंस नहीं है। मैं व्यूमोडेल पर एक संपत्ति के रूप में एक श्रेणी वस्तु का खुलासा करता हूं ("चयनित श्रेणी" कहलाता है), दृश्य को प्रदर्शित करने के लिए किसी भी अन्य डेटा और स्क्रीन जो कमांड ले सकते हैं।

डोमेन मॉडल और दृश्य मॉडल के बीच हमेशा कुछ समानता होगी, लेकिन यह सब नीचे आता है कि आप ViewModel को कैसे चुनते हैं।

1

यह डाटा ट्रांसफर ऑब्जेक्ट्स (डीटीओ) के समान है।

उन दो वस्तु प्रकार के लिए डोमेन अलग है, तो यह सूखी का उल्लंघन नहीं है।

class Customer 
{ 
    public int Age 
} 

और एक corsponding दृश्य मॉडल:: - differnet संपत्ति प्रकार - विभिन्न वस्तुओं

class CustomerViewModel 
{ 
    public string Age; 

    // WPF validation code is going to be a bit more complicated: 
    public bool IsValid() 
    { 
     return string.IsNullOrEmpty(Age) == false; 
    } 
} 

differnt डोमेन

निम्न उदाहरण पर विचार करें।

+0

1. इस संदर्भ में एक डोमेन क्या है? 2. आपके व्यापार मॉडल में ग्राहक इकाई है। कल्पना कीजिए कि आपके पास एक ग्राहक इकाई है, एक ग्राहक डीटीओ और एक ग्राहक व्यूमोडेल है, तो निश्चित रूप से वहां बहुत सारी डुप्लिकेट गुण होंगी। मैं इसे DRY – terjetyl

+0

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

+0

व्यूमोडेल पर IsSelected जैसे गुणों पर विचार करें और स्क्रीन पर संस्करण को रद्द करना (यदि आप कुछ ग्राहक दृश्य मॉड्यूल क्लास को बाध्य नहीं कर रहे हैं, तो आपको ग्राहक ऑब्जेक्ट को वापस करने की आवश्यकता है), INotifyPropertyChanged पर कार्यान्वयन। केवल एक बहुत ही सरल परिदृश्य में यह DRY का उल्लंघन जैसा लगता है। –