PDA

Просмотр полной версии : Правильное использование "расширенного" оператора ветвления (s1 ? s2 : s3)


KumoKairo
04.06.2013, 11:14
Доброго времени суток.
Возник вопрос адекватности применеия "упрощенного" оператора ветвления:
statement1 ? statement2 : statement3;
в случае, когда это ветвление не полное.
Приходится писать
statement1 ? null: statement3;
или
statement1 ? statement2 : null;

Собственно вопрос - насколько оправдано вообще использовать этот оператор для неполного ветвления с точки зрения эстетики кода и адекватности/скорости/производительности выполнения?

zuxul
04.06.2013, 11:18
IF уже не рулит?

FieryWall
04.06.2013, 11:26
вполне оправдано, заменяет кучу строк условий, более четабелен во многих случаях; что касаеться производительности - проведите тест

КорДум
04.06.2013, 11:27
Тут дело не в оправданности, а в читабельности, стиле и конвенции команды, в которой вы участвуете. Лично я отдал бы предпочтение if'у.
Скоуп if'а является и скоупом всего метода, тут в as3 с этим проще, поэтому ничего не мешает записать
if (statement) {
var some:T = ...;
}
После компиляции some перемещается в хедер метода (подправьте терминологию) и инициируется по умолчанию null'ом.

KumoKairo
04.06.2013, 11:38
Ну если нужно сделать что-то, что не умещается в одну строчку, то тут лучше с if, не спорю)

Просто этим расширенным оператором очень удобно избавляться от ошибок удаления несуществущих дисплей объектов, например
this.graphicСontainer.contains(graphicElement) ? this.graphicСontainer.removeChild(graphicElement) : null;

Протестирую тогда потом производительность отдельно

Просто на забугорных ресурсах ничего не нашел по этому поводу и в книжках тоже не встречал, если память не изменяет

КорДум
04.06.2013, 11:48
Оператор просто используется не по назначению. Он возвращает определенное значение. Здесь лучше использовать вместо этой громоздкой длинной конструкции вот такую:
if (graphicElement.parent == graphicСontainer) {
graphicСontainer.removeChild(graphicElement);
}

Во-первых, contains пробегает по всем вложенностям. Во-вторых такая конструкция ничего не возвращает и понятна глазу.

Wolsh
04.06.2013, 11:48
Просто этим расширенным оператором очень удобно избавляться от ошибок удаления несуществущих дисплей объектовИ чем это "удобней" обычного
if(this.graphicСontainer.contains(graphicElement)) this.graphicСontainer.removeChild(graphicElement);
?

KumoKairo
04.06.2013, 11:50
КорДум О, спасибо за разъяснения)
Вопросы отпали

Wolsh почему то вторая конструкция выглядит более громоздкой, может это проблемы восприятия конечно

Wolsh
04.06.2013, 11:56
Возможно, это потому что Вы еще не воспринимаете тернарный оператор как возвращающий значение, и затычки вроде null Вас не смущают. Я, например, спотыкаюсь мозгом на таких записях. Требование обязательного наличия правой части, как и требование того, что части могут содержать только одно выражение, исходит именно из необходимости вернуть значение. Таково предназначение этого оператора — выбрать значение, а не действие.
Нормальное применение тернарного оператора:
a = bool ? b : c;
trace(bool ? string1 : string2);

KumoKairo
04.06.2013, 12:01
Wolsh да да, именно поэтому. Не воспринимал эту запись как непременно возвращающую значение. Смущала как раз затычка null, поэтому и решил спросить. Сейчас в голове щелкнуло, разобрался с оператором, спасибо за ответы.)

MikroAcse
04.06.2013, 20:04
this.graphicСontainer.contains(graphicElement) ? this.graphicСontainer.removeChild(graphicElement) : null;
Только не это :/
Тернарный оператор не используют для вызова функций.

Вот это более читабельно:
if(graphicСontainer.contains(graphicElement)) {
graphicСontainer.removeChild(graphicElement);
}

Wolsh
04.06.2013, 20:24
Тернарный оператор не используют для вызова функций.Это не так. Используют конечно, когда функции возвращают значение
super.graphics.beginFill(isEven ? getLightColor() : getDarkColor());

MikroAcse
04.06.2013, 20:49
когда функции возвращают значение
Ну да, я имел ввиду просто вызов функции, как у него.

GBee
04.06.2013, 22:43
if(graphicСontainer.contains(graphicElement)) {
graphicСontainer.removeChild(graphicElement);
}
Кстати, contains так лучше не использовать, если вы не совсем помните все дерево отображения.

Wolsh
04.06.2013, 23:07
Вообще-то КорДум обо всем прекрасно рассказал в шестом посте.

MikroAcse
04.06.2013, 23:25
Кстати, contains так лучше не использовать, если вы не совсем помните все дерево отображения.
А я его и не использую :)
Я пользуюсь способом, который описал КорДума.

GBee
05.06.2013, 10:21
Упс, так спешил поделиться, что не заметил :D