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

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

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

Регистрация: Dec 2010
Сообщений: 177
По умолчанию Стиль реализации статического класса

Вариант 1:

Есть статик класс:

Код AS3:
public class Profile
{
	public function Profile(){	
	}
 
	public static function setVar(name:String, value:*):void
	{
		var sharedObject:SharedObject = SharedObject.getLocal(Constant.SHARED_OBJECT_NAME);
			sharedObject.data[name] = value;
			sharedObject.flush();
	}
 
	public static function getVar(name:String):*
	{
			var sharedObject:SharedObject = SharedObject.getLocal(Constant.SHARED_OBJECT_NAME);
			return sharedObject.data[name];
	}
 
	public static function clear():void
	{
			var sharedObject:SharedObject = SharedObject.getLocal(Constant.SHARED_OBJECT_NAME);
			sharedObject.clear();
	}}

Как видно getLocal() вызывается в каждой статической функции. Что, наверное тратит лишние производительные ресурсы.

Вариант 2: можно сделать статическую переменную static var sharedObject:SharedObject;
и один раз получить куки, а далее использовать ее во всех статик функциях.

Код AS3:
public static function init(name:String, value:*):void
{
	sharedObject:SharedObject = SharedObject.getLocal(Constant.SHARED_OBJECT_NAME);
 
}
Но при этом обязательно сначала надо будет вызвать init, а только потом уже остальные функции.


Вариант 3:
при объявлении статической переменной, сразу же ее инициализировать

Код AS3:
public class Profile
{
        sharedObject:SharedObject = SharedObject.getLocal(Constant.SHARED_OBJECT_NAME);
 
	public function Profile(){	
	}
        ...
}

Какой вариант правильнее всего выбрать?

Старый 23.03.2012, 15:53
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 2  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
Цитата:
Какой вариант правильнее всего выбрать?
Правильнее всего сделать методы в Profile не статическими, создавать один его экземпляр при старте приложения (в главном классе) и передавать его всем тем, кому он нужен. Соответственно, sharedObject передавать к конструктор.

Старый 23.03.2012, 16:33
dsQuadro вне форума Посмотреть профиль Отправить личное сообщение для dsQuadro Посетить домашнюю страницу dsQuadro Найти все сообщения от dsQuadro
  № 3  
Ответить с цитированием
dsQuadro
 
Аватар для dsQuadro

Регистрация: Feb 2008
Адрес: Москва
Сообщений: 238
Отправить сообщение для dsQuadro с помощью ICQ
может проще синглтон использовать?

Старый 23.03.2012, 16:34
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 4  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Синглтон?
Я бы сделал еще статический метод init(), в который передавал SharedObject.getLocal(Constant.SHARED_OBJECT_NAME).
__________________
тут я

Старый 23.03.2012, 17:41
carrotoff вне форума Посмотреть профиль Отправить личное сообщение для carrotoff Найти все сообщения от carrotoff
  № 5  
Ответить с цитированием
carrotoff
 
Аватар для carrotoff

Регистрация: May 2010
Сообщений: 543
Терпеть не могу статику. Мне кажется лучший вариант от maxkar.
Статику можно использовать исключительно в качестве хэлперов.
__________________
Вы грабите бедных людей. Парень со свирелью накажет вас. Хонгильдон (с)

Старый 23.03.2012, 17:45
dsQuadro вне форума Посмотреть профиль Отправить личное сообщение для dsQuadro Посетить домашнюю страницу dsQuadro Найти все сообщения от dsQuadro
  № 6  
Ответить с цитированием
dsQuadro
 
Аватар для dsQuadro

Регистрация: Feb 2008
Адрес: Москва
Сообщений: 238
Отправить сообщение для dsQuadro с помощью ICQ
Код AS3:
package
{
	public class Profile
	{
		private static var instance:Profile;
		private var sharedObject:SharedObject;
 
 
		public function Profile(privateClass:ProfileSingletone) 
		{
			sharedObject = SharedObject.getLocal(Constant.SHARED_OBJECT_NAME);
		}
 
		public static function getInstance():Profile{
			if (instance == null) {
				instance = new Settings(new ProfileSingletone);
			}
			return instance;
		}
 
		public function getVar(name:String):*
		{
			return sharedObject.data[name];
		}
		...
	}
}
 
class ProfileSingletone { };
в любом месте приложения вызываете
Код AS3:
Profile.getInstance()
и работаете как с обычным экземпляром класса


Последний раз редактировалось dsQuadro; 23.03.2012 в 17:50.
Старый 23.03.2012, 17:47
Alexmody вне форума Посмотреть профиль Отправить личное сообщение для Alexmody Найти все сообщения от Alexmody
  № 7  
Ответить с цитированием
Alexmody

Регистрация: Dec 2010
Сообщений: 177
maxkar
>>правильнее всего сделать методы в Profile не статическими, создавать один его экземпляр при старте >>приложения

Согласен, к этому и стараюсь идти, чтобы не плодить глобал переменные, но порой очень не удобно передавать экземпляр внутрь иерархической структуры классов.

КорДум

Я бы сделал еще статический метод init(), в который передавал SharedObject.getLocal(Constant.SHARED_OBJECT_NAME).

Не очень хорошо, когда в статик классе нельзя пользоваться другими статик функциями, пока не вызвать статик ф-ю init. В этом и изначальная загвоздка была.

dsQuadro
Замечательное решение к данной задаче:
- глобал доступ
- создание экземпляра идет не при запуске программы, а в том месте, где в первый раз воспользовались функцией, это супер!
- минимум статик функций
- появилась возможность только один раз вызвать ф-ю getLocal в конструкторе и передать SharedObject приватной переменной, которая далее используется в функциях класса.
- решилась проблема с первоочередностью вызова init - такую функцию вообще вырезаем.

Ага спасибо за пример , реализация заготовки синглтона у меня была:

Код AS3:
public class Profile
	{
		private static var _inst:Profile;
		private static var _allowInstantiation:Boolean = false;
 
		private var sharedObject:SharedObject; 
 
		public function Profile() 
		{
			if(!_allowInstantiation)
                            throw new Error("You can not created instance directly. This class uses Singelton pattern");
 
			sharedObject = SharedObject.getLocal(Constant.SHARED_OBJECT_NAME);
		}
 
		public static function get inst():Profile
		{
			if (!_inst)
			{
				_allowInstantiation = true;
				_inst = new Profile();
				_allowInstantiation = false;
			}
			return _inst;
		}
 
		public function setVar(name:String, value:*):void
		{
			sharedObject.data[name] = value;
			sharedObject.flush();
		}
 
		public function getVar(name:String):*
		{
			return sharedObject.data[name];
		}
 
		public function clear():void
		{
			sharedObject.clear();
		}
 
                //...
}


Последний раз редактировалось Alexmody; 23.03.2012 в 17:51.
Старый 23.03.2012, 18:00
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 8  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
Цитата:
Согласен, к этому и стараюсь идти, чтобы не плодить глобал переменные, но порой очень не удобно передавать экземпляр внутрь иерархической структуры классов.
По иерархии наследования (в конструктор родителя) или по экземплярам (через конструкторы "дочерних"/вложенных) объектов перечада идет? В обоих случаях это может свидетельствовать о том, что где-то не до конца вынесены зависимости. Т.е. если есть класс A, который в конструкторе получает ссылку на Profile только для того, чтобы передать ее конструктору классу Б, значит, вероятно, конструктор класса А должен получать экземпляр класса Б, а не создавать его. Вся программа при инициализации собирается "снизу вверх", т.е. "примитивные" классы, классы "более высокого" уровня и т.п. Это устраняет большую часть проблемы, так как не нужно передавать параметры своим зависимостям.

Исключением является "крупномодульное" взаимодействие (плагины и т.п., получающие набор классов среды выполнения). Но там подобная передача ограничивается тем же одним уровнем, код внутри плагина точно так же собирается "от меньшего к большему". Так что "далеких" передач объектов нигде нет, есть только последовательность создания модуля/приложения. При использовании inversion-of-control контейнера там не линейная, а древовидная схема получается, но это не принципиально.

Старый 23.03.2012, 18:04
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 9  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Цитата:
Не очень хорошо, когда в статик классе нельзя пользоваться другими статик функциями, пока не вызвать статик ф-ю init. В этом и изначальная загвоздка была.
Смотря где.
У flashdynamix есть в утилитах SWFProfiler со статическим методом init(), который принимает ссылку на stage.
Ну и я делал как-то похожее.

Синглтон, в общем, нужен.
__________________
тут я

Старый 23.03.2012, 22:38
Alexmody вне форума Посмотреть профиль Отправить личное сообщение для Alexmody Найти все сообщения от Alexmody
  № 10  
Ответить с цитированием
Alexmody

Регистрация: Dec 2010
Сообщений: 177
maxkar
>>что где-то не до конца вынесены зависимости
Для снижения связей и зависимостей между классами в древовидной иерархии, я стараюсь максимально применить композицию построенную на ее принципе и интерфейсах. Тем не менее, никогда не задумывался и не придерживался правилу "Вся программа при инициализации собирается "снизу вверх"". Как только узнаешь это правило, тут же всплывают все приемущества такого подхода, при том что я очень люблю композицию. Спасибо за совет, буду больше думать об этом!
Действительно, если упрощенно говорить, то передача класса по дочерним классам, может быть выстроена почти на одном уровне вложенности.

Кстати, посоветуйте какие книжки можно почитать по архетиктуре ПО? Т.е. к примеру по паттернам проектирования материал читаю, также стараюсь использовать правила SOLID и пр.


Последний раз редактировалось Alexmody; 24.03.2012 в 10:20.
Создать новую тему Ответ Часовой пояс GMT +4, время: 14:41.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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