Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Вопрос про оператор switch
 
 автор: Visavi   (05.08.2009 в 21:30)   письмо автору
 
 

Здравствуйте, подскажите можно ли в операторе 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 просто чтобы легче запомнить ;)

  Ответить  
 
 автор: Sergeich   (05.08.2009 в 22:44)   письмо автору
 
   для: Visavi   (05.08.2009 в 21:30)
 

А зачем? У Вас получается лишний break добавляется после default, а это не есть хорошо. Код доджен быть стройным, оптимальным и компактным.

  Ответить  
 
 автор: Trianon   (05.08.2009 в 22:48)   письмо автору
 
   для: 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;)

  Ответить  
 
 автор: sim5   (06.08.2009 в 00:25)   письмо автору
 
   для: ........   (05.08.2009 в 23:59)
 

Это верно, но РНР не ассемблер, "вольностей" предполагает много, а это и "раскиселивает" мозги, и не заставляет думать, а что же в итоге со строчками будет :)

  Ответить  
 
 автор: Trianon   (06.08.2009 в 00:38)   письмо автору
 
   для: ........   (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 никто не отменял.
Если мы говорим о компилируемом языке.

Если об интерпретируемом - повторяю - всё это чушь собачья.
И без лишнего джампа есть чему процессор есть.

  Ответить  
 
 автор: Евгений Петров   (06.08.2009 в 00:47)   письмо автору
 
   для: ........   (05.08.2009 в 23:59)
 

ИМХО switch - это вообще зараза которая только захламляет код. Я не могу даже быстро придумать ситуацию где ну вообще никак нельзя обойтись без него, либо решение со свичом будет более компактным и читаемым. Код выше, например, можно переписать скажем так:
<?php
echo in_array($i, array(012)) ? 'i equals ' $i 'i is not equal to 0, 1 or 2';


вместо 10 строк одна + нету копипаста строки "i equals". Это конечно плохой пример но зачастую оказывается так что array-функции намного упрощают код.

  Ответить  
 
 автор: neadekvat   (06.08.2009 в 01:47)   письмо автору
 
   для: Евгений Петров   (06.08.2009 в 00:47)
 

У меня есть файл, который совмещает в себе три разные функции: форма ввода, предварительный просмотр введенного, занесение значений в бд. А тут, думаете, тоже лучше что-нибудь с массивами намутить или через elseif мучать? И в этом файле, кстати, default у меня сверху, т.к. по умолчанию на экран выводится форма.
Вот открываю я этот файл спустя месяц, а даже не задумываюсь, где и что искать. Четко и ясно разделено на три части. Верхний блок - форма, средний блок - превью, нижний блок - занесение в бд.

<?php
switch ($_GET['act']) {
default: {
forma}; break;
case 
'preview': {preview}; break;
case 
'add': {add}; break;
}
?>

  Ответить  
 
 автор: Евгений Петров   (06.08.2009 в 11:41)   письмо автору
 
   для: 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']]();
}

  Ответить  
 
 автор: Trianon   (06.08.2009 в 02:03)   письмо автору
 
   для: Евгений Петров   (06.08.2009 в 00:47)
 

>Я не могу даже быстро придумать ситуацию

Попробуйте написать реализацию функции date()

  Ответить  
 
 автор: Евгений Петров   (06.08.2009 в 11:45)   письмо автору
 
   для: Trianon   (06.08.2009 в 02:03)
 

Можно по аналогии с предыдущим примером. Где каждой константе (%d, %M, %Y, ...) соответствует одна либо несколько ф-й. Соответствия можно хранить в массиве.

  Ответить  
 
 автор: Trianon   (06.08.2009 в 11:48)   письмо автору
 
   для: Евгений Петров   (06.08.2009 в 11:45)
 

вход/выход в каждую функцию это изрядный overhead, вызванный необходимостью смены контекста даже в языках компилируемых. А здесь и подавно. Не говоря о том, что есть полно ситуаций, когда контекст как раз таки хочется оставить исходный, не перетягивая его из функции в функцию.

Без лишних функций, пожалуйста.

Я, кстати, не утверждаю, что без switch нельзя обойтись.
Просто без него логику с ветвлением по значению из множества неудобно делать.

  Ответить  
 
 автор: Евгений Петров   (06.08.2009 в 12:01)   письмо автору
 
   для: Trianon   (06.08.2009 в 11:48)
 

На самом деле я не хочу утверждать что его вообще не надо использовать. ) Но пример с add, preview и form ярко показывает почему его стоит опасаться.

  Ответить  
 
 автор: Trianon   (06.08.2009 в 12:04)   письмо автору
 
   для: Евгений Петров   (06.08.2009 в 12:01)
 

>На самом деле я не хочу утверждать что его вообще не надо использовать. )
>Но пример с add, preview и form ярко показывает почему его стоит опасаться.
Почему?
В том коде я ничего опасного не обнаружил.

  Ответить  
 
 автор: Евгений Петров   (06.08.2009 в 12:21)   письмо автору
 
   для: Trianon   (06.08.2009 в 12:04)
 

Опасно то, что потом там начинают появляться ещё различные методы в этом свиче. В итоге ф-ии которые выполняют разную роль оказываются в одной длиннющей функции, в которой чтобы разобраться надо пол дня потратить.

  Ответить  
 
 автор: Trianon   (06.08.2009 в 12:33)   письмо автору
 
   для: Евгений Петров   (06.08.2009 в 12:21)
 

Не надо мешать кислое с пресным.
Чрезмерно перегрузить функцию кодом можно и при линейной, и при циклической структуре алгоритма. switch здесь никак исключением не является.

  Ответить  
 
 автор: Loki   (06.08.2009 в 12:09)   письмо автору
 
   для: Евгений Петров   (06.08.2009 в 12:01)
 

Switch принципиально отличается от if/else тем, что позволяет срабатывать нескольким условиям сразу. И вот в этих случаях код получается очень понятным и читаемым. Правда, случаи эти не слишком часты.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования