重构方法

时间:2017-08-25 19:37:59

标签: c# refactoring

我在代码中使用了以下方法。如果将来有条件,我可能会有更多。 所以只是想知道如何从维护的角度重新考虑这个代码。

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

感谢。

3 个答案:

答案 0 :(得分:0)

正如@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();
}

答案 1 :(得分:0)

您可以将from / to组合放入一个可以轻松修改的数组中。 使用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]
        );
    }

答案 2 :(得分:0)

您可以简单地使用元组列表:

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