Таким образом, можно перейти от случая к другому случаю:
switch(variable) {
case 1:
// do something 1
case 2:
// do something 2
break;
case 3:
// do something 3
break;
}
Но что, если мы захотим выполнить несколько других кейсов после завершения основного кейса или выполнить другой кейс, который не следует непосредственно после основного кейса? Например, псевдокод:
switch(variable) {
case 1:
// do something 1
break;
case 2:
// do something 2
break;
case 3:
// do something 3
execute case 2;
execute case 1;
break;
}
Я исследовал вариант помеченных утверждений, но, похоже, здесь он не сработает.
Единственный вариант, который я здесь вижу, — это создавать новую функцию для каждого случая, но мне интересно, есть ли вариант лучше, чище, читабельнее и/или короче?
Я ищу все советы - будь то какое-то ключевое слово, которое мне не хватает, ваши личные советы, как сделать это чисто, или библиотеки и даже предложения из других языков, таких как машинописный текст и т. д.
Этот ваш псевдокод не имеет особого смысла. Что должно произойти, если через execute case 2 будет достигнут break в случае 2, что завершает оператор переключения случая? Вы никогда не сможете выполнить вариант 1.
Как насчет использования именованных функций? ... например doSomething_1, doSomething_2, doSomething_3, где последний реализован следующим образом... function doSomething_3() { doSomething_2(); doSomething_1(); }, и где для каждого соответствующего случая вызывается ровно одна функция, специфичная для конкретного случая.
просто используйте if..else if...else, switch менее универсален
@AlexanderNenachev Ого, это буквально мем, который ходит в кругах разработчиков. Не делайте этого (обязательно). Возможно, это «менее универсально», но это чертовски хороший шаблон, если вы сопоставляете одну переменную с несколькими результатами, например, с предопределенными константами.
@somethinghere, если это одна переменная, отображение будет хорошей альтернативой. в любом случае я не помню, чтобы использовал switch в последние годы. всегда есть некоторые ограничения или доступны лучшие альтернативы
@AlexanderNenachev Я все время использую переключатель с константами, которые передаются для маршрутизации, чтобы увидеть, совпадают ли определенные значения, вместо того, чтобы создавать 10 условий «если». switch имеет свои цели, и если вы можете его использовать, использование строки if/else не является правильным решением.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Ник Парсон подал потрясающую идею:
Может быть, обернуть весь переключатель в функцию, принимающую переменную, и выполнить рекурсивный вызов?
Что отлично работает в этой ситуации; Итак, чтобы включить это в пример, который я опубликовал, и принять его как ответ:
mySwitch(variable);
function mySwitch(_v) {
switch(_v) {
case 1:
// do something 1
break;
case 2:
// do something 2
break;
case 3:
// do something 3
mySwitch(2);
mySwitch(1);
break;
}
}
Это чисто, делает свое дело... и более того - если вы объявляете функцию там, где обычно находится оператор переключения (например, внутри какой-либо внешней функции), вы сможете изменять переменные, объявленные во внешней функции, точно так же, как вы могли бы это сделать внутри оператора переключения.
Из моего комментария выше...
Как насчет использования именованных функций? ... например
doSomething_1,doSomething_2,doSomething_3, где последний реализован следующим образом...function doSomething_3() { doSomething_2(); doSomething_1(); }, и где для каждого соответствующего случая вызывается ровно одна функция, специфичная для конкретного случая.
Поскольку ОП явно контролирует код, связанный с переключателем, почему бы не реализовать обработку каждого случая как собственную функцию. Таким образом, во-первых, мы отделяем реализацию обработки конкретного случая от функции mySwitch (одной из собственных ответов ОП) и, во-вторых, включаем повторное использование кода для третьего случая примера кода ОП.
Следующий приведенный пример кода, на мой взгляд, гораздо легче понять, чем то, что придумал ОП в своем собственном ответе...
function mySwitch(value) {
switch (value) {
case 1:
handleCase1();
break;
case 2:
handleCase2();
break;
case 3:
handleCase3();
break;
}
}
console.info('mySwitch(1) ...');
mySwitch(1);
console.info('mySwitch(2) ...');
mySwitch(2);
console.info('mySwitch(3) ...');
mySwitch(3);.as-console-wrapper { min-height: 100%!important; top: 0; }<script>
function handleCase1() {
console.info('handling case 1');
}
function handleCase2() {
console.info('handling case 2');
}
function handleCase3() {
console.info('handling case 3 which invokes handling of 2 and 1');
handleCase2();
handleCase1();
}
</script>... и если значение переключателя явно основано на строке или числе, можно сократить приведенную выше функцию mySwitch до...
function mySwitch(value) {
({
'1': handleCase1,
'2': handleCase2,
'3': handleCase3,
})[String(value)]?.();
}
console.info('mySwitch(0) ...');
mySwitch(0);
console.info('mySwitch(1) ...');
mySwitch(1);
console.info('mySwitch(2) ...');
mySwitch(2);
console.info('mySwitch(3) ...');
mySwitch(3);
console.info('mySwitch(4) ...');
mySwitch(4);.as-console-wrapper { min-height: 100%!important; top: 0; }<script>
function handleCase1() {
console.info('handling case 1');
}
function handleCase2() {
console.info('handling case 2');
}
function handleCase3() {
console.info('handling case 3 which invokes handling of 2 and 1');
handleCase2();
handleCase1();
}
</script>
Может быть, обернуть весь
switchв функцию, которая принимаетvariable, и выполнить рекурсивный вызов?