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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 20.07.2013, 16:36
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 11  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
AlexCooper,
Главная цель - максимальное уменьшение зависимостей в пользу лёгкой последующей модернизаций/обнавлений кода. Каждый класс должен выполнять строго отведённую ему область задач. Чем меньше он знает о том, что твориться вокруг него - тем лучше. Отлично, если он вообще не ведает что над ним и следовательно легко может быть заменен.
__________________
Дети не должны знать о своих родителях

Старый 20.07.2013, 16:38
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 12  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
В таком случае как бы Вы видоизменили мой код?
__________________
return this...

Старый 20.07.2013, 16:44
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 13  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Модель, получив данные, парсит их. Видит, что есть новый не авторизованный пользователь - высылает событие NEW_USER. Отдельный под-контроллер, заранее подписанный на конкретно это событие, получает уведомление и производит необходимые действия.

До тех пор, пока контроллер не завершит обработку, новый юзер в модели числится как не авторизованный.
__________________
Дети не должны знать о своих родителях

Старый 20.07.2013, 16:48
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 14  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Благодарю
__________________
return this...

Старый 20.07.2013, 20:24
Babylon вне форума Посмотреть профиль Отправить личное сообщение для Babylon Посетить домашнюю страницу Babylon Найти все сообщения от Babylon
  № 15  
Ответить с цитированием
Babylon
[+1 25.10.13]
[+4 18.03.14]
 
Аватар для Babylon

Регистрация: Jan 2006
Адрес: Москва, Зеленоград
Сообщений: 653
Отправить сообщение для Babylon с помощью ICQ
На самом деле удобно иметь несколько контроллеров для вида, модели и глобальный для ядра.
В глобальном лучше размещать основные команды ядра. Контроллер вида обслуживает виджеты,
а контроллер модели сервисы. Скелет вида, модели и контроллер команд, у меня естественно XML, ноды которого передаются в соответствующие конструкторы дисплей контейнеров вида , которые затем рендерятся виджетами. Соответственно вся иерархия в виде графа, который агрегатирован по parent id соответствующей xml ноды.



Нода вида
...
Нода Коллекция виджетов

.....

Нода Коллекция команд и хэндлеров
....
Нода Коллекция сервисов

Старый 20.07.2013, 23:20
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 16  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Цитата:
Сообщение от Babylon Посмотреть сообщение
На самом деле удобно иметь несколько контроллеров для вида, модели и глобальный для ядра.
В глобальном лучше размещать основные команды ядра. Контроллер вида обслуживает виджеты,
а контроллер модели сервисы. Скелет вида, модели и контроллер команд, у меня естественно XML, ноды которого передаются в соответствующие конструкторы дисплей контейнеров вида , которые затем рендерятся виджетами. Соответственно вся иерархия в виде графа, который агрегатирован по parent id соответствующей xml ноды.



Нода вида
...
Нода Коллекция виджетов

.....

Нода Коллекция команд и хэндлеров
....
Нода Коллекция сервисов
Имеется ввиду что вся структура программы генерируется на основании подгружаемого XML? Если да, для меня пока это будет сложно повторить но про перспективы возможности можно только догадываться )

Пока написал вот это
Код AS3:
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);
		}
	}
}
Controller - главный контроллер
Код AS3:
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;
			}
		}
	}
}
Model - главная модель
Код AS3:
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));
		}
	}
}
Viewer - главный вьювер ( пока не используется, работаю пока только с данными)
Код AS3:
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');
		}
	}	
}
User - модель пользователь ( черновая версия )
Код AS3:
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;
 
	}
}
"Внутренние" контроллеры
Код AS3:
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));
		}
	}	
}
Код AS3:
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));
		}
	}
}
Код AS3:
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...

Старый 21.07.2013, 04:56
Babylon вне форума Посмотреть профиль Отправить личное сообщение для Babylon Посетить домашнюю страницу Babylon Найти все сообщения от Babylon
  № 17  
Ответить с цитированием
Babylon
[+1 25.10.13]
[+4 18.03.14]
 
Аватар для Babylon

Регистрация: Jan 2006
Адрес: Москва, Зеленоград
Сообщений: 653
Отправить сообщение для Babylon с помощью ICQ
Это всё красивые слова
В основе DI все равно фабричный подход.
Сначала надо правильно создать ядро, а уже потом сделать нужные классы "слабосвязанными" за счет интерфейсов. Собственно для этого их и придумали.

Добавлено через 17 минут
Цитата:
Имеется ввиду что вся структура программы генерируется на основании подгружаемого XML? Если да, для меня пока это будет сложно повторить но про перспективы возможности можно только догадываться )
Это все в рантайме. Поэтому структура программы не может генерироваться.

Добавлено через 41 минуту
Цитата:
Подправьте если ушел не в ту степь
Степь, да степь кругом. Прежде чем показывать свой НИКОМУ [кроме Вас] ненужный код неплохо бы на словах описать архитектуру и картинку нарисовать. Шучу я.

Старый 21.07.2013, 12:43
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 18  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Главный контроллер создает главный вьювер и главную модель приложения. И прослушивает модели на изменения.
В зависимости от изменения главной модели он создает "worker"-ы под-контроллеры в которые передает ссылку на модель которую они обрабатывают и ссылку на главную модель для изменения всего приложения. Воркеры меняют эти модели которые в свою очередь генерируют соответсвующие события. Ну и подписанные контроллеры или вьюверы начинают свою работу после изменения моделей.
Миниатюры
Нажмите на изображение для увеличения
Название: www.JPG
Просмотров: 26
Размер:	43.5 Кб
ID:	29831  
__________________
return this...

Старый 21.07.2013, 13:14
Babylon вне форума Посмотреть профиль Отправить личное сообщение для Babylon Посетить домашнюю страницу Babylon Найти все сообщения от Babylon
  № 19  
Ответить с цитированием
Babylon
[+1 25.10.13]
[+4 18.03.14]
 
Аватар для Babylon

Регистрация: Jan 2006
Адрес: Москва, Зеленоград
Сообщений: 653
Отправить сообщение для Babylon с помощью ICQ
Юзер у вас как то мимо данных проскакивает. От кого он получает измененные данные

Старый 21.07.2013, 13:24
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 20  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Да, забыл уточнить, юзера заполняют воркеры, когда пользователь не зарегистрирован, в моделе пользователя срабатывает событие "регистрация" и тут уже в обход главной модели вызывается контроллер REG главным контроллером который слушает модель пользователь.
__________________
return this...


Последний раз редактировалось AlexCooper; 21.07.2013 в 14:03.
Создать новую тему Ответ Часовой пояс GMT +4, время: 22:52.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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