if-else结构本来是个好东西,我们平时也会经常使用它来做条件判断,但是万物有利也有弊如果if-else结构嵌套太深的话就不容易理清逻辑,所以我们应该尽量避免多层if-else嵌套情况的发生。
下面讲一个消除双层if-else嵌套的例子:
原始结构
class Test
{
private string NestIf(int userId, string idCard)
{
string result = string.Empty;
if (userId > 0)
{
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 > 0 && ValidateData(userId, idCard))
{
result = "first";
}
else if (userId > 0 && !ValidateData(userId, idCard))
{
result = "second";
}
else if (userId <= 0 && ValidateData(idCard))
{
result = "third";
}
else if (userId <= 0 && !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 <= 0)
{
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结构,如果大家有更好的方法或更合适的例子欢迎一起交流。