|
|
|
| Здравствуйте, подскажите можно ли в операторе switch передвинуть значение по умолчанию (defult) в самый верх, или оно должно идти строго в последнюю очередь, вот пример
<?php
switch ($i):
default:
echo "i is not equal to 0, 1 or 2";
break;
case 0:
echo "i equals 0";
break;
case 1:
echo "i equals 1";
break;
case 2:
echo "i equals 2";
break;
endswitch;
?>
|
в примере все работает без ошибок, но все же решил спросить | |
|
|
|
|
автор: ........ (05.08.2009 в 21:48) |
|
|
для: Visavi
(05.08.2009 в 21:30)
| | если работает значит можно , вопрос только ещё остаётся везде-ли будет работать
А так в конечном итоге нет никаких if else switch ,
есть только goto :) вернее даже не goto а всевозможные машинные комманды
jmp je jne jb .... ещё вообще-то целая куча всевозможных loopnz loop loopne .....
все посути делают goto :) но в определённых случаях , условные и безусловные переходы
а все эти if и switch просто чтобы легче запомнить ;) | |
|
|
|
|
|
|
|
для: Visavi
(05.08.2009 в 21:30)
| | А зачем? У Вас получается лишний break добавляется после default, а это не есть хорошо. Код доджен быть стройным, оптимальным и компактным. | |
|
|
|
|
|
|
|
для: Sergeich
(05.08.2009 в 22:44)
| | Один лишний break в интерпретируемом языке - крайне спорный аргумент.
А подход, выносящий информацию об умалчиваемом поведении фрагмента кода в самое начало переключателя, вполне имеет право на реализацию. Особенно, если хочется акцентировать внимание на этой ветви. | |
|
|
|
|
автор: ........ (05.08.2009 в 23:59) |
|
|
для: Trianon
(05.08.2009 в 22:48)
| | если рассуждать логически ,)
default в конце более обоснованно
например если примерно изобразить набор комманд
switch: mov eax, 0x00 ; например тестируется 0x00
cmp eax, 0x30
jne case2; переход дальше если не равно
push string
call [echo]
jmp finish ; безусловный переход
case2: cmp eax, 0x31
jne case3; переход дальше если не равно
push string
call [echo]
jmp finish ; безусловный переход
case3: cmp eax, 0x32
jne default; переход дальше если не равно
push string
call [echo]
jmp finish ; безусловный переход
default:; тут уже никаких переходов
push string
call [echo]
finish:
..какойто код
|
придётся добавить два jmp в блок default в случае вставки его наверх
а это уже не один break;) | |
|
|
|
|
|
|
|
для: ........
(05.08.2009 в 23:59)
| | Это верно, но РНР не ассемблер, "вольностей" предполагает много, а это и "раскиселивает" мозги, и не заставляет думать, а что же в итоге со строчками будет :) | |
|
|
|
|
|
|
|
для: ........
(05.08.2009 в 23:59)
| | >если рассуждать логически ,)
>default в конце более обоснованно
>например если примерно изобразить набор комманд
То изображать его нужно адекватно.
cmp eax, 4
ja default
sub eax, 1
jb default
jmp dword ptr [referencelist][eax*4]
reflist: dd case1, case2, case3
case1:
push string
call [echo]
jmp finish ; безусловный переход
case2:
push string
call [echo]
jmp finish ; безусловный переход
case3:
push string
call [echo]
jmp finish ; безусловный переход
default:;
push string
call [echo]
finish:
|
ну и code motion optimisations никто не отменял.
Если мы говорим о компилируемом языке.
Если об интерпретируемом - повторяю - всё это чушь собачья.
И без лишнего джампа есть чему процессор есть. | |
|
|
|
|
|
|
|
для: ........
(05.08.2009 в 23:59)
| | ИМХО switch - это вообще зараза которая только захламляет код. Я не могу даже быстро придумать ситуацию где ну вообще никак нельзя обойтись без него, либо решение со свичом будет более компактным и читаемым. Код выше, например, можно переписать скажем так:
<?php
echo in_array($i, array(0, 1, 2)) ? 'i equals ' . $i : 'i is not equal to 0, 1 or 2';
|
вместо 10 строк одна + нету копипаста строки "i equals". Это конечно плохой пример но зачастую оказывается так что array-функции намного упрощают код. | |
|
|
|
|
|
|
|
для: Евгений Петров
(06.08.2009 в 00:47)
| | У меня есть файл, который совмещает в себе три разные функции: форма ввода, предварительный просмотр введенного, занесение значений в бд. А тут, думаете, тоже лучше что-нибудь с массивами намутить или через elseif мучать? И в этом файле, кстати, default у меня сверху, т.к. по умолчанию на экран выводится форма.
Вот открываю я этот файл спустя месяц, а даже не задумываюсь, где и что искать. Четко и ясно разделено на три части. Верхний блок - форма, средний блок - превью, нижний блок - занесение в бд.
<?php
switch ($_GET['act']) {
default: {forma}; break;
case 'preview': {preview}; break;
case 'add': {add}; break;
}
?>
|
| |
|
|
|
|
|
|
|
для: neadekvat
(06.08.2009 в 01:47)
| | а зачем вы склеиваете 3 абсолютно разные функции (доавление, предпросмотр и форма ввода) в одну функцию. Разбейте на 3. Код станет намного читабельнее благодаря тому что каждая ф-я делает то что должна.
<?php
function add() {
...
}
function preview() {
...
}
function form() {
...
}
$methods = array('add', 'preview', 'form');
if (in_array($_GET['act'], $methods)) {
$methods[$_GET['act']]();
}
|
| |
|
|
|
|
|
|
|
для: Евгений Петров
(06.08.2009 в 00:47)
| | >Я не могу даже быстро придумать ситуацию
Попробуйте написать реализацию функции date() | |
|
|
|
|
|
|
|
для: Trianon
(06.08.2009 в 02:03)
| | Можно по аналогии с предыдущим примером. Где каждой константе (%d, %M, %Y, ...) соответствует одна либо несколько ф-й. Соответствия можно хранить в массиве. | |
|
|
|
|
|
|
|
для: Евгений Петров
(06.08.2009 в 11:45)
| | вход/выход в каждую функцию это изрядный overhead, вызванный необходимостью смены контекста даже в языках компилируемых. А здесь и подавно. Не говоря о том, что есть полно ситуаций, когда контекст как раз таки хочется оставить исходный, не перетягивая его из функции в функцию.
Без лишних функций, пожалуйста.
Я, кстати, не утверждаю, что без switch нельзя обойтись.
Просто без него логику с ветвлением по значению из множества неудобно делать. | |
|
|
|
|
|
|
|
для: Trianon
(06.08.2009 в 11:48)
| | На самом деле я не хочу утверждать что его вообще не надо использовать. ) Но пример с add, preview и form ярко показывает почему его стоит опасаться. | |
|
|
|
|
|
|
|
для: Евгений Петров
(06.08.2009 в 12:01)
| | >На самом деле я не хочу утверждать что его вообще не надо использовать. )
>Но пример с add, preview и form ярко показывает почему его стоит опасаться.
Почему?
В том коде я ничего опасного не обнаружил. | |
|
|
|
|
|
|
|
для: Trianon
(06.08.2009 в 12:04)
| | Опасно то, что потом там начинают появляться ещё различные методы в этом свиче. В итоге ф-ии которые выполняют разную роль оказываются в одной длиннющей функции, в которой чтобы разобраться надо пол дня потратить. | |
|
|
|
|
|
|
|
для: Евгений Петров
(06.08.2009 в 12:21)
| | Не надо мешать кислое с пресным.
Чрезмерно перегрузить функцию кодом можно и при линейной, и при циклической структуре алгоритма. switch здесь никак исключением не является. | |
|
|
|
|
|
|
|
для: Евгений Петров
(06.08.2009 в 12:01)
| | Switch принципиально отличается от if/else тем, что позволяет срабатывать нескольким условиям сразу. И вот в этих случаях код получается очень понятным и читаемым. Правда, случаи эти не слишком часты. | |
|
|
|