双开关或单开关

时间:2011-08-17 11:36:12

标签: switch-statement

这可能是一个愚蠢的问题,但我无法找到答案:

案例很简单,我有一个函数,在条目中有一个整数,两个变量根据它分配。问题是分配给变量的值在某些情况下是常见的,但这两种情况的情况并不相同。 (如果不够清楚,请参阅示例)。

我想知道这种情况的最佳做法是什么。 它是这样的:

function test(a){
    var x,y;
    switch (a){
        case 0:
        case 1:
        case 7:
            y=...;
            break;
        case 2:
        case 6:
            y=...;
            break;
        case 3:
        case 4:
        case 5:
            y=...;
    }
    switch(a){
        case 5:
        case 6:
        case 7:
            x=...;
            break;
        case 0:
        case 4:
            x=...;
            break;
        case 1:
        case 2:
        case 3:
            x=...;
    }
    ...
}

function test(a){
    var x,y;
    switch (a){
        case 0:
            x=...;
            y=...;
            break;              
        case 1:
            x=...;
            y=...;
            break;
        case 2:
            x=...;
            y=...;
            break;
        case 3:
            x=...;
            y=...;
            break;
        case 4:
            x=...;
            y=...;
            break;
        case 5:
            x=...;
            y=...;
            break;
        case 6:
            x=...;
            y=...;
            break;
        case 7:
            x=...;
            y=...;
    }
    ...
}

或者在每种情况下使用两者的混合分配给x的值,并为y的值创建分组?

请注意,可能有超过8个值,仅用于示例。 提前谢谢。

1 个答案:

答案 0 :(得分:3)

如果switch语句中的不同情况之间没有真正重叠,那么最好将它们分开。

如果操作之间存在大多数共性,您可以将它们与单个case块中的某些特殊情况相结合,但您似乎表明情况并非如此。

但是,如果这不仅仅是很多更复杂的案例的简单示例,那么您可以通过以下方式实现更紧凑的解决方案:

//                     index:  0  1  2  3  4  5  6  7  8  9 10 11 12
static const int lookupX[] = { 2, 7, 1, 8, 2, 8, 1, 8, 2, 8, 4, 5, 9};
static const int lookupY[] = { 3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9};
if ((a >=0) && (a < sizeof(lookupX) / sizeof(*lookupX)))
    x = lookupX[a];
if ((a >=0) && (a < sizeof(lookupY) / sizeof(*lookupY)))
    y = lookupY[a];

这将允许您将值保存在更小的“配置”部分中,以便您可以轻松查看意图。然后范围检查和查找变得非常简单。

该代码是针对C量身定制的 - 我不确定您使用的是哪种特定语言(因为var语句),但如果索引有效,它基本上只进行查找。您需要将该位翻译成您选择的语言。