![]() |
|
||||||||||
|
|||||
|
AlexCooper,
Главная цель - максимальное уменьшение зависимостей в пользу лёгкой последующей модернизаций/обнавлений кода. Каждый класс должен выполнять строго отведённую ему область задач. Чем меньше он знает о том, что твориться вокруг него - тем лучше. Отлично, если он вообще не ведает что над ним и следовательно легко может быть заменен.
__________________
Дети не должны знать о своих родителях |
|
|||||
|
Модель, получив данные, парсит их. Видит, что есть новый не авторизованный пользователь - высылает событие NEW_USER. Отдельный под-контроллер, заранее подписанный на конкретно это событие, получает уведомление и производит необходимые действия.
До тех пор, пока контроллер не завершит обработку, новый юзер в модели числится как не авторизованный.
__________________
Дети не должны знать о своих родителях |
|
|||||
|
[+1 25.10.13]
[+4 18.03.14] |
На самом деле удобно иметь несколько контроллеров для вида, модели и глобальный для ядра.
В глобальном лучше размещать основные команды ядра. Контроллер вида обслуживает виджеты, а контроллер модели сервисы. Скелет вида, модели и контроллер команд, у меня естественно XML, ноды которого передаются в соответствующие конструкторы дисплей контейнеров вида , которые затем рендерятся виджетами. Соответственно вся иерархия в виде графа, который агрегатирован по parent id соответствующей xml ноды. Нода вида ... Нода Коллекция виджетов ..... Нода Коллекция команд и хэндлеров .... Нода Коллекция сервисов |
|
|||||
|
Цитата:
Пока написал вот это package { import flash.display.Sprite; import me.inpictures.Controller; import flash.events.Event; public class InPictures extends Sprite { public function InPictures() { addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event):void { removeEventListener(Event.ADDED_TO_STAGE, init); var controller:Controller = new Controller(stage,this); } } } package me.inpictures { import me.inpictures.worker.Framework; import me.inpictures.worker.app.Auth; import me.inpictures.worker.app.Registration; import me.inpictures.worker.amf.AMF import me.inpictures.data.User; import flash.events.Event; import flash.display.DisplayObjectContainer; import flash.display.Stage; import me.inpictures.worker.GetFlashVars; import me.inpictures.worker.api.SocialNetwork; public class Controller { private var _stage:Stage; private var _user:User; private var framework:Framework; private var _model:Model = new Model(); private var _viewer:Viewer = new Viewer(_model); private var _container:DisplayObjectContainer; public function Controller(stage:Stage, container:DisplayObjectContainer) { _stage = stage; _container = container; init(); } private function init():void { _container.addChild(_viewer); _model.addEventListener(Model.PAGE_UPDATE, pageUpdate); new AMF('http://dev.net/app/Amfphp/'); _user = new User(); framework = new Framework(); framework.addTask(new GetFlashVars(_stage,_user)); framework.addTask(new SocialNetwork(_user)); framework.addTask(new Auth(_user,_model)); framework.run(); } private function pageUpdate(e:Event):void { switch (_model.page ) { case Model.PAGE_REGISTRATION: new Registration(_user,_model).run(); break; } } } } package me.inpictures { import flash.events.Event; import flash.events.EventDispatcher; public class Model extends EventDispatcher { public static var UPDATE:String = 'update'; public static var PAGE_UPDATE:String = 'page_update'; public static var PAGE_REGISTRATION:String = 'page_registration'; private var _page:String = 'default'; public function Model() { } public function get page():String { return _page; } public function setPage(page:String):void { _page = page; dispatchEvent(new Event(PAGE_UPDATE)); } } } package me.inpictures { import flash.events.Event; import flash.display.Sprite; public class Viewer extends Sprite { private var _model:Model; public function Viewer(model:Model) { _model = model; _model.addEventListener(Model.UPDATE, update ); } private function update(e:Event):void { trace('>>>update'); } } } package me.inpictures.data { import flash.events.EventDispatcher; import flash.events.Event; public class User extends EventDispatcher { public static var NEW_USER:String = 'new_user'; private var _systemId:uint = 0; private var _uid:uint = 0; private var _network:String = 'unbrowse'; public function User() { _network = 'vk'; } public function get sid():uint { return _systemId; } public function get uid():uint { return _uid; } public function sign(data:*):Object { var send:Object = new Object(); if ( data is Object || data is Array) { var ind:String; for ( ind in data) { send[ind] = data[ind]; } send.sign = true; } else if (data is String) { send.string = data; } else send.sign = false; return send; } public function get simple():Object { var data:Object = new Object(); data.uid = uid; data.network = _network; return data; } public function setFlashVars(data:Object):void { if (!_uid) _uid = (data.viewer_id) ? uint(data.viewer_id) : 16580191; } public function auth(data:Object):void { _systemId = (_systemId) ? _systemId : uint(data.uid.sys); if (data.registration) dispatchEvent(new Event(User.NEW_USER)); for ( var i in data) { trace( i + " >> "+data[i]); for ( var ii in data[i]) { trace(' >> '+ii+' >> '+data[i][ii]); } }/***/ } public function get all():Object { var data:Object = new Object(); data.sys = _systemId; data.uid = uid; data.network = _network; data.first_name = _first_name; data.last_name = _last_name; data.sex = _sex; data.nickname = _nickname; data.photo = _photo; data.bday = _bday; data.city = _city_id; data.country = _country_id; return data; } public function socialAuth(data:Array):void { if (data.length && _uid == data[0].uid) { _nickname = data[0].first_name; _sex = data[0].sex-1; _realname = data[0].first_name+" "+data[0].last_name; _first_name = data[0].first_name; _last_name = data[0].last_name; if (data[0].bdate) { if (data[0].bdate.length>0) { var r = data[0].bdate.split("."); r[0] = (r[0]) ? r[0] : "1"; r[1] = (r[1]) ? r[1] : "1"; r[2] = (r[2]) ? r[2] : "1950"; r[0] = (r[0]<10) ? "0"+r[0] : r[0]; r[1] = (r[1]<10) ? "0"+r[1] : r[1]; _bday = r[2]+" "+r[1]+" "+r[0]; } else _bday = "1950 01 01"; } else _bday = "1950 01 01"; _photo = data[0].photo_big; _city_id = (data[0].city) ? data[0].city : 0; _country_id = (data[0].country) ? data[0].country : 0; } } private var _first_name:String = ''; private var _last_name:String = ''; private var _bday:String = ''; private var _nickname:String = ''; private var _sex:Number = 0; private var _realname:String = ''; private var _photo:String = ''; private var _city_id:uint = 0; private var _country_id:uint = 0; } } package me.inpictures.worker { import flash.display.Stage; import flash.events.Event; import me.inpictures.data.User; public class GetFlashVars extends Worker { public function GetFlashVars(stage:Stage, _user:User) { _user.setFlashVars(stage.loaderInfo.parameters as Object); dispatchEvent(new Event(Event.COMPLETE)); } } } package me.inpictures.worker.app { import flash.events.Event; import me.inpictures.Model; import me.inpictures.data.User; import me.inpictures.worker.Worker; import me.inpictures.worker.amf.AMF; public class Auth extends Worker { private var _user:User; private var _model:Model; public function Auth(user:User , model:Model) { _user = user; _model = model; if (!_user.hasEventListener(User.NEW_USER)) _user.addEventListener(User.NEW_USER, newUser ); } private function newUser(e:Event):void { _model.setPage(Model.PAGE_REGISTRATION); _user.removeEventListener(User.NEW_USER, newUser); } override public function run():void { AMF.call('User/auth', _user.auth, _user.simple ); dispatchEvent(new Event(Event.COMPLETE)); } } } package me.inpictures.worker.app { import me.inpictures.data.User; import me.inpictures.Model; import me.inpictures.worker.Worker; import me.inpictures.worker.amf.AMF; public class Registration extends Worker { private var _user:User; private var _model:Model; public function Registration(user:User , model:Model) { _user = user; _model = model; } override public function run():void { AMF.call('User/registration', _user.auth, _user.all ); } } }
__________________
return this... |
|
|||||
|
[+1 25.10.13]
[+4 18.03.14] |
Это всё красивые слова
В основе DI все равно фабричный подход. Сначала надо правильно создать ядро, а уже потом сделать нужные классы "слабосвязанными" за счет интерфейсов. Собственно для этого их и придумали. Добавлено через 17 минут Цитата:
Добавлено через 41 минуту Цитата:
|
|
|||||
|
Главный контроллер создает главный вьювер и главную модель приложения. И прослушивает модели на изменения.
В зависимости от изменения главной модели он создает "worker"-ы под-контроллеры в которые передает ссылку на модель которую они обрабатывают и ссылку на главную модель для изменения всего приложения. Воркеры меняют эти модели которые в свою очередь генерируют соответсвующие события. Ну и подписанные контроллеры или вьюверы начинают свою работу после изменения моделей.
__________________
return this... |
|
|||||
|
[+1 25.10.13]
[+4 18.03.14] |
Юзер у вас как то мимо данных проскакивает. От кого он получает измененные данные
|
|
|||||
|
Да, забыл уточнить, юзера заполняют воркеры, когда пользователь не зарегистрирован, в моделе пользователя срабатывает событие "регистрация" и тут уже в обход главной модели вызывается контроллер REG главным контроллером который слушает модель пользователь.
__________________
return this... Последний раз редактировалось AlexCooper; 21.07.2013 в 14:03. |
![]() |
![]() |
Часовой пояс GMT +4, время: 02:44. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|