Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему  
Старый 08.03.2014, 20:40
Psijic вне форума Посмотреть профиль Отправить личное сообщение для Psijic Найти все сообщения от Psijic
  № 1  
Ответить с цитированием
Psijic

Регистрация: Aug 2012
Сообщений: 108
Cool Starling binding

Добрый вечер. Решил попытаться приобщиться на этом форуме к best practices. Ситуация следующая: автор Feathers на форуме сообщил, что сигналы теперь лучше не использовать поскольку события старлинга очень даже good. Я решил переписать для начала бинды флекса [Bindable]. Первоначальный вариант получился такой, что на каждую переменную пришлось делать гет-сет, которые раздули всю модель в несколько раз и из переменных + 3-4 функций в сумме около 100 строк (на всю модель) получилось строк 300. К тому же, сеттеры приходилось делать копипастой, что не слишком-то меня устроило. Решил сделать подкаст подкласс. Оцените реализацию и посоветуйте best practices.

Кусок модели-синглтона
Код AS3:
public class StateManager extends EventDispatcher
 
        private static var _instance: StateManager = new StateManager();
 
        public static function get instance(): StateManager
        {
            return _instance;
        }
Код AS3:
        public var _state: uint = STATE_LOADING;
 
        public function get state(): uint
        {
            return _state;
        }
 
        public function set state(value: uint): void
        {
            Bind.masterSetter(instance, "_state", value);
        }
Сама бинд-утилита

Код AS3:
    import starling.events.Event;
    import starling.events.EventDispatcher;
 
    public class Bind
    {
        public static const VARIABLE_CHANGE_ENDING: String = "_changed";
 
        public function Bind()
        {
            if (Bind)
                throw new Error("Bind is abstract.");
        }
 
        public static function masterSetter(host: EventDispatcher, varName: String, value: Object): void
        {
            if (host[varName] == value)
                return;
 
            host[varName] = value;
            trace(varName, value);
            host.dispatchEvent(new Event(varName + VARIABLE_CHANGE_ENDING));
        }
 
        public static function bindSetter(setter: Function, host: EventDispatcher, varName: String): void
        {
            host.addEventListener(varName + VARIABLE_CHANGE_ENDING, setter);
        }
 
        public static function bindProperty(site: Object, varName: String, host: EventDispatcher, chain: String): void
        {
            host.addEventListener(chain + VARIABLE_CHANGE_ENDING, bindChanged);
 
            function bindChanged(e: Event): void
            {
                site[varName] = host[chain];
            }
 
        }
 
    }
Вызов ака во Flex
Код AS3:
Bind.bindSetter(stateChanged, StateManager.instance, "state");
Код AS3:
Bind.bindProperty(io, "dataProvider", model, dataProvider);
Известные проблемы:
для использования функции masterSetter(тм) пришлось делать переменные public. Думал, обойдется хотя бы internal, но не вышло. Хотя, в feathers автор рекомендует для разработчиков фреймворка не делать private - переменных чтобы можно было легче наследоваться от компонентов, все-таки у меня это вроде как главная проблема.

Удобства:
Ну вообщем-то вроде как толковая замена стандартному бинду флекса без всяких изысков на событиях старлинга, которые реально стоит использовать в противовес стандартным флэшовым событиям.

Варианты:
Может, попробовать сделать Bind не как класс, а как отдельные функции через include чтобы переменные были private? Либо есть вариант в каком-то фреймворке делать BindInt, BindString etc.


Последний раз редактировалось Psijic; 08.03.2014 в 20:58.
Создать новую тему   Часовой пояс GMT +4, время: 16:11.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
bind , Binding , MVC , Starling , связывание
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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