重构如果否则

时间:2015-06-19 09:32:43

标签: c# refactoring

我正在重构遗留代码。有一个很大的if else声明。这是我可以使用的模式吗?我过去曾使用过字典if-else但这有很多(&&)所以不知道如何重构这个。

例如代码是

    public void ChangeControlVisibiltiy()
      {
        if (name != "I")
        {
           //Do something
        }



        if ((name != "A") && (name != "B") && (name != "C") && (name != "D") && (name != "F") && (name != "G") && (name != "H") && (name != "I") && (name != "J") && (name != "H") && (name != "I") && (name != "J"))
        {
           //Do something
        }

        if ((name != "A") && (name != "B") && (name != "D") && (name != "F") && (name != "G") && (name != "H") && (name != "I") && (name != "J") && (name != "H") && (name != "I") && (name != "J"))
        {
            //Do something

        }

        if ((name != "A"))
        {
            //Do something
        }


        if ((name != "A") && (name != "K") && (name != "L") )
        {

           //Do something
        }


        if ((name != "A") && (name != "K") && (name != "L") && (name != "B") && (name != "D") && (name != "F") && (name != "G") && (name != "H") && (name != "I") && (name != "J") && (name != "H") && (name != "I"))
        {
                //Do something
        }


        if ((name != "A") && (name != "L"))
        {

           //Do something
        }

        if (name == "M")
        {
           //Do something
        }

        else if (name == "C")
        {
            //Do something
        }
        else
        {
          //Do something
        }

        }

3 个答案:

答案 0 :(得分:0)

您可以将此重构为多个switch分支:

    public void ChangeControlVisibiltiy() {
        char c;
        if(name.Length == 1) {
            c = name[0];
        } else {
            c = '\0';
        }

        switch(c) {
            case 'I':
                break;
            default:
                //1. Do something
                break;
        }

        switch(c) {
            case 'A':
            case 'B':
            case 'C':
            case 'D':
            case 'F':
            case 'G':
            case 'H':
            case 'I':
            case 'J':
                break;
            default:
                //2. Do something
                break;
        }

        switch(c) {
            case 'A':
            case 'B':
            case 'D':
            case 'F':
            case 'G':
            case 'H':
            case 'I':
            case 'J':
                break;
            default:
                //3. Do something
                break;
        }

        switch(c) {
            case 'A':
                break;
            default:
                //4. Do something
                break;
        }

        switch(c) {
            case 'A':
            case 'K':
            case 'L':
                break;
            default:
                //5. Do something
                break;
        }

        switch(c) {
            case 'A':
            case 'B':
            case 'D':
            case 'F':
            case 'G':
            case 'H':
            case 'I':
            case 'J':
            case 'K':
            case 'L':
                break;
            default:
                //6. Do something
                break;
        }

        switch(c) {
            case 'A':
            case 'L':
                break;
            default:
                //7. Do something
                break;
        }

        switch(c) {
            case 'M':
                //8. Do something
                break;
            case 'C':
                //9. Do something
                break;
            default:
                //10. Do something
                break;
        }
    }

答案 1 :(得分:0)

请注意,在您的代码中,每个条件都有操作。如果你有每个动作的条件它可能看起来更短(但它只是语法糖而你不能利用分支能力来减少动作本身的数量):

controlA.Visibile = someConditionA ? true : false;
controlB.Visibile = someConditionB ? true : false;
controlC.Visibile = someConditionC ? true : false;

在给定示例? true : false部分可以省略,我提供它是为了清楚,显示您可以这样设置动作参数值。

您仍然必须使用分支(if / else)来避免某些操作发生。

答案 2 :(得分:0)

这看起来有点尴尬,但你可以删除2.和3. if语句。如果您只有一个参数可供检查,您也可以使用switch语句。

然而你应该使用.equals()而不是==,请给我们一个真实的代码示例。一般情况下,如果您使用某种模式一遍又一遍地使用相同的代码,只需将其提取到一个新的方法,例如如果您经常使用像Name.equals("A") || Name.equals("B")那样的方法,只需制作一个像oredEquals(String name, String... matches)这样的新方法。