2013-05-02 5 views
10

यह एक वास्तुकला/डिजाइन सवाल है।जटिल स्क्रीन पर किसी डेटाबेस/घटनाओं से नरक से कैसे बचें?

मैंने डब्लूपीएफ/विंडोज फॉर्म, आदि में लिखे गए कुछ परियोजनाओं में भाग लिया है जिसमें बहुत से क्षेत्रों के साथ जटिल स्क्रीन हैं और ये फ़ील्ड एक-दूसरे से जुड़े हुए हैं (उनके मूल्य एक दूसरे पर निर्भर हैं शामिल)।

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

मामले को बदतर बनाने के लिए, कुछ हैक्स पर लागू किया जाता है यूआई घटनाएं (उदाहरण के लिए, ड्रॉपडाउन फ़ील्ड एक्स को अपडेट करने के लिए बदल दिया गया है) जबकि अन्य डोमेन मॉडल में हैं जो UI को बाध्य करता है।

असल में, यह एक बड़ी गड़बड़ है, और मैं सिर्फ यह जानना चाहता हूं कि ऐसा कुछ करने का सबसे अच्छा तरीका क्या है यदि मैं खरोंच से शुरू करना चाहता हूं। या पहली जगह ऐसी जटिल स्क्रीन से बचने का अच्छा विचार है?

उत्तर

0

हमारे पास काफी जटिल यूआई हैं (उदाहरण के लिए विभिन्न प्रकार के कई संबंधित क्षेत्रों सहित, उदाहरण के लिए डेटाग्रिड में पंक्ति) और एमवीवीएम पैटर्न ने हमारे लिए बहुत अच्छा काम किया है। सभी गुण मॉडल से आ रही और देखें जटिल तर्क संबंधित ViewModel, जो कोई बैकअप लेने फील्ड है में एक बराबर संपत्ति से "लिपटे" कर रहे हैं कि, बल्कि मॉडल के लिए सीधे अंक के संपर्क में:

public class SomeComplexViewModel 
{ 

    public SomeModel Model {get;set;} 

    public string SomeCrazyProperty 
    { 
     get 
     { 
      return Model.SomeCrazyProperty; 
     } 
     { 
      Model.SomeCrazyProperty = value; 
      //... Some crazy logic here, potentially modifying some other properties as well. 
     } 
    } 
} 

<TextBox Text="{Binding SomeCrazyProperty}"/> 

यह "प्रारंभिक मूल्य" समस्या को हटा देता है, क्योंकि बाध्यकारी द्वारा प्रारंभिक मान वास्तव में मॉडल से आने वाला वास्तविक मूल्य है, और इस प्रकार Setter में रखा गया तर्क केवल तभी निष्पादित किया जाता है जब आवश्यक हो।

फिर, डमी गुण (जो कोई तर्क के पीछे है) के लिए, हम सीधे मॉडल को देखें से बाँध:

<TextBox Text="{Binding Model.SomeRegularProperty}"/> 

यह ViewModel में ब्लोट कम कर देता है।

पीछे कोड में घटनाओं के संबंध में, मैं पूरी तरह से इससे बचता हूं। फाइलों के पीछे मेरा कोड लगभग हमेशा एक InitializeComponent() और कुछ और नहीं है।

केवल दृश्य-विशिष्ट तर्क कोड के पीछे (जैसे एनीमेशन सामान, आदि) में रखा गया है, जब इसे सीधे एक्सएएमएल में नहीं किया जा सकता है, या कोड में करना आसान है (जो कि ज्यादातर समय नहीं है)।

संपादित करें:

ऐसा नहीं है कि WinForms बाध्यकारी क्षमताओं XAML आधारित लोगों की तुलना में एक मजाक कर रहे हैं उल्लेख करने के लिए महत्वपूर्ण है। क्या वह कारण हो सकता है कि आप उन परियोजनाओं में उन भयानक गड़बड़ देख रहे हैं?

2

मैं जितना संभव हो सके संपत्ति सेटर्स से व्यवसाय तर्क को रखने की कोशिश करता हूं।

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

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

परिवर्तन अधिसूचना के संबंध में, मैं वास्तव में केवल यूआई डेटा बाइंडिंग के लिए इसका उपयोग करने की कोशिश करता हूं।

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