2011-02-02 5 views
14

나는 3 가지 기능을 가지고 있는데, 그 차이점은 주석으로 지적한 값이다.한 줄의 차이가있는 함수를 리팩터링하는 법

//-- point of difference 

함수의 대부분은 3 가지 모두에서 동일하다. "DRY"요인은 내 수면을 귀찮게합니다. :). 나는 궁금해했다. 이것들을 쉽게 병합 할 수 있습니까?

전에 이런 상황이 있었고 여기서 뭔가를 배우기를 희망합니다.

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

Func<string, string>을 전달하면 주어진 이름과 관련된 값을 얻을 수 있습니다. 첫 번째 경우에는 nvp의 인덱서 만 사용합니다. 두 번째 세션에서는 세션을 사용합니다. 별도의 메서드를 사용하여 대리자 또는 람다 식을 만들 수 있습니다. (나는 첫 번째에 대해 람다 표현식을 사용 하겠지만 두 번째 방법에 대해서는 별도의 메서드를 사용할 수 있습니다.)

2

제 생각에는 최선의 해결책은 람다 식을 사용하는 것입니다.

함수의 두 번째 인수 대신 string namestring 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; 
} 

다음이 하나의 점에서 당신의 함수를 작성, 예를 들면 :

관련 문제