2011-02-02 34 views
14

Tôi có 3 chức năng nơi sự khác biệt duy nhất ở là các giá trị tôi chỉ ra với bình luậnLàm thế nào để cấu trúc lại các chức năng này có một dòng khác biệt

//-- point of difference 

Phần lớn các chức năng là như nhau trên tất cả ba. Các "DRY" yếu tố là ám ảnh giấc ngủ của tôi :). Tôi đã tự hỏi; những thứ này có thể được hợp nhất dễ dàng và dễ đọc không?

Tôi đã có những tình huống như thế này trước đây và tôi hy vọng sẽ tìm hiểu điều gì đó ở đây.

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

Câu hỏi này rất dễ dàng, nhưng tôi suy nghĩ khá hữu ích cho nhiều người mới bắt đầu. +1 –

Trả lời

12

Bạn có thể thay đổi chức năng để có một Func<string, string> để làm tra cứu:

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; 
} 

Sau đó viết các chức năng của bạn về thế này, ví dụ:

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

Vâng, đúng vậy. Chính xác những gì tôi đã viết ở trên. :-) –

+0

ma thuật, không có mã này tôi sẽ không hiểu làm thế nào để thực hiện Func cảm ơn vì đã giúp đỡ. –

+1

+1 Cảm ơn. Giúp tôi. – Divi

7

Vượt qua một Func<string, string> để nhận giá trị được liên kết với một tên nhất định. Trong trường hợp đầu tiên sẽ chỉ sử dụng chỉ mục của nvp; trong lần thứ hai nó sẽ sử dụng phiên. Bạn có thể sử dụng các phương thức riêng biệt để tạo các đại biểu hoặc các biểu thức lambda. (Tôi chắc chắn sẽ sử dụng một biểu thức lambda cho cái đầu tiên; tôi có thể sử dụng một phương thức riêng cho cái thứ hai.)

2

Theo tôi, giải pháp tốt nhất là sử dụng các biểu thức lambda.

Thay vì đối số thứ hai cho các hàm của bạn, hãy đặt lambda đó sẽ biến đổi string name thành string value.

Các vấn đề liên quan