首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >重构大的if else代码

重构大的if else代码
EN

Stack Overflow用户
提问于 2011-05-23 17:05:31
回答 7查看 1.7K关注 0票数 4

我有很长的if else代码

代码语言:javascript
运行
复制
 if (errorNumbers.Length == 6)
      {
        if (errorNumbers.Substring(0,4).Equals("1101") || errorNumbers.Substring(0,4).Equals("2121"))
        {
          retStr = "AutoRepickAfterPickError";
        }
        else if (errorNumbers.Substring(0, 4).Equals("1301") || errorNumbers.Substring(0, 4).Equals("2321"))
        {
          retStr = "AutoRepickAfterLAlignError";
        }
        else if (errorNumbers.Substring(0, 4).Equals("1401") || errorNumbers.Substring(0, 4).Equals("2221"))
        {
          retStr = "AutoRepickAfterCAlignError";
        }
        else if (errorNumbers.Substring(0, 4).Equals("1501") || errorNumbers.Substring(0, 4).Equals("2041"))
        {
          retStr = "AutoRepicksAfterManualRecovery";
        }

等等……

我怎么能把它重写成更好的东西。尝试在这里学习一些新的东西,我在.net 2.0中。谢谢你的帮助。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-05-23 17:12:29

我会将错误代码映射到字典中,如下所示:

代码语言:javascript
运行
复制
string errorCode = errorNumbers.Substring(0, 4);
Dictionary<string, string> map = new Dictionary<string,string>();
map.Add("1501", "AutoRepicksAfterManualRecovery");
map.Add("2041", "AutoRepicksAfterManualRecovery");
map.Add("1401", "AutoRepickAfterCAlignError");
map.Add("2221", "AutoRepickAfterCAlignError");
map.Add("1301", "AutoRepickAfterPickError");
map.Add("2121", "AutoRepickAfterPickError");
// etc

if(!map.ContainsKey(errorCode))
 throw new Exception("Invalid error code");

return map[errorCode];
票数 15
EN

Stack Overflow用户

发布于 2011-05-23 17:10:56

这应该很简单。

代码语言:javascript
运行
复制
if (errorNumbers.Length == 6)
{
    string errNo = errorNumbers.Substring(0, 4);

    switch (errNo)
    {
        case "1101":
        case "2121":
            retStr = "AutoRepickAfterPickError";
            break;
        case "1301":
        case "2321":
            retStr = "AutoRepickAfterLAlignError";
            break;
        case "1401":
        case "2221":
            retStr = "AutoRepickAfterCAlignError";
            break;
        case "1501":
        case "2041":
            retStr = "AutoRepicksAfterManualRecovery";
            break;
    }
}

还要注意,与Java语言不同,在C#中可以用==比较字符串。

"123" == "456""123".Equals("456")做同样的事情。

票数 11
EN

Stack Overflow用户

发布于 2011-05-23 17:15:39

首先,DRY Principle - Don't Repeat Yourself。将errorNumbers.Substring(0, 4)的结果赋给一个局部变量:

代码语言:javascript
运行
复制
string subNumbers = errorNumbers.SubString(0, 4);
if (subNumbers == "1401") // ...

对特定值情况(非范围)的支持:

可以将switch语句与字符串一起使用:

代码语言:javascript
运行
复制
switch(subNumbers)
{
    case "1401":
    case "2221":
      retStr = "AutoRepickAfterCAlignError";
      break;
    case "1501":
    case "2041":
      retStr = "AutoRepicksAfterManualRecovery";
      break;
    // etc
}

switch语句的另一种选择是创建字典:

代码语言:javascript
运行
复制
var selections = new Dictionary<string, string>()
{
    { "1401", "AutoRepickAfterCAlignError" },
    { "2221", "AutoRepickAfterCAlignError" },
    { "1501", "AutoRepicksAfterManualRecovery" },
    { "2041", "AutoRepicksAfterManualRecovery" },
    // etc
};

if (selections.ContainsKey(subNumbers))
    retStr = selections[subNumbers];

范围:

但是,如果您需要支持范围,则基本上必须坚持使用if/else块。还有其他选择,但是如果您的代码中只有这么多这样类型的if/else块,那么它们往往过于复杂。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6095066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档