|
|
|||||
буду краток
модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
|
2dimarik
Цитата:
Мне неоднократно встречались такие проекты. Особенно ими грешат бывшие /или по совместительству/ яверы. Вместо возможного компактного кода - куча стратегий, команд, каких то ассертов и юнит-тестов.. Я не то что против всего этого, просто очень часто чрезмерные абстракции чрезмерны) из последнего: Сравните исходники FlowPlayer и osmf Разница существенная, хотя функционал очень близкий. Может быть FlowPlayer специально запутывают код ибо продают бинарники за большие деньги, но факт остаётся фактом.
__________________
Отряд Котовскага Последний раз редактировалось Котяра; 25.01.2011 в 01:39. |
|
|||||
Цитата:
то я ее читал. Меня, если честно, не напугало... for each...in и for .. in тоже намного медленнее обычного for, это же не повод от них отказываться. Кста, если порыться во флексе, то можно найти несколько мест, где adobe используют анонимные методы. Так же есть и в greensock. Цитата:
А у меня довольно часто возникают места которые никогда не будут вызываться, кроме отдельно взятого места... Более того, код практически любого обработчика события всегда нужен в одном и только в одном месте... Если уже на то пошло, ситуации, когда обработчик события будучи подписанным, никигода не потребует отписывания возникает куда чаще, чем наоборо... По крайней мере в моей практике... В качестве иллюстрации приведу пример окна аля MsgBox или Alert, хотелось бы услышать, что в его реализации может оказаться критичным? package { import flash.display.DisplayObjectContainer; import assets.gMessageBox; import flash.events.Event; import flash.events.MouseEvent; /** * ... * @author Denis `Jack` Vinogradsky */ public class MsgBox extends assets.gMessageBox { private static var _instance:MsgBox; private var _onClose:Function; ///Применение callback вместо события. Событие при такой архитектуре не подходит. ///Окно сродни синглтону. Создается по требованию, существует толкьо одном экземпляре. Никогда не уничтожается. public static function show(owner:DisplayObjectContainer, text:String,onClose:Function):void { if (!_instance) new MsgBox(); _instance.init(owner,text,onClose); } private function init(owner:DisplayObjectContainer,text:String,onClose:Function):void { visible = false; owner.addChild(_instance); _textField.text = text; _onClose = onClose; visible = true; } public function MsgBox() { if (_instance) throw new Error("MsgBox должен существовать только одном экземпляре"); _instance = this; //конечно, тут можно не делать анонимный метод. с другой стороны, из сех недостатков анонимного метода //которые могут проявится - класс будет весить на 600 байт больше, если верить тестам... //не самое страшное что пожет случится, если учесть сколько может весить графическая часть этого окна... //Да, здесь анонимный метод не нужен, но и его наличие ни на что особо не повлияет... _closeButton.addEventListener(MouseEvent.CLICK, function(e:Event):void { visible = false; } ); } override public function set visible(value:Boolean):void { if (super.visible == value) return; super.visible = value; if (!value) { if(parent) parent.removeChild(this); if (_onClose != null) { var f:Function = _onClose; _onClose = null; f(); } } } } } Хотя, безусловно, чаще всего анонимные функции нужны при применении замыкания. Во всех остальных случаях их можно легко избежать. С другой стороны, плодить функции, аля: Тоже мало красивого...
__________________
Искренне Ваш, Джек. |
|
|||||
буду краток
модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
|
ужасный код у вас получился.. даже не считая анонимов.
по кнопке closeButton должен вызываться метод close, можно даже protected или даже public. а никак не public function set visible
__________________
Отряд Котовскага |
|
|||||
Цитата:
А close я не сделал намеренно. Я хочу гарантировать корректное закрытие по смене свойства visible. Максимум, можно сделать приватный close который будет вызвать из сетера, хотя не вижу в этом особого смысла. Кроме того, "почти" никакого способа добраться до класса извне нет(была бы возможность пометить конструктор как private, пометил бы). Т.е. класс является в принципе закрытым от всех, связность с остальным проектом сокращено до абсолютного минимума. Соответственно public метод close не нужен. Наследовать данный класс тоже особого смысла нет, если бы в AS3 был атрибут sealed, я бы его указал. Класс уже унаследован от графического виджета, и соответственно реально изменен быть не может. Желаю конструктивную критику Добавлено через 16 минут Если кого то смущает могу пояснить. В начале я написал: Но потом убрал. Потому что добавил в конструктор _instance=this. А делать одну и ту же операцию дважды, смысла особого нет. Если бы была какая то возможность объявить конструктор приватным, это было бы не нужно. На счет вынесения функции close, да, согласен, для повышения читабельности смысл ее сделать был. Но исключительно ради этого... Но в любом случае, класс вмещается на 2 экрана, и достаточно хорошо читаем. При этом максимально изолирован от внешней среды, имея единственный публичный интерфейс show. Добавлено через 22 минуты Пример, в общем то, академический. Конкретно MsgBox я бы реализовывал более универсально + обязательно добавил функционал lock, т.е. максимально приблизил бы его к модальному окну. В тоже время похожая архитектура подходит для большинства игровых окон. Чаще всего они нужны в единственном экземпляре. Обычно нет смысла их удалять. При желании можно вынести публичный функционал для закрытия окна, если этом есть необходимость. Она может хранить в себе модель, или просто получать какие то данные для отображения через функцию show. Чаще всего они не требуют возможность наследования от них, потому как наследуются от визуального клипа, созданного художниками.
__________________
Искренне Ваш, Джек. Последний раз редактировалось JackFromChaos; 25.01.2011 в 03:24. |
|
|||||
Modus ponens
|
вот это называется "сам себя запутал" А вообще, нет никакого преимущества в вашем коде по сравнению с нормально написаным, только незначительные недостатки - слушаетля _closeButton будет тяжело найти (outline panel), и вообще неряшливо оформленный код. Кроме того, этот слушатель будет каждый раз создаваться по-новой, что может привести к непредвиденым последствиям.
__________________
Hell is the possibility of sanity |
|
|||||
Погодите, погодите...
Цитата:
Цитата:
Хорошо, принимается. Кроме этого, что понимается под "неряшливо оформленный код", можно расшифровать? А вот эту мысль не понял... Кто создается повторно, и как можно создать тут не предвиденную ситуация...
__________________
Искренне Ваш, Джек. |
|
|||||
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
override public function set visible(value:Boolean):void { if (super.visible == value) return; super.visible = value; if (!value) { if(parent) parent.removeChild(this); if (_onClose != null) { var f:Function = _onClose; _onClose = null; f(); } } } Кстати, проверка наличия родителя перед ритуальным самоубийством ("папа, убей меня") - потому что мы не знаем, существуем или нет? На мой взгляд, функционал такого типа (MsgBox) пишется и компактнее и проще. Последний раз редактировалось mikhailk; 25.01.2011 в 11:45. |
|
|||||
Что-то типа того На самом деле тут я как раз перестраховался... В данном классе можно было бы от них избавиться, тут все прозрачно и управляемо... Но для будь у нас буличный close все эти проверки все равно вернулись бы...
__________________
Искренне Ваш, Джек. |
|
|||||
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
Имеем:
А теперь то же самое, но проще: Конечно если планируется при onClose снова вызывать алерт и вешать на его закрытие callback, то первый вариант конечно больше подходит. Но тут подход в реализации изначально неверный. Нужно вынести по крайней мере статичный геттер аля currentInstance и уже с ним колдовать. Тогда внутри самого экземпляра можно вообще убрать зануление _onClose, оставив только: _onClose сделать пабликом и переименовать в onClose, если не планируется как то ограничивать модификацию. Либо сделать геттер и сеттер onClose. Тогда при вызове колбака, в нем и зануляем onClose: private function _msgBox$onClose():void { MsgBox.currentInstance.onClose = null; // some actions }
__________________
Загружаем картинки, минуя ошибки безопасности Последний раз редактировалось i.o.; 25.01.2011 в 12:42. |
|
|||||
блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
|
Цитата:
__________________
Тут мужик танцует и поёт про флэш |
Часовой пояс GMT +4, время: 00:55. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|