Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Разница между if, ? и switch/case (http://www.flasher.ru/forum/showthread.php?t=121698)

r_r_f_r 21.02.2009 20:17

Блин, я думал где-то такая чудо инфа имеется, спасибо:)

SunShadow 21.02.2009 20:18

Читабельность любого кода это больше привычка форматировать код и давать понятные наименования переменным и командам, чем выбирать каким операторами его записывать).
На сколько мне известно анализ любого логического условия выполняется до тех пор пока у результата есть неопределенность:
1. a && b при a=false не будет дальше анализировать b, это излишняя операция
2. a || b при a=true не будет дальше анализировать b, это излишняя операция
и т.д.
Я придерживаюсь такой методики: Если условие простое и выполняется в одну операцию то стараюсь выполнять при помощи ? или if. Когда подразумевается многоступенчатая проверка if elseif ... то предпочитаю switch.
На счет того что не видно какие условия проверки есть простой прием
Код AS3:

var obj:* = event.target;
                                switch (true)
                                {
                                        case obj is Map:
                                                map = obj as Map;
                                                currentScroll = map;
                                                addEventListener(NavigatorEvents.MOUSE_OVER, hnMouseOverChildControl);
                                                break;
                                        case obj is Classificator:
                                                classificator = obj as Classificator;
                                                break;
                                        case obj is ButtonScaleDown:
                                                btnScaleDown = obj as ButtonScaleDown;
                                                addEventListener(NavigatorEvents.SCALE_DOWN_START, hnScaleDownStart);
                                                addEventListener(NavigatorEvents.SCALE_DOWN_STOP, hnScaleStop);
                                                addEventListener(NavigatorEvents.SCALE_DOWN_ENABLED, hnScaleDownEnabled);
                                                addEventListener(NavigatorEvents.SCALE_DOWN_NOT_ENABLED, hnScaleDownNotEnabled);
                                                break;
                                        case obj is ButtonScaleUp:
                                                btnScaleUp = obj as ButtonScaleUp;
                                                addEventListener(NavigatorEvents.SCALE_UP_START, hnScaleUpStart);
                                                addEventListener(NavigatorEvents.SCALE_UP_STOP, hnScaleStop);
                                                addEventListener(NavigatorEvents.SCALE_UP_ENABLED, hnScaleUpEnabled);
                                                addEventListener(NavigatorEvents.SCALE_UP_NOT_ENABLED, hnScaleUpNotEnabled);
                                                break;
                                        default:
                                                throw Error('Неопознанный контрол.');
                                }

Мне читать такой код проще чем череду из if. Сразу видно что и с чем работает. И секцию если она не отрабатывает проще пропустить и найти следующую. И потом у свитча есть такая полезная функция как объединение нескольких условий по пропуску break, что тоже облегчает чтение чем разбирать какие из вложенных if будут работать а какие нет.

Gaen 21.02.2009 21:54

Раз уж пошла такая пьянка, расскажите, как описанные выше способы соотносятся по быстродействию с хешами.

godknowsiamgood 22.02.2009 15:05

Свитч работает гораздо быстрее. Например,

if (val == 1)
...
else if (val == 2)
...

В данном случае проверяются все ифы, пока не дойдет до верного условия.

А в случае с кейсом - компилятор строит такой код, который выполняет некоторые нехитрые арифметические операции с адресами, и таким образом происходит сразу прыжок на нужный код.

Хотя я знаю, что это верно применительно к C++.

BlooDHounD 22.02.2009 15:14

godknowsiamgood, ни к С++ ни к АС ваши слова отношения не имеют.

VVall 22.02.2009 15:27

Насколько я помню, оптимизирующие компиляторы C++ умеют делать таблицы перехода для больших switch (сотни case), вместо набора if'ов.

iNils 22.02.2009 16:13

Цитата:

В данном случае проверяются все ифы, пока не дойдет до верного условия.
А в случае с кейсом - компилятор строит такой код, который выполняет некоторые нехитрые арифметические операции с адресами, и таким образом происходит сразу прыжок на нужный код.
Думаете break просто так пишут?

Psycho Tiger 22.02.2009 21:33

Цитата:

Сообщение от VVall (Сообщение 800264)
Насколько я помню, оптимизирующие компиляторы C++ умеют делать таблицы перехода для больших switch (сотни case), вместо набора if'ов.

Логично было бы тогда все if`ы переводить в switch`и при комплияции, нэ?

2iNils: не понял сути твоего поста =)

VVall 22.02.2009 22:41

Цитата:

Сообщение от Psycho Tiger (Сообщение 800310)
Логично было бы тогда все if`ы переводить в switch`и при комплияции, нэ?

Не в курсе тонкостей, но вроде это связано с кэшем - обращение к таблице медленнее нескольких условий.

godknowsiamgood 22.02.2009 23:51

Цитата:

Сообщение от BlooDHounD (Сообщение 800261)
godknowsiamgood, ни к С++ ни к АС ваши слова отношения не имеют.

Не понимаю. Вот нашел:
It is well known that many C compilers will attempt to convert a switch statement into a jump table.


Часовой пояс GMT +4, время: 22:11.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.