6

Is it bad practice to have a switch case in a switch case? If so, what are alternatives? I don't really want to use if/else if if I don't need.

Instead of doing some like:

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

I was thinking along the lines of:

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

It just looks really wrong to me. Not wrong in syntax but wrong in terms of proper practice.

4

6 回答 6

7

拥有大量功能来做很多不同的事情是不好的做法。如果您在 switch case 中有一个 switch case,则表明您的函数可能太大,您应该考虑将其拆分为更易于理解的小块。

但是没有硬性规定;这一切都取决于确切的情况。

于 2013-08-22T12:59:20.037 回答
3

我认为这是一种不好的做法。在大多数情况下,这是不可读的。

您可以将“子”切换案例提取到方法中。

于 2013-08-22T12:59:01.677 回答
3

避免以下方法

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
        }
}
于 2013-08-22T13:09:33.337 回答
1

如果它使您的代码更难阅读,那么这是不好的做法。

在您的特定示例中是否是这种情况由您决定,但总的来说,我会说可能是这种情况。

你要求替代品...

  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。这是衡量函数复杂程度的指标。通过查看函数有多少“决策点”来进行测量。每个case, if, 循环等都是一个“决策点”。你拥有的越多,你的功能就越复杂。

圈复杂度与代码质量和良好的编码实践密切相关,因此如果您的函数具有较高的 CC 分数(如果它有多个嵌套块,它可能会这样做switch),那么这是代码质量差的标志。我上面描述的两种替代解决方案都可以帮助解决这个问题。我会留给你阅读更多关于 CC 的内容。

显然,替代解决方案需要适应您的需求,但希望它们能给您一些想法。

于 2013-08-22T13:10:31.457 回答
0

不好的做法?不!可能在故障排除方面存在潜在的痛苦!看看你能做些什么来把所有的“选项”变成更有条理和更普遍联系的东西。甚至可以使用由发送的参数数量决定的方法重载来编写自己的函数。

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

于 2013-08-22T13:02:37.303 回答
0

您应该根据 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;
        }
    }
于 2013-08-22T13:04:33.730 回答