簡體   English   中英

重構方法

[英]Refactoring method

我在代碼中遵循了方法,如果將來有條件的話我可能還會有更多方法。 因此,只是想知道如何從維護的角度重構此代碼。

string MyMethod(string filter)
    {
      StringBuilder sbFilter = new StringBuilder(filter);

      if (filter.Contains("A"))
      {
        sbFilter.Append("X");
      }
      if (filter.Contains("B"))
      {
        sbFilter.Append("Y");
      }
      if (filter.Contains("C"))
      {
        sbFilter.Append("Z");
      }
      return sbFilter.ToString();
    }

謝謝。

您可以將您的“自/至”組合放入一個數組,可以輕松對其進行修改。 使用linq,您可以選擇以下值:

    String FilterMethod(String filter) {
        var fromTo = new[] {"A,X","B,Y","C,Z"};
        return String.Concat(
            from pair in fromTo
            let split= pair.Split(',')
            where split.Length == 2 && filter.Contains(split[0])
            select split[1]
        );
    }

您甚至可以單線制作:

    String FilterMethod2(String filter) {
        return String.Concat(
            from pair in new[] { "A,X", "B,Y", "C,Z" }
            let split = pair.Split(',')
            where split.Length == 2 && filter.Contains(split[0])
            select split[1]
        );
    }

您可以簡單地使用元組列表:

KeyValuePair<string, string>[] mappings = new [] 
{
    new KeyValuePair<string, string>("A", "X"), 
    new KeyValuePair<string, string>("B", "Y"), 
    new KeyValuePair<string, string>("C", "Z"), 
};

string MyMethod(string filter)
{
    var sbFilter = new StringBuilder(filter);

    foreach (var m in mappings)
    {
        if (filter.Contains(m.Key))
            sbFilter.Append(m.Value);
    }

    return sbFilter.ToString();
}

使用LINQ可以更簡潔地編寫:

string MyMethod(string filter)
{
    return filter + string.Concat(mappings
        .Where(m => filter.Contains(m.Key))
        .Select(m => m.Value));
}

正如@ JakubDąbek在他的評論中所寫,這個問題更適合於代碼審查論壇,但是我認為使用SortedDictionary將使您的代碼更易於維護和清晰。
這樣,您將無需更改 MyMethod 函數
根據您的示例,
我會做類似的事情(請在代碼中查看我的評論):

private SortedDictionary<string, string> _Dic;
public SortedDictionary<string, string> Dic
{
    get
    {
        if (_Dic == null)
        {
            _Dic = new SortedDictionary<string, string>();

            _Dic.Add("A", "X");
            _Dic.Add("B", "Y");
            _Dic.Add("C", "Z");
            // add more key-pair values in the future
            return _Dic;
        }
        else
        {
            return _Dic;
        }
    }

    set
    {
        // important: here you can get your valus from external source!
        _Dic = value;
    }
}

string MyMethod(string filter)
{
    StringBuilder sbFilter = new StringBuilder(filter);
    foreach (KeyValuePair<string, string> itm in Dic)
    {
        if (filter.Contains(itm.Key))
        {
            sbFilter.Append(Dic[itm.Key]);
        }
    }

    return sbFilter.ToString();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM