天天看点

C#消除多层if-else嵌套

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结构,如果大家有更好的方法或更合适的例子欢迎一起交流。