2013-05-14 8 views
5

के अंदर मूल विधि से वापस लौटें मैं एक विधि के अंदर काम कर रहा हूं जो सत्यापन जांच की एक श्रृंखला करता है और इनमें से कोई भी चेक विफल रहता है, यह कुछ सामान्य अस्वीकृति कोड चलाने के लिए Action<string> पर कॉल करता है। यह करने के लिए कुछ इसी तरह की स्थापना की है:एक्शन <string>

public void ValidationMethod() { 
    Action<string> rejectionRoutine = (rejectionDescription) => { 
     // do something with the reject description 
     // other common code 
    }; 

    if (condition != requiredValue) { 
     rejectionRoutine("Condition check failed"); 
     // I currently have to put `return` here following every failed check 
    } 

    // many more checks following this 
} 

इस प्रणाली में एक बार एक चेक सत्यापन में विफल रहा है मैं बाकी को मान्य करने की कोई जरूरत नहीं है, मैं सिर्फ कार्रवाई के अंदर आम अस्वीकृति कोड चलाने के लिए और विधि से बाहर निकलना चाहते । वर्तमान में यह करने के लिए rejectionRoutine पर कॉल के बाद मैं अगली पंक्ति पर return करता हूं। मैं सोच रहा हूं कि क्या कोई तरीका है जिसमें मैं Action के अंदर से मूल विधि के निष्पादन को वापस करने या समाप्त करने की क्षमता को शामिल कर सकता हूं?

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

उत्तर

6

थोड़ा कोड को साफ करने के लिए बाहर एक संग्रह में चेकों के सभी एक्सट्रपलेशन होगा करने का एक तरीका:

Dictionary<Func<bool>, string> checks = new Dictionary<Func<bool>, string>() 
{ 
    {()=> condition != requiredValue, "Condition check failed"}, 
    {()=> otherCondition != otherRequiredValue, "Other condition check failed"}, 
    {()=> thirdCondition != thirdRequiredValue, "Third condition check failed"}, 
}; 

तो यह महत्वपूर्ण है जांच के लिए एक विशेष क्रम में चलाने के लिए (इस कोड है एक अप्रत्याशित आदेश) तो आप इसके बजाय List<Tuple<Func<bool>, string>> जैसे कुछ उपयोग करना चाहते हैं।

var checks = new List<Tuple<Func<bool>, string>>() 
{ 
    Tuple.Create<Func<bool>, string>(()=> condition != requiredValue 
     , "Condition check failed"), 
    Tuple.Create<Func<bool>, string>(()=> otherCondition != otherRequiredValue 
     , "Other condition check failed"), 
    Tuple.Create<Func<bool>, string>(()=> thirdCondition != thirdRequiredValue 
     , "Third condition check failed"), 
}; 

फिर आप सत्यापन करने के लिए LINQ का उपयोग कर सकते हैं:

var failedCheck = checks.FirstOrDefault(check => check.Item1()); 
if (failedCheck != null) 
    rejectionRoutine(failedCheck.Item2); 
+0

अहह सर्व, महान दिमाग एक जैसे सोचते हैं।मैंने कोड लिखा था जो मुझे कुछ स्पॉट्स मिलने से पहले लगभग समान था जहां इसे समझ में नहीं आया था। कुछ चेक हैं जो अपवाद फेंक देंगे अगर उनका मूल्यांकन किया जाता है जब पिछली जांच छिड़काई होनी चाहिए। अर्थात। चेक 1 मूल्य है! = शून्य, चेक 2 मान के साथ कुछ कर सकता है यह मानते हुए कि यह शून्य नहीं हो सकता है अगर हमें यह –

+0

@ जेसे कैटर मिला, जैसा कि मैंने अंत में कहा था, आपको 'सूची <ट्यूपल का उपयोग करना होगा , स्ट्रिंग >> '। यह केवल एक और अधिक कोड है। – Servy

+0

शायद मैं फनक में बूल के मूल्यांकन के तरीके के बारे में उलझन में हूं? क्या बूल वैल्यू का वास्तविक मूल्यांकन तब तक स्थगित हो जाता है जब तक फंक का आह्वान नहीं किया जाता है? मुझे लगता है कि जैसे ही Func बनाया गया था, इसका मूल्यांकन किया जाएगा –

1

यह लैम्ब्डा अभिव्यक्ति के अंदर कॉलर विधि से वापस आने का कोई अर्थ नहीं है।
(क्या अगर आप इसे विधि के बाद फोन का चलना समाप्त होने?)

बजाय, आप एक Func<string, Whatever> करने के लिए इसे बदल सकते हैं और अपने मूल्य लौट सकते हैं:

return rejectionRoutine("Condition check failed"); 
+0

कार्रवाई विधि के अंदर स्थानीय स्तर पर रहता है तो मैं नहीं दिख रहा है कि यह कैसे करता है, तो विधि चल रहा समाप्त हो गया कहा जा सकता है? अगर मैंने फनक से कुछ वापस कर दिया है तो मुझे अभी भी एक जांच करना होगा (वापसी वैल्यू == कुछ) प्रत्येक चेक के बाद वापसी करें। या क्या मैं इस दृष्टिकोण के साथ कुछ याद कर रहा हूँ? –

+0

@ जेसे कैटर: कुछ भी आपको विधि के बाहर प्रतिनिधि को उजागर करने से रोकता है। मुझे नहीं पता तुम्हारा क्या मतलब है। – SLaks

+0

मैंने अपने प्रश्न में कोड उदाहरण संपादित किया है, क्रिया केवल आसपास के सत्यापन विधि के दायरे में मौजूद है। मैं नहीं देखता कि इसे उस विधि के अंदर छोड़कर कहीं भी कैसे कहा जा सकता है। –

0

SLaks समाधान आप भी कर सकते करने के लिए एक विकल्प के रूप यदि आपका डिज़ाइन इसकी अनुमति देता है तो अपने rejectionRoutine में अपवाद फेंक दें।

+0

दुर्भाग्यवश मुझे नहीं लगता कि एक अपवाद फेंकने से वर्तमान डिजाइन फिट बैठता है। विचार के लिए धन्यवाद हालांकि –

+3

सामान्य नियंत्रण प्रवाह के लिए अपवादों का उपयोग नहीं किया जाना चाहिए; वे असाधारण परिस्थितियों के लिए इस्तेमाल किया जाना चाहिए। – Servy

+0

मेरे विचार बिल्कुल काम करते हैं और मुझे यकीन है कि मेरी कोड समीक्षा में सर्वसम्मति होगी अगर मैंने इसे –

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