Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Недостаток оператора switch / 11 сообщений из 11, страница 1 из 1
05.08.2009, 13:22:06
    #36127572
Frankie
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Недостаток оператора switch
Не первый раз сталкиваюсь с тем, что оператор switch не предоставляет весьма удобной возможности выполнять несколько case, которые не расположены подряд.

Когда я только с ним познакомился, то для меня было лёгким шоком, что надо ставить break, иначе будут задействованы следующие case, даже если они не попадают под условие. Довольно странно, на мой взгляд.

Пример (РНР)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
$x = 'a';
$y =  0 ;
switch ($x) {
	case 'a': case 'b': $y =  1 ; break;
	case 'd': $y++; break;
	case 'a': case 'c': $y++; break;
}
echo $y;

В таком случае на выходе будет всегда 1 при любом $x из a,b,c,d. Если я уберу break, то при b ответ будет 3. А было бы круто, если бы помимо break было что-то вроде further, которое бы позволяло входить в следующие условия при совпадении. Тогда бы я мог получить ответ 2 при а, и 1 при остальных вариантах.

Пример утрированный, но например при сборке sql-запроса в case могут быть большие куски, которые так или иначе придётся повторять...

Может быть, я что-то не так понимаю? Или есть язык, где switch расширен?
...
Рейтинг: 0 / 0
05.08.2009, 13:37:57
    #36127617
eee-pc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Недостаток оператора switch
приведи более понятный пример
...
Рейтинг: 0 / 0
05.08.2009, 13:48:44
    #36127660
Korcar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Недостаток оператора switch
Frankie имеет в виду, что нельзя выполнить кусок кода, к примеру, по второму условию и тут же перейти к куску кода, выполняемом при 4-м условии, тогда их надо отдельной комбинацией писать друг за дружкой без брейков, если я правильно все понял.
Вообще, не знаю, чем навороты с этими брейками нужны, хотя мож просто с подобными ситуациями не сталкивался

Когда я только с ним познакомился, то для меня было лёгким шоком, что надо ставить break...
тоже самое было)
...
Рейтинг: 0 / 0
05.08.2009, 13:48:55
    #36127662
clihlt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Недостаток оператора switch
Frankie,

Может так ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
$x = 'a';
$y =  0 ;
switch ($x) {
           case 'b':  $y =  1 ; break;
	case 'a':  $y =  1 ;
           	case 'd':  case 'c': $y++; break;

}
echo $y;


или так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
$x = 'a';
$y =  0 ;
switch ($x) {
          	case 'a': case 'b':  $y =  1 ; if( $x == 'b') break;
           	case 'd':  case 'c': $y++; break;
}
echo $y;

...
Рейтинг: 0 / 0
05.08.2009, 14:31:47
    #36127808
Frankie
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Недостаток оператора switch
clihltМожет так ?
Абстрагируйтесь от конкретного примера. Представьте, что там части sql-запроса. Например JOIN таблиц, а в switch идёт имя параметра, от которого зависит какие таблицы включать в выборку.

Вторым способом обычно и обхожусь, а что делать....
...
Рейтинг: 0 / 0
05.08.2009, 15:39:40
    #36128047
eee-pc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Недостаток оператора switch
KorcarFrankie имеет в виду, что нельзя выполнить кусок кода, к примеру, по второму условию и тут же перейти к куску кода, выполняемом при 4-м условии, тогда их надо отдельной комбинацией писать друг за дружкой без брейков, если я правильно все понял.
Вообще, не знаю, чем навороты с этими брейками нужны, хотя мож просто с подобными ситуациями не сталкивался

Когда я только с ним познакомился, то для меня было лёгким шоком, что надо ставить break...
тоже самое было)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
switch(i)
{
case  0 :
 a =  10 ;
 doSomething();
case  2 :
 b =  10 ;
 if (lalala != lololo)
  break;
 doSomethingElse();
...

}
очень удобно бывает кстати
...
Рейтинг: 0 / 0
05.08.2009, 23:30:24
    #36128898
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Недостаток оператора switch
FrankieА было бы круто, если бы помимо break было что-то вроде further, которое бы позволяло входить в следующие условия при совпадении. Тогда бы я мог получить ответ 2 при а, и 1 при остальных вариантах.
Frankie, оператор switch моделирует работу узла конечного автомата. Если ты не можешь описать свою задачу таким образом, то либо тебе надо перейти на использование if-else или пересмотреть логику на предмет декомпозиции на более простые автоматы.

Подстраивать switch в угоду кустарным задачам - плохой подход.
...
Рейтинг: 0 / 0
06.08.2009, 00:03:24
    #36128916
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Недостаток оператора switch
FrankieКогда я только с ним познакомился, то для меня было лёгким шоком, что надо ставить break, иначе будут задействованы следующие case, даже если они не попадают под условие. Довольно странно, на мой взгляд.
Это наследие тёмного прошлого, в котором switch был всего лишь цивилизованной формой записи вычисляемого goto. "В оригинале" соответствующий кусок кода выглядел примерно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 10  ON X GOTO  100 ,  200 ,  300 ,  400 
...
 100  REM Код для X =  1 
...
 200  REM Код для X =  2 
...
 300  REM Код для X =  3 
...
 400  REM Код для X =  4 
...

И если очередная секция не завершалась GOTO на "после последнего" - то есть аналогом break - они подряд и выполнялись.

FrankieА было бы круто, если бы помимо break было что-то вроде further, которое бы позволяло входить в следующие условия при совпадении. Тогда бы я мог получить ответ 2 при а, и 1 при остальных вариантах.
Это не было бы круто, имхо. Вы фактически хотите превратить switch в реализацию таблицы решений, что сделает и без того монструозный оператор - самый монструозный из всех структурных - просто невоспринимаемым, нечитаемым. Собственно, если Вы посмотрите на вышеприведённый пример с GOTO, Вы обнаружите, что там как раз это делается, стоит только вместо break поставить if либо снова вычисляемый goto.

А теперь внимание, вопрос. Представьте себе, что Вы это сделали. Вы уже поняли, почему код тех времён называли "спагетти"?
...
Рейтинг: 0 / 0
06.08.2009, 09:58:09
    #36129164
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Недостаток оператора switch
Есть паскалевый оператор case который работает так как вам надо - он более развит. Создателям языка С паскалевый case похоже попросту был не по зубам, а может они не в силах были отвыкнуть от привычки мыслить без оператора goto. И теперь он такой во всех унаследованных языках. Видел в учебнике одного очень серьезного дядьки рекомендацию как употреблять goto(!) внутри switch.
...
Рейтинг: 0 / 0
06.08.2009, 13:08:25
    #36129786
Frankie
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Недостаток оператора switch
softwarerЭто не было бы круто, имхо. Вы фактически хотите превратить switch в реализацию таблицы решений, что сделает и без того монструозный оператор - самый монструозный из всех структурных - просто невоспринимаемым, нечитаемым. Собственно, если Вы посмотрите на вышеприведённый пример с GOTO, Вы обнаружите, что там как раз это делается, стоит только вместо break поставить if либо снова вычисляемый goto.
Конечно, если в case вызывать функции, разворачивать условные конструкции, то вещь будет действительно монструозная, но я использую switch строго как замену elseif, а в case стоят приращения ( += ). Я же не предлагаю further вместо break, я предлагаю в расширение. Про спагетти не уверен, что понял.

Worobjoff, да, припомниаю...
...
Рейтинг: 0 / 0
06.08.2009, 17:29:05
    #36130864
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Недостаток оператора switch
Frankieно я использую switch строго как замену elseif,
Фраза сама по себе странная, но вдобавок, похоже, ошибочная. Вы как раз хотите использовать её как замену if без else. То есть Вы хотите сделать примерно так:

Код: plaintext
1.
2.
3.
4.
5.
sql = "select f1, f2 " +
      (i ==  1  || i ==  2 ) ? ", f3 " : "" +
      "from t1 " +
      (i ==  1  || i ==  3 ) ? " join t2 on (t1.id = t2.id) " : "" +
      "group by f1 " +
      (i ==  2 ) ? ", f3" : "";
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Недостаток оператора switch / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]