Двойной или одиночный выключатель - PullRequest
0 голосов
/ 17 августа 2011

Ну, это может быть глупый вопрос, но я не могу найти ответ:

Дело простое, у меня есть функция с целым числом в записи и двумя переменными для назначения в зависимости от этого.Проблема в том, что значение, присвоенное переменным, является общим для определенного случая, но эти случаи не одинаковы для двух переменных.(если это не совсем понятно, см. пример).

Мне было интересно, как лучше всего подходить для такого случая.Это что-то вроде:

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 Ответ

3 голосов
/ 17 августа 2011

Если в инструкциях 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), но он в основном выполняет поиск, только если индекс будет действительным. Вам нужно будет перевести этот бит на свой язык.

...