清理代码中的多个IF语句

时间:2013-12-18 04:32:21

标签: c# asp.net linq

我的代码就像这样

string statuscodeToSet;

if (xElementAltItem != null && (generalstatuscode.Contains(currentstatuscode) && xElementAltItem.Value.Trim() =="null"))
{
    statuscodeToSet = "1";
}
if (xElementupdateDate != null && (xElementAltItem != null && (generalstatuscode.Contains(currentstatuscode) && xElementAltItem.Value.Trim() == "null") && xElementupdateDate.Value == "01-JAN-2099"))
{
    statuscodeToSet = "2";
}
if (xElementupdateDate != null && (xElementAltItem != null && (generalstatuscode.Contains(currentstatuscode) && xElementAltItem.Value.Trim() == "null") && xElementupdateDate.Value != "01-JAN-2099"))
{
    statuscodeToSet = "3";
}
if (xElementAltItem != null && (generalstatuscode.Contains(currentstatuscode) && xElementAltItem.Value.Trim() != "null"))
{
    statuscodeToSet = "4";
} 
if (xElementAltItem != null && (currentstatuscode == "Act-NotOrd" && xElementAltItem.Value.Trim() == "null"))
{
    statuscodeToSet = "5";
}

显然我不认为这是编码的最好方法。我有什么方法可以缩短这段代码,看起来更标准。可能正在使用Linq

3 个答案:

答案 0 :(得分:2)

更新:我似乎在处理更新日期时引入了原始版本的差异,因为看起来我将三个状态折叠为两个(哎呀!),它们出现在步骤#2 /#3中。无论如何,我认为以下仍然是适用的模板。


步骤#1:用变量消除重复的条件检查。

这极大地简化了条件,并且更容易看到“应该”发生的事情。

var nullAlt = xElementAltItem != null ? xElementAltItem.Value.Trim() == "null" : false;
var hasCurrentStatus = generalstatuscode.Contains(currentstatuscode);
var updateDate = xElementupdateDate != null ? xElementupdateDate.Value : "";

if (nullAlt && hasCurrentStatus)
{
    statuscodeToSet = "1";
}
if (nullAlt && hasCurrentStatus && updateDate == "01-JAN-2099"))
{
    statuscodeToSet = "2";
}
if (nullAlt && hasCurrentStatus && updateDate != "01-JAN-2099"))
{
    statuscodeToSet = "3";
}
if (!nullAlt && hasCurrentStatus)
{
    statuscodeToSet = "4";
} 
if (nullAlt && currentstatuscode == "Act-NotOrd")
{
    statuscodeToSet = "5";
}

步骤2:对单独的条件进行分组,并使用“嵌套”和“其他”条件重写代码。

这应该消除大多数(如果不是全部)重复检查并在整个条件结构中提供“一条路径”。分组的顺序取决于每个条件的逻辑重要性以及它消除分支之间重复的程度。在这种情况下,代码按nullAt分组,然后hasCurrentState

// ..
if (nullAlt) { 
  if (hasCurrentStatus) {
    statuscodeToSet = "1";
    if (updateDate == "01-JAN-2099"))
    {
      statuscodeToSet = "2";
    } else { /* updateDate != "01-JAN-2099" */
    {
      statuscodeToSet = "3";
    }
  } else if (currentstatuscode == "Act-NotOrd")
  {
    statuscodeToSet = "5";
  }
} else { /* !nullAlt */
  if (hasCurrentStatus)
  {
    statuscodeToSet = "4";
  } 
}

步骤3:将代码放入单独的函数中并返回结果。

也就是说,不要将“status”赋给变量。除了保持整洁的代码分离和自我记录之外,这很有用,因为可以更容易地发现无效的代码路径/逻辑。

例如,return "1"没有任何意义(因为那时既没有状态“2”也没有“3”,如果它被删除,那么状态“1”永远不会被返回!)并且有一些“其他”案件未得到处理。

string GetStatusCode (..) {
  // ..
  if (nullAlt) { 
    if (hasCurrentStatus) {
      // whoops! What was this doing??
      return "1";
      if (updateDate == "01-JAN-2099"))
      {
        return "2";
      } else { /* updateDate != "01-JAN-2099" */
      {
        return "3";
      }
    } else if (currentstatuscode == "Act-NotOrd")
    {
      return "5";
    } else {
      // return what here?
    }
  } else { /* !nullAlt */
    if (hasCurrentStatus)
    {
      return "4";
    } else {
      // return what here?
    } 
  }
}

在最后阶段,可以恢复中间变量的使用而不会失去太多的可读性,因为已经消除了重复的表达式。但是,除了严格要求延迟评估的情况外,单独的变量是完全有效的 - 如果它们使代码更清晰,则使用它们。

使用枚举或常量也是一种改进:状态值NeedsUpdate"3"更具信息性。

我建议保持简单并遵循上述方法。

因人而异。

答案 1 :(得分:2)

这似乎是最简单的,但我不认为这很简单。

if (xElementAltItem != null)
{
    if (xElementAltItem.Value.Trim() == "null")
    {
        if (generalstatuscode.Contains(currentstatuscode))
        {
            statuscodeToSet = "1";
            if (xElementupdateDate != null)
            {
                if (xElementupdateDate.Value == "01-JAN-2099")
                {
                    statuscodeToSet = "2";
                }
                if (xElementupdateDate.Value != "01-JAN-2099")
                {
                    statuscodeToSet = "3";
                }
            }
        }
        if ((currentstatuscode == "Act-NotOrd"))
        {
            statuscodeToSet = "5";
        }
    }
    else
    {
        if (generalstatuscode.Contains(currentstatuscode))
        {
            statuscodeToSet = "4";
        } 
    }
}

你真的需要通过创建一些有意义的变量名来弄清楚这里的逻辑,使条件读起来像英语,否则你的代码很容易受到错误的攻击。<​​/ p>

答案 2 :(得分:1)

试试这个:

if (xElementAltItem == null)
    return;
statuscodeToSet = "1";
if (xElementAltItem.Value.Trim() == "null")
    if (generalstatuscode.Contains(currentstatuscode))
        statuscodeToSet = xElementupdateDate != null && xElementupdateDate.Value != "01-JAN-2099" ? "3" : "2";
    statuscodeToSet = currentstatuscode == "Act-NotOrd" ? "5" : null;
else
    statuscodeToSet = generalstatuscode.Contains(currentstatuscode) ? "4" : null;