重构(如果不是)

本文关键字:如果不 重构 | 更新日期: 2023-09-27 17:57:01

我正在重构遗留代码。有一个很大的如果别的声明。这是我可以使用的模式吗?我过去曾使用字典进行 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
        }
        }

重构(如果不是)

好吧,

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

尽管如此,您应该使用 .equals() 而不是 ==,请给我们一个真正的工作代码示例。一般来说,如果你一遍又一遍地使用相同的代码,使用某种模式,只需将其提取到一个新方法中,例如,如果你经常像Name.equals("A") || Name.equals("B")这样创建一个像oredEquals(String name, String... matches)这样的新方法。

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

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

在给定的示例中? true : false部分可以省略,为了清楚起见,我提供了它,表明您可以通过这种方式设置操作参数值。

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

您可以将其重构为多个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;
        }
    }