Добрый вечер. Решил попытаться приобщиться на этом форуме к 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.