2011-08-24 17 views
21

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

private Dictionary<string, Action> createView 
    { 
     get 
     { 
      return new Dictionary<string, Action>() 
      { 
       {"Standard", CreateStudySummaryView}, 
       {"By Group", CreateStudySummaryByGroupView}, 
       {"By Group/Time", CreateViewGroupByHour} 
      }; 
     } 
    } 

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

धन्यवाद।

उत्तर

15

लंबे स्विच स्टेटमेंट क्लासिक खराब गंध हैं, और हमेशा रिफैक्टरिंग के लिए एक लक्ष्य हैं।

यहां प्रदर्शन करने के लिए "मानक" चरण Replace Conditional with Polymorphism है। यह मार्टिन फाउलर की पुस्तक Refactoring (1 999 में 11 साल पहले प्रकाशित) में सूचीबद्ध चरणों में से एक था।

अब ऑब्जेक्ट्स जैसे कार्यों (जैसे क्रिया के साथ) का इलाज करना इतना आसान है, यह एक समाधान जितना अच्छा हो सकता है।

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

+0

+1 लिंक के लिए धन्यवाद, मैं पहले कभी भी उस रिफैक्टरिंग कैटलॉग में नहीं आया हूं - मैं इसे पढ़ूंगा। –

2

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

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

दूसरी ओर, जैसा कि अन्य ने कहा है, यह लंबे स्विच स्टेटमेंट के लिए एक व्यावहारिक समाधान हो सकता है। फिर फिर Strategy Pattern की तरह कुछ व्यवहार में बदलावों का समर्थन करने का एक अच्छा तरीका भी होगा।

7

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

public class MyClass 
{ 
    Dictionary<string, Action> dict = null; 

    private Dictionary<string, Action> createView 
    { 
     get 
     { 
      if(dict == null) 
      { 
       dict = new Dictionary<string, Action>() 
       { 
       {"Standard", CreateStudySummaryView}, 
       {"By Group", CreateStudySummaryByGroupView}, 
       {"By Group/Time", CreateViewGroupByHour} 
       }; 
      } 

      return dict; 
     } 
    } 

} 

संपादित

देखने के वैचारिक बिंदु से, मुझे शब्दकोश TryGetValue के साथ लंबे समय swicth/case की जगह एक बहुत अच्छा समाधान है।

उम्मीद है कि यह मदद करता है ...

5

यह दृष्टिकोण उत्कृष्ट है।

मैं इसे Action से अधिक के साथ उपयोग करता हूं। यह फिल्टर और चयनकर्ताओं के लिए भी काफी प्रभावी है। कुछ ऐसा:

var filters = new Dictionary<string, Func<MyEntity, bool>>() 
{ 
    // ... 
}; 

var query = entities.Where(filters["X"]); 
+0

यह एक अच्छा दृष्टिकोण भी है। भाषा की मूल बातें सीखने के बाद, मैं अब जटिल परिसरों को सीखने के साथ बहुत अधिक आरामदायक हूं, और इन छोटी सी चालों को खोजना मजेदार है :) –