天天看點

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