2010-07-27 10 views
10

सिल्वरलाइट समुदाय में XAML के कोड को फ़ाइल के पीछे जितना संभव हो सके कोड के रूप में रखने के लिए बहुत सारे प्रयास हैं। इसके पीछे असली प्रेरणा क्या है?XAML कोड से कोड को बाहर रखने का वास्तविक लाभ क्या है?

उदाहरण के लिए, किसी ईवेंट हैंडलर के बजाय कमांड का उपयोग करने का क्या फायदा है? अगर मेरे पास

<Button x:Name="SaveButton" Content="Save" Click="SaveButton_Click" /> 

... 

private void SaveButton_Click(object sender, RoutedEventArgs e) { 
    _myViewModel.SaveChanges(); 
} 

तो यह क्यों पसंद किया जाता है?

<Button x:Name="SaveButton" Content="Save" Command="{Binding SaveCommand}" /> 

कहाँ स्पष्ट रूप से मेरे विचार मॉडल में SaveCommand प्रभावी रूप से SaveChanges() आह्वान करने के लिए जा रहा है।

इससे परिस्थितियों का कारण बन सकता है जहां दृश्य 100% एक्सएएमएल है, यहां तक ​​कि एक्सएएमएल में दृश्य मॉडल को तुरंत चालू करना, और दृश्य और दृश्य मॉडल के बीच कनेक्शन बाध्यकारी के माध्यम से पूरी तरह से किए जाते हैं। यकीन है कि यह साफ है, लेकिन यह और क्या है? लचीले? क्यूं कर? दृश्य को अभी भी उचित ViewModel के साथ काम करने की आवश्यकता है, इसलिए यदि दोनों के बीच का कनेक्शन मौजूद है और यह निहित है, तो इसे और अधिक स्पष्ट क्यों न करें? संकलन समय समर्थन खोने का भी नुकसान होता है। अगर मैं अपने बटन को एक ईवेंट हैंडलर पर लगाता हूं जो मौजूद नहीं है, तो संकलक मुझे बताएगा। अगर मैं एक अस्तित्वहीन आदेश से बंधे तो यह नहीं होगा।

+1

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

+0

प्राथमिकता परीक्षण की वजह से xaml/codebehind मार्कअप नहीं है। यह प्रश्न वास्तव में दिलचस्प होगा यदि आपके कोड उदाहरण में इन विकल्पों का परीक्षण करने के लिए दो दृष्टिकोण थे। यानी ViewModel.SaveChanges() और एक आईसीओएमएंड आधारित परीक्षण के लिए आपका परीक्षण। – itchi

उत्तर

3

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

+1

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

+0

@ मैट: कमांड इंटीफेस एक घटना से थोड़ा अधिक बचाता है। – AnthonyWJones

+0

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

1

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

नतीजा यह है कि यूनिट परीक्षण आपके एप्लिकेशन कोड के एक बड़े हिस्से को कवर कर सकते हैं, जिससे आप यूआई कोड को अधिक एकीकृत रख सकते हैं।

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

+0

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

+0

मैट आप कुछ भी याद नहीं कर रहे हैं। एक ईवेंट हैंडलर बनाम कमांड का उपयोग टेस्टेबिलिटी को प्रभावित नहीं करता है। हर कोई एमवीवीएम बैंडवागन पर कूद गया है और वे हमेशा उदाहरणों में कमांड का उपयोग करते हैं, भले ही कई परिदृश्यों के लिए अक्सर कोई फायदा न हो, – Schneider

1

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

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

5

सिल्वरलाइट में प्रयास के एक बहुत है के रूप में कोड के मुकाबले एक एक्सएएमएल कोड के पीछे कोड को रखने के लिए समुदाय। इसके पीछे असली प्रेरणा क्या है?

मैं कहूंगा कि जो लोग "जितना संभव हो सके कोड के मुकाबले" कोड चाहते हैं, वे वास्तव में बिंदु प्राप्त किए बिना एमवीवीएम बैंडवागॉन पर कूद गए हैं। (या तो आपने या आपने उनके बिंदु का गलत व्याख्या किया है)।

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

किसी ईवेंट हैंडलर के बजाय कमांड का उपयोग करने का क्या फायदा है?

एक कमांड कम से कम दो क्षमताओं की पेशकश करता है जो एक ईवेंट हैंडलर नहीं करता है। कुछ WPF नियंत्रण कमांड की CanExecute प्रॉपर्टी से अवगत हैं, उदाहरण के लिए जब आदेश निष्पादित करने के लिए उपलब्ध नहीं है तो एक बटन अक्षम किया जा सकता है। इसके अलावा डिजाइनर और बाध्यकारी ढांचे कमांड जानते हैं।

आप बस एक बटन दबाने पर एक विधि कॉल करने के है बजाय कमांड उपयोग के लिए कोई ईवेंट हैंडलर से विधि बुला के लिए कोई बड़ा फायदा चाहते हैं। तो इस दृष्टिकोण का उपयोग करने से डरो मत। (एक तीसरा दृष्टिकोण, जो प्रोग्रामर पर डिजाइनर का पक्ष लेता है, ब्लेंड 4 से CallMethodAction का उपयोग करना है)।

+0

जबकि मैं आम तौर पर आपके साथ सहमत हूं, मुझे लगता है कि एक्समल को अलग करने के लिए कोड को मुक्त रखने में एक मूल्य है जितना संभव हो उतना स्वच्छ।जबकि कभी-कभी नियम तोड़ने चाहिए, जब आप बार-बार ऐसा करते हैं तो उन्हें अनावश्यक रूप से तोड़ने की आदत में जाना आसान होता है। – kyoryu

+0

"एक्सएएमएल" में कोई कोड नहीं होने के साथ SOC के साथ कुछ भी नहीं है (जो मुझे लगता है कि "साफ अलगाव" से आपका मतलब है)। यदि कोड दृश्य की जिम्मेदारियों से संबंधित है तो आप एसओसी सिद्धांत का उल्लंघन नहीं कर रहे हैं। – Schneider

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