Просмотр полной версии : Правильное использование "расширенного" оператора ветвления (s1 ? s2 : s3)
KumoKairo
04.06.2013, 11:14
Доброго времени суток.
Возник вопрос адекватности применеия "упрощенного" оператора ветвления:
statement1 ? statement2 : statement3;
в случае, когда это ветвление не полное.
Приходится писать
statement1 ? null: statement3;
или
statement1 ? statement2 : null;
Собственно вопрос - насколько оправдано вообще использовать этот оператор для неполного ветвления с точки зрения эстетики кода и адекватности/скорости/производительности выполнения?
FieryWall
04.06.2013, 11:26
вполне оправдано, заменяет кучу строк условий, более четабелен во многих случаях; что касаеться производительности - проведите тест
Тут дело не в оправданности, а в читабельности, стиле и конвенции команды, в которой вы участвуете. Лично я отдал бы предпочтение 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;
Протестирую тогда потом производительность отдельно
Просто на забугорных ресурсах ничего не нашел по этому поводу и в книжках тоже не встречал, если память не изменяет
Оператор просто используется не по назначению. Он возвращает определенное значение. Здесь лучше использовать вместо этой громоздкой длинной конструкции вот такую:
if (graphicElement.parent == graphicСontainer) {
graphicСontainer.removeChild(graphicElement);
}
Во-первых, contains пробегает по всем вложенностям. Во-вторых такая конструкция ничего не возвращает и понятна глазу.
Просто этим расширенным оператором очень удобно избавляться от ошибок удаления несуществущих дисплей объектовИ чем это "удобней" обычного
if(this.graphicСontainer.contains(graphicElement)) this.graphicСontainer.removeChild(graphicElement);
?
KumoKairo
04.06.2013, 11:50
КорДум О, спасибо за разъяснения)
Вопросы отпали
Wolsh почему то вторая конструкция выглядит более громоздкой, может это проблемы восприятия конечно
Возможно, это потому что Вы еще не воспринимаете тернарный оператор как возвращающий значение, и затычки вроде 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);
}
Тернарный оператор не используют для вызова функций.Это не так. Используют конечно, когда функции возвращают значение
super.graphics.beginFill(isEven ? getLightColor() : getDarkColor());
MikroAcse
04.06.2013, 20:49
когда функции возвращают значение
Ну да, я имел ввиду просто вызов функции, как у него.
if(graphicСontainer.contains(graphicElement)) {
graphicСontainer.removeChild(graphicElement);
}
Кстати, contains так лучше не использовать, если вы не совсем помните все дерево отображения.
Вообще-то КорДум обо всем прекрасно рассказал в шестом посте.
MikroAcse
04.06.2013, 23:25
Кстати, contains так лучше не использовать, если вы не совсем помните все дерево отображения.
А я его и не использую :)
Я пользуюсь способом, который описал КорДума.
Упс, так спешил поделиться, что не заметил :D
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.