在开关箱里放一个开关箱是不是不好的做法

Is it bad practice to have a switch case in a switch case?

本文关键字:开关箱 是不是 一个      更新时间:2023-09-26

在开关案例中使用开关案例是不是一种糟糕的做法?如果是,有哪些替代方案?如果我不需要的话,我真的不想使用if/else if

而不是做一些类似的事情:

if((this == 1) && (that == 1)){ //something }
else if((this == 1) && (that == 2)){ //something }
else if((this == 2) && (that == 3)){ //something }

我当时的想法是:

switch(this){
    case 1:
        switch(that){
            case 1:
                // something
            break;
            ....
        }
    break;
    ....
}

在我看来,这确实是错误的。不是语法错误,而是正确的练习错误。

拥有能做很多不同事情的大量函数是不好的做法。如果你在switch案例中有一个switch案例,这表明你的函数可能太大了,你应该考虑把它分成更小、更容易理解的块。

但没有硬性规定;这完全取决于具体情况。

避免以下方法

switch(id)
{
    case 1:
    {
        switch (subid)
        {
            case 4:
                // nested code
        }
    }
    case 2:
         // some code
}

通过将嵌套部分移动到方法中来改进代码的首选方法

switch(id)
{
    case 1:
        SubSwtich(subid);
        break;
    case 2:
         // some code
}
function SubSwtich(int subid)
{
        switch (subid)
        {
            case 4:
                // nested code
        }
}

我会认为这是一个糟糕的做法。在大多数情况下,这是不可读的。

您可以提取"子"切换案例到方法。

如果这会使代码更难阅读,那么这是一种糟糕的做法。

在你的特定例子中是否是这种情况由你决定,但总的来说,我想说可能是这样。

你要求其他选择。。。

  1. 将部分代码提取到子函数中。例如:

    case 'foo' :
        myVar = 'blah';
        break;
    case 'bar' :
        myVar = secondLevelFunction();
        break;
    

    这里,secondLevelFunction()包含附加的switch()语句,其中每个case返回myVar的值。

  2. 使用数组映射。例如:

    var mapper = {'foo':'blah', 'bar':'bibble', etc};
    //now, instead of a big switch(input) { .... } block that sets myVar
    //for each option, you can just set it directly in a single line, like so:
    var myVar = mapper[input];
    

此外,如果您正在寻找代码质量的具体衡量标准,您应该了解Cyclomatic Complexity。这是一个函数复杂程度的度量。通过观察函数有多少"决策点"来进行度量。每个caseif、循环等都是一个"决策点"。你拥有的越多,你的功能就越复杂。

循环复杂性与代码质量和良好的编码实践密切相关,因此,如果函数的CC得分很高(如果它有多个嵌套的switch块,它可能会这样做),那么这是代码质量差的标志。我上面描述的两种替代解决方案都可以帮助解决这一问题。我会让你在CC上读更多。

显然,替代方案需要根据您的需求进行调整,但希望它们能给您一些想法。

您应该根据switch语句在不同的例程中中断代码,并且在例程中您也可以继续使用switch case。就像下面一样。

private void Switch(int value)
    {
        switch (value)
        {
            case 1:
                SwitchNest(value);
                break;
            case 2:
                break;
        }
    }
    private void SwitchNest(int value)
    { 
        switch (value)
        {
            case 1:
                SwitchOtherMethod(value);
                break;
            case 2:
                break;
        }
    }

不良做法?不当涉及到故障排除时,这可能是一种潜在的痛苦!看看你能做些什么,把所有的"选项"都变成更有组织性和通用性的东西。甚至可以使用由发送的参数数量决定的方法重载来编写自己的函数。

看看这个SO的帖子,看看它是否给了你一些想法。