簡體   English   中英

清除代碼中的多個IF語句

[英]Cleaning up multiple IF statements in the code

我的代碼是這樣的

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

更新:我似乎在處理更新日期方面與原始版本有所不同,因為我似乎將三個狀態折疊成兩個狀態(呼!),這出現在步驟#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:將代碼放入單獨的函數中並返回結果。

也就是說,不要將“狀態”分配給變量。 除了保持整潔的代碼分離和自我記錄外,這很有用,因為這樣可以更容易地發現無效的代碼路徑/邏輯。

例如, 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"更具信息性。

我建議保持簡單,並遵循上述方法。

因人而異。

這似乎是最簡單的方法,但是我認為這並不簡單。

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

您確實需要通過創建一些有意義的變量名來弄清楚這里的邏輯,以使條件讀起來像英語,否則您的代碼容易受到錯誤的攻擊。

嘗試這個:

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;

暫無
暫無

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

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