if-else結構本來是個好東西,我們平時也會經常使用它來做條件判斷,但是萬物有利也有弊如果if-else結構嵌套太深的話就不容易理清邏輯,是以我們應該盡量避免多層if-else嵌套情況的發生。
下面講一個消除雙層if-else嵌套的例子:
原始結構
class Test
{
private string NestIf(int userId, string idCard)
{
string result = string.Empty;
if (userId > )
{
if (ValidateData(userId, idCard))
{
result = "first";
}
else
{
result = "second";
}
}
else
{
if (ValidateData(idCard))
{
result = "third";
}
else
{
result = "forth";
}
}
return result;
}
private bool ValidateData(int userId, string idCard)
{
return (userId.ToString() + idCard).Equals("66666") ? true : false;
}
private bool ValidateData(string idCard)
{
return idCard.Equals("666") ? true : false;
}
}
修改方案一
把外層的if判斷條件加到内層中去,當内層兩個判斷條件都滿足要求時才執行相應操作。
這樣确實消除了雙層if-else結構,但看上去邏輯還是不清晰,不知道大家有沒有這樣的感覺。
class Test
{
private string NestIf(int userId, string idCard)
{
string result = string.Empty;
if (userId > && ValidateData(userId, idCard))
{
result = "first";
}
else if (userId > && !ValidateData(userId, idCard))
{
result = "second";
}
else if (userId <= && ValidateData(idCard))
{
result = "third";
}
else if (userId <= && !ValidateData(idCard))
{
result = "forth";
}
return result;
}
private bool ValidateData(int userId, string idCard)
{
return (userId.ToString() + idCard).Equals("66666") ? true : false;
}
private bool ValidateData(string idCard)
{
return idCard.Equals("666") ? true : false;
}
}
修改方案二
把外層的if判斷條件加到内層的判斷條件中用到的方法中去,在方法中判斷userId是否大于0。
class Test
{
public string NestIf(int userId, string idCard)
{
ReturnValue value = ValidateData(userId, idCard);
return value.Result;
}
private ReturnValue ValidateData(int userId, string idCard)
{
ReturnValue returnValue = new ReturnValue();
if (userId <= )
{
returnValue = ValidateData(idCard);
return returnValue;
}
if ((userId.ToString() + idCard).Equals("66666") ? true : false)
{
returnValue.Status = true;
returnValue.Result = "first";
}
else
{
returnValue.Status = false;
returnValue.Result = "second";
}
return returnValue;
}
private ReturnValue ValidateData(string idCard)
{
ReturnValue returnValue = new ReturnValue();
if (idCard.Equals("666") ? true : false)
{
returnValue.Status = true;
returnValue.Result = "third";
}
else
{
returnValue.Status = false;
returnValue.Result = "forth";
}
return returnValue;
}
}
internal class ReturnValue
{
public bool Status { get; set; }
public string Result { get; set; }
}
總結
消除多層if-else結構隻是希望能夠以一種更清晰的邏輯展示自己的代碼,實際上并不會減少自己需要判斷的情況種類,是以無論以怎樣的方式消除多層if-else,在本例中本質上都是需要對四種情況進行判斷并執行不同的操作,了解了這一點相信你會讓自己的代碼更簡潔。
關于消除多層if-else結構,如果大家有更好的方法或更合适的例子歡迎一起交流。