|
|
|
Недостаток оператора switch
|
|||
|---|---|---|---|
|
#18+
Не первый раз сталкиваюсь с тем, что оператор switch не предоставляет весьма удобной возможности выполнять несколько case, которые не расположены подряд. Когда я только с ним познакомился, то для меня было лёгким шоком, что надо ставить break, иначе будут задействованы следующие case, даже если они не попадают под условие. Довольно странно, на мой взгляд. Пример (РНР) Код: plaintext 1. 2. 3. 4. 5. 6. 7. В таком случае на выходе будет всегда 1 при любом $x из a,b,c,d. Если я уберу break, то при b ответ будет 3. А было бы круто, если бы помимо break было что-то вроде further, которое бы позволяло входить в следующие условия при совпадении. Тогда бы я мог получить ответ 2 при а, и 1 при остальных вариантах. Пример утрированный, но например при сборке sql-запроса в case могут быть большие куски, которые так или иначе придётся повторять... Может быть, я что-то не так понимаю? Или есть язык, где switch расширен? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2009, 13:22:06 |
|
||
|
Недостаток оператора switch
|
|||
|---|---|---|---|
|
#18+
приведи более понятный пример ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2009, 13:37:57 |
|
||
|
Недостаток оператора switch
|
|||
|---|---|---|---|
|
#18+
Frankie имеет в виду, что нельзя выполнить кусок кода, к примеру, по второму условию и тут же перейти к куску кода, выполняемом при 4-м условии, тогда их надо отдельной комбинацией писать друг за дружкой без брейков, если я правильно все понял. Вообще, не знаю, чем навороты с этими брейками нужны, хотя мож просто с подобными ситуациями не сталкивался Когда я только с ним познакомился, то для меня было лёгким шоком, что надо ставить break... тоже самое было) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2009, 13:48:44 |
|
||
|
Недостаток оператора switch
|
|||
|---|---|---|---|
|
#18+
Frankie, Может так ? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. или так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2009, 13:48:55 |
|
||
|
Недостаток оператора switch
|
|||
|---|---|---|---|
|
#18+
clihltМожет так ? Абстрагируйтесь от конкретного примера. Представьте, что там части sql-запроса. Например JOIN таблиц, а в switch идёт имя параметра, от которого зависит какие таблицы включать в выборку. Вторым способом обычно и обхожусь, а что делать.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2009, 14:31:47 |
|
||
|
Недостаток оператора switch
|
|||
|---|---|---|---|
|
#18+
KorcarFrankie имеет в виду, что нельзя выполнить кусок кода, к примеру, по второму условию и тут же перейти к куску кода, выполняемом при 4-м условии, тогда их надо отдельной комбинацией писать друг за дружкой без брейков, если я правильно все понял. Вообще, не знаю, чем навороты с этими брейками нужны, хотя мож просто с подобными ситуациями не сталкивался Когда я только с ним познакомился, то для меня было лёгким шоком, что надо ставить break... тоже самое было) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2009, 15:39:40 |
|
||
|
Недостаток оператора switch
|
|||
|---|---|---|---|
|
#18+
FrankieА было бы круто, если бы помимо break было что-то вроде further, которое бы позволяло входить в следующие условия при совпадении. Тогда бы я мог получить ответ 2 при а, и 1 при остальных вариантах. Frankie, оператор switch моделирует работу узла конечного автомата. Если ты не можешь описать свою задачу таким образом, то либо тебе надо перейти на использование if-else или пересмотреть логику на предмет декомпозиции на более простые автоматы. Подстраивать switch в угоду кустарным задачам - плохой подход. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2009, 23:30:24 |
|
||
|
Недостаток оператора switch
|
|||
|---|---|---|---|
|
#18+
FrankieКогда я только с ним познакомился, то для меня было лёгким шоком, что надо ставить break, иначе будут задействованы следующие case, даже если они не попадают под условие. Довольно странно, на мой взгляд. Это наследие тёмного прошлого, в котором switch был всего лишь цивилизованной формой записи вычисляемого goto. "В оригинале" соответствующий кусок кода выглядел примерно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. И если очередная секция не завершалась GOTO на "после последнего" - то есть аналогом break - они подряд и выполнялись. FrankieА было бы круто, если бы помимо break было что-то вроде further, которое бы позволяло входить в следующие условия при совпадении. Тогда бы я мог получить ответ 2 при а, и 1 при остальных вариантах. Это не было бы круто, имхо. Вы фактически хотите превратить switch в реализацию таблицы решений, что сделает и без того монструозный оператор - самый монструозный из всех структурных - просто невоспринимаемым, нечитаемым. Собственно, если Вы посмотрите на вышеприведённый пример с GOTO, Вы обнаружите, что там как раз это делается, стоит только вместо break поставить if либо снова вычисляемый goto. А теперь внимание, вопрос. Представьте себе, что Вы это сделали. Вы уже поняли, почему код тех времён называли "спагетти"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2009, 00:03:24 |
|
||
|
Недостаток оператора switch
|
|||
|---|---|---|---|
|
#18+
Есть паскалевый оператор case который работает так как вам надо - он более развит. Создателям языка С паскалевый case похоже попросту был не по зубам, а может они не в силах были отвыкнуть от привычки мыслить без оператора goto. И теперь он такой во всех унаследованных языках. Видел в учебнике одного очень серьезного дядьки рекомендацию как употреблять goto(!) внутри switch. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2009, 09:58:09 |
|
||
|
Недостаток оператора switch
|
|||
|---|---|---|---|
|
#18+
softwarerЭто не было бы круто, имхо. Вы фактически хотите превратить switch в реализацию таблицы решений, что сделает и без того монструозный оператор - самый монструозный из всех структурных - просто невоспринимаемым, нечитаемым. Собственно, если Вы посмотрите на вышеприведённый пример с GOTO, Вы обнаружите, что там как раз это делается, стоит только вместо break поставить if либо снова вычисляемый goto. Конечно, если в case вызывать функции, разворачивать условные конструкции, то вещь будет действительно монструозная, но я использую switch строго как замену elseif, а в case стоят приращения ( += ). Я же не предлагаю further вместо break, я предлагаю в расширение. Про спагетти не уверен, что понял. Worobjoff, да, припомниаю... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2009, 13:08:25 |
|
||
|
Недостаток оператора switch
|
|||
|---|---|---|---|
|
#18+
Frankieно я использую switch строго как замену elseif, Фраза сама по себе странная, но вдобавок, похоже, ошибочная. Вы как раз хотите использовать её как замену if без else. То есть Вы хотите сделать примерно так: Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2009, 17:29:05 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=36128047&tid=1344335]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
172ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
| others: | 230ms |
| total: | 512ms |

| 0 / 0 |
