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

Вернуться   Форум Flasher.ru > Блоги > Lecosson

Оценить эту запись

Класс настроек в ActionScript 3

Запись от Lecosson размещена 19.07.2010 в 00:00

Прошу не судить строго, во флеше я начинающий, но надеюсь, что кому-нибудь моя писанина пригодится.
Частенько при разработке наFlash программисту нужно хранить данные и настройки во время сеанса исполнения программы. Предлагаю класс на AS3, используется в качестве саморасширяемого хранилища и наследуется от flash.utils.Proxy. У него есть особенность, которую нельзя реализовать штатными возможностями Flash/ActionScript – он может перехватывать обращения к несуществующим методам и свойствам объекта.
Вот как мог бы выглядеть такой класс на языке AS3:
Код AS3:
package 
{
	import flash.utils.Proxy;
	import flash.utils.flash_proxy;
	import flash.display.Sprite;
	import flash.events.Event;
 
	dynamic public class Config extends Proxy
	{
		// СВОЙСТВА
		private static var _singletone_exist:Boolean=false;
		private static var _root_object:Sprite=null;
		private static var _properties:Object=new Object();
		// ПРЕДОПРЕДЕЛЕННЫЕ ПАРАМЕТРЫ
		public const text1:String="example text 1";
		// КОНСТРУКТОР
		public function Config(rootObject:Sprite=null)
		{
			super();
			if (!_singletone_exist)
			{
				_singletone_exist=true; 
				_root_object=rootObject;
				_root_object.dispatchEvent(new Event("conf_ok", true));
			};
		}
		// МЕТОДЫ Proxy-хранилища
		override flash_proxy function getProperty(name:*):*
		{ 
			return (name in _properties) ? (_properties[name]) : ('Свойство "' + name + '" не существует!');
		}
 
		override flash_proxy function setProperty(name:*, value:*):void
		{ 
			_properties[name]=value;
		}
	}
}
Давайте разберем этот пример. Для начала – строки импорта классов. С Proxy и flash_proxy все понятно, так как мы наследуемся от Proxy, но зачем понадобился спрайт и события? Все просто. В конструкторе класса происходит отправка события, а класс Proxy на это не способен. Поэтому при создании первого экземпляра нашего класса Config в качестве параметра мы передадим ему Root нашего флэш-приложения, который будет заниматься генерацией событий. Первое событие создается уже в конструкторе и оповещает приложение о том, что создание нашего экземпляра класса настроек завершено.
В теле класса определяются несколько статических переменных. Это означает, что существует всего один их экземпляр, который используется всеми объектами данного класса. Например, в переменной _singletone_exist у меня хранится информация о том, был ли экземпляр данного класса создан раньше. Это позволяет создать подобие Singleton. В переменной _root_object хранится ссылка на Root флэш-ролика, переданный в конструктор первого экземпляра Config. И, наконец, в массиве (вернее, динамическом объекте) _properties хранятся все данные, которые мы захотим поместить в наше хранилище.
Настоящая магия начинается при переопределении функций getProperty и setProperty. Встретившись с обращением к незнакомому свойству класса, Proxy передаст в эти функции параметры обращения (начиная с имени свойства). Вот как выглядит использование данного класса на практике:
Код AS3:
config = new Config(root); //параметр нужен только при первом вызове
trace (config.text1); //example text 1
trace (config.text2); //Свойство "text2" не существует!
config.text2='12345';
trace (config.text2); //12345
Данный пример предельно упрощен. На практике в него следут многое добавить. Вам понадобятся события, сообщающие об ошибках инициализации, подгрузка параметров из файла или с сервера, а со временем – использование Bindable-данных, чтобы не возиться с обновлением экрана при изменении одной переменной в Config.
Всего комментариев 10

Комментарии

Старый 22.07.2010 11:59 etc вне форума
etc
 
Аватар для etc
А кто вас научил в именах переменных подчеркивания использовать?
Старый 22.07.2010 12:52 chingachgoog вне форума
chingachgoog
 
Аватар для chingachgoog
Настоящая магия была у __resolve, а это подобие настоящей магии.
Старый 23.07.2010 13:27 Lecosson вне форума
Lecosson
Etc, это просто моя манера помечать приватные поля. Когда привыкаешь к одному способу именования, потом проще работать. Хотя, если человек с опытом рекомендует иное, постараюсь прислушаться.
Старый 23.07.2010 13:29 Lecosson вне форума
Lecosson
Чингачгук, спасибо за наводку. Не знал.
Выходит, я соврал насчет "не реализуется штатными средствами". Блин.
Обновил(-а) Lecosson 23.07.2010 в 13:32
Старый 23.07.2010 14:15 incvizitor вне форума
incvizitor
 
Аватар для incvizitor
etc, а Вы как приватные свойства помечаете? Просто я тоже подчеркиваю приват и протектед.
Старый 23.07.2010 14:32 Волгоградец вне форума
Волгоградец
 
Аватар для Волгоградец
Думаю _etc имел ввиду подчеркивание между словами. И __resolve - это из старенького - в AS3.0 нет такого слова.
Старый 23.07.2010 14:43 etc вне форума
etc
 
Аватар для etc
Я имел ввиду между словами.
Старый 24.07.2010 21:01 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Мне что то совсем не нравится идея заставлять root генерировать события. EventDispatcher`а хватит за глаза, хотя я бы лучше реализовал IEventDispatcher.
Старый 25.07.2010 11:14 dimarik вне форума
dimarik
 
Аватар для dimarik
В конструкторе нет проверки на существование аргумента "rootObject". И тут же делается диспатч от его имени.
Старый 27.07.2010 12:21 terbooter вне форума
terbooter
А я на PHP переменные обзываю с подчеркиваниями между словами.
а на AS кэмэл стайл.
Пытаюсь на PHP обзывать так же.
 
Последние записи от Lecosson

 


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


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