如何重构具有多个字符串条件的多个if语句?

时间:2017-09-13 16:37:22

标签: .net refactoring

我正在尝试重构此代码,我想要创建一个包含值的字典,但我不确定。

String version "1.0";

if (version.Equals("1.0.0(beta)") || version.Equals("1.0.0(beta2)") || version.Equals("1.0.0(beta3)") || version.Equals("1.0.0"))
            {
                newVersion= executionType.Equals("Install") ? "2.0.0(beta)" : "1.0.0(beta)";
            }
            else if(version.Equals("3.0.0(beta)") || version.Equals("3.0.0(beta2)") || version.Equals("3.0.0(beta3)") || version.Equals("3.0.0"))
            {
                newVersion= executionType.Equals("Install") ? "4.0.0(beta)" : "3.0.0(beta)";
            }
            else if (version.Equals("5.0.0(beta)") || version.Equals("5.0.0(beta2)") || version.Equals("5.0.0(beta3)") || version.Equals("5.0.0" || version.Equals("5.0.0.b"))
            {
                newVersion= executionType.Equals("Install") ? "6.0.0(beta)" : "5.0.0(beta)";
            }
            else if(same){
newVersion = same;

像其他7个总计。 我必须使用.NET 2.0执行此操作。

3 个答案:

答案 0 :(得分:2)

对于.NET2.0,我担心你必须坚持使用switch

switch(version)
{
    case "1.0.0(beta)":
    case "1.0.0(beta2)":
    case "1.0.0(beta3)":
    case "1.0.0":                
        newVersion = executionType.Equals("Install") ? "2.0.0(beta)" : "1.0.0(beta)";
        break;
    case "3.0.0(beta)":
    case "3.0.0(beta2)":
    case "3.0.0(beta3)":
    case "3.0.0":
        newVersion= executionType.Equals("Install") ? "4.0.0(beta)" : "3.0.0(beta)";
        break;
    case "5.0.0(beta)":
    case "5.0.0(beta2)":
    case "5.0.0(beta3)":
    case "5.0.0":
    case "5.0.0.b":
        newVersion= executionType.Equals("Install") ? "6.0.0(beta)" : "5.0.0(beta)";
        break;
}

但现在看到这些“案例”你可以更好地看到相似之处。我不知道你的其他值,但这些情况看起来你可以试试这个:

switch(version.SubString(0, 5)) // only test first 5 characters
{
    case "1.0.0":
        newVersion = executionType.Equals("Install") ? "2.0.0(beta)" : "1.0.0(beta)";
        break;
    case "3.0.0":
        newVersion= executionType.Equals("Install") ? "4.0.0(beta)" : "3.0.0(beta)";
        break;
    case "5.0.0":
        newVersion= executionType.Equals("Install") ? "6.0.0(beta)" : "5.0.0(beta)";
        break;
}

因此确实使用了两个词典:

Dictionary<string, string> versionsForInstall = new Dictionary<string, string>
{
    {"1.0.0", "2.0.0(beta)"},
    {"3.0.0", "4.0.0(beta)"},
    {"5.0.0", "6.0.0(beta)"}
};
Dictionary<string, string> versionsForOther = new Dictionary<string, string>
{
    {"1.0.0", "1.0.0(beta)"},
    {"3.0.0", "3.0.0(beta)"},
    {"5.0.0", "5.0.0(beta)"}
};

然后再做

newVersion = executionType.Equals("Install") 
             ? versionsForInstall[version.SubString(0,5)]
             : versionsForOther[version.SubString(0,5)];

答案 1 :(得分:0)

这里可以做很多重构,但我要采取的第一步是关注所有的||运营商。如果我看到多个(有时甚至有人推动它)||或者&amp;&amp;在评估中,它闻起来像会吸引维护混乱和后来的错误。我会发现它更容易阅读:

if(IsV1Variant(version))
{
  ...
}
else if(IsV2Variant(version))
{
  ...
}

在这种情况下,它看起来像StartsWith比较可以简化逻辑并降低价值不会从裂缝中掉落的风险

答案 2 :(得分:0)

使用与此类似的开关

switch (version)
{
  case "1.0.0(beta)":
  case "1.0.0(beta2)":
  case "1.0.0(beta3)":
  case "1.0.0(beta)":
    newVersion= executionType.Equals("Install") ? "2.0.0(beta)" : "1.0.0(beta)";
    break;

  case "3.0.0(beta)":
  case "3.0.0(beta2)":
  case "3.0.0(beta3)":
  case "3.0.0":
    newVersion= executionType.Equals("Install") ? "4.0.0(beta)" : "3.0.0(beta)";
    break;

  case "5.0.0(beta)":
  case "5.0.0(beta2)":
  case "5.0.0":
  case "5.0.0.b":
    newVersion= executionType.Equals("Install") ? "6.0.0(beta)" : "5.0.0(beta)";
    break;
}

不要害怕写很多行。 CLS将优化您的代码!