2011-02-02 12 views
14

है मैं 3 कार्यों refactor करने के लिए कैसे जहां में फर्क सिर्फ इतना है मानों मैं टिप्पणीइन कार्यों जो एक लाइन अंतर

//-- point of difference 

साथ बाहर बिंदु समारोह के बहुमत तीनों में एक ही है। "डीआरवाई" कारक मेरी नींद को हरा रहा है :)। मैं सोच रहा था; क्या इन्हें आसानी से और आसानी से विलय किया जा सकता है?

मेरे पास पहले इस तरह की स्थितियां थीं और मैं यहां कुछ सीखने की उम्मीद कर रहा हूं।

एक Func<string, string> में
private string RenderRequestType(string render, NameValueCollection nvp, string prefix, string regexWild, string suffix) 
{ 
    string regex = prefix + regexWild + suffix; 

    MatchCollection matches = Regex.Matches(render, regex); 

    foreach (Match match in matches) 
    { 
     foreach (Capture capture in match.Captures) 
     { 
      string name = capture.Value.Replace(prefix, "", StringComparison.CurrentCultureIgnoreCase).Replace(suffix, "", StringComparison.CurrentCultureIgnoreCase); 

      //-- point of difference 
      string value = nvp[name]; 

      render = render.Replace(capture.Value, value); 
     } 
    } 

    return render; 
} 

private string RenderSessionType(string render, HttpContext httpContext, string prefix, string regexWild, string suffix) 
{ 
    string regex = prefix + regexWild + suffix; 

    MatchCollection matches = Regex.Matches(render, regex); 

    foreach (Match match in matches) 
    { 
     foreach (Capture capture in match.Captures) 
     { 
      string name = capture.Value.Replace(prefix, "", StringComparison.CurrentCultureIgnoreCase).Replace(suffix, "", StringComparison.CurrentCultureIgnoreCase); 

      //-- point of difference 
      object session = httpContext.Session[name]; 
      string value = (session != null ? session.ToString() : ""); 

      render = render.Replace(capture.Value, value); 
     } 
    } 

    return render; 
} 

private string RenderCookieType(string render, HttpContext httpContext, string prefix, string regexWild, string suffix) 
{ 
    string regex = prefix + regexWild + suffix; 

    MatchCollection matches = Regex.Matches(render, regex); 

    foreach (Match match in matches) 
    { 
     foreach (Capture capture in match.Captures) 
     { 
      string name = capture.Value.Replace(prefix, "", StringComparison.CurrentCultureIgnoreCase).Replace(suffix, "", StringComparison.CurrentCultureIgnoreCase); 

      //-- point of difference 
      HttpCookie cookie = httpContext.Request.Cookies[name]; 
      string value = (cookie != null ? cookie.Value : ""); 

      render = render.Replace(capture.Value, value); 
     } 
    } 

    return render; 
} 
+0

यह सवाल आसान है, लेकिन मैं कई शुरुआती लोगों के लिए काफी उपयोगी लगता है। +1 –

उत्तर

12

आप एक Func<string, string> लेने के लिए देखने करने के लिए समारोह को संशोधित कर सकता है

private string RenderRequestType(string render, NameValueCollection nvp, string prefix, string regexWild, string suffix) 
{ 
    return RenderType(render, name => nvp[name], prefix, regexWild, suffix); 
} 
+0

हां, यही वह है। वास्तव में मैंने ऊपर लिखा था। :-) –

+0

जादू, इस कोड के बिना मैं समझ नहीं पाया कि Func मदद के लिए धन्यवाद कैसे कार्यान्वित करें। –

+1

+1 धन्यवाद। मुझे भी मदद की। – Divi

7

पास किसी दिए गए नाम के साथ जुड़े मूल्य मिलता है। पहले मामले में जो सिर्फ एनवीपी के सूचकांक का उपयोग करेगा; दूसरे में यह सत्र का उपयोग करेगा। आप या तो प्रतिनिधियों, या लैम्ब्डा अभिव्यक्तियों को बनाने के लिए अलग-अलग तरीकों का उपयोग कर सकते हैं। (मैं निश्चित रूप से पहले के लिए एक लैम्ब्डा अभिव्यक्ति का उपयोग करता हूं; मैं दूसरे के लिए एक अलग विधि का उपयोग कर सकता हूं।)

2

मेरी राय में सबसे अच्छा समाधान लैम्ब्डा अभिव्यक्तियों का उपयोग करना है।

अपने कार्यों के दूसरे तर्क के बजाय, वहां लैम्ब्डा डालें जो string name को string value में बदल देगा।

private string RenderType(string render, Func<string, string> lookupFunc, string prefix, string regexWild, string suffix) 
{ 
    string regex = prefix + regexWild + suffix; 

    MatchCollection matches = Regex.Matches(render, regex); 

    foreach (Match match in matches) 
    { 
     foreach (Capture capture in match.Captures) 
     { 
      string name = capture.Value.Replace(prefix, "", StringComparison.CurrentCultureIgnoreCase).Replace(suffix, "", StringComparison.CurrentCultureIgnoreCase); 

      //-- point of difference 
      string value = lookupFunc(name); 

      render = render.Replace(capture.Value, value); 
     } 
    } 

    return render; 
} 

तो इस एक के संदर्भ में अपने कार्यों लिखते हैं, उदाहरण के लिए::

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