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

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

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

Singleton и с чем его едят.

Запись от drnet_ua размещена 20.12.2010 в 14:08

Теория:

Последнее время на форуме часто спрашивают, что это такое, как и зачем.

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

Спросим у вики, что она думает по этому поводу:

Цитата:
... the singleton pattern is a design pattern used to implement the mathematical concept of a singleton, by restricting the instantiation of a class to one object.
т.е. в оригинале синглтон, это такой класс, который ограничивает количество своих экземпляров одним.

Одним из подвидов данного типа классов является UtilityClass, основным отличием которого
является наличие кучи независимых функций, например Math, т.е. просто набор функций зависящих только от аргумента.

Вспомним, как просто с ними работать – Math.random(). Где угодно, когда угодно… мне нравится, а вам?

А что если это будет что-то более функциональное?

Самыми интересными для нас свойствами синглтона являются:

1) гарантированно единственный экземпляр
2) возможность доступа к нему отовсюду, откуда нам хочется

Подготовимся:

Создадим самый обычный класс, с некоторой функциональностью:

Код AS3:
package  
{
	import flash.events.*;
	import flash.utils.*;
	/**
	 * ...
	 * @author drnet_ua
	 */
	public class SimpleClass extends EventDispatcher
	{
 
		private var currentNumber:Number;
		private var _lastPrime:Number;
		private var progressTimer:Timer;
 
		public function get lastPrime():Number {
			return _lastPrime;
		}
 
		public static function isPrime(a:Number):Boolean {
			var multiplier:Number = 2;
			var numberIsPrime:Boolean = true;
 
			while (numberIsPrime && ( multiplier <= (a / multiplier))) {
 
				if ((a % multiplier) == 0) {
					numberIsPrime = false
				} else {
					multiplier++;
				}
 
			}
			return numberIsPrime;
		}
 
		private function onTimerHandler(e:TimerEvent):void {
 
			currentNumber++;
 
			while (!isPrime(currentNumber)) {
				currentNumber++;	
			}
 
				_lastPrime = currentNumber;
				this.dispatchEvent(new Event('NEW_PRIME'));						
 
 
		}
 
		public function StartCalculations(startNumber:Number = 1):void {
			currentNumber = startNumber;			
			progressTimer = new Timer(1000, 0);
			progressTimer.addEventListener(TimerEvent.TIMER, onTimerHandler);
			progressTimer.start();
		}
 
		public function SimpleClass() 
		{
 
		}		
	}
}
Что тут происходит?

После создания класса, посредствам вызова функции StartCalculations() , начиная со стартового числа startNumber каждую секунду экземпляр класса, находит следующее простое число и генерирует событие “NEW_PRIME”.
Используя это событие, мы можем получить это простое число.

Тест:

Код AS3:
private function traceActivity(e:Event):void {
			trace(e.target.lastPrime);
		}
 
...
 
var a:SimpleClass = new SimpleClass();
a.addEventListener('NEW_PRIME', traceActivity);
a.StartCalculations(1);
результат:

Цитата:
[Starting debug session with FDB]
[SWF] F:\singleton\bin\singleton.swf - 2 761 bytes after decompression.
2
3
5
7
11
13
17
19
Магия начинается: Превратим этот, живущий своей жизнью класс в синглтон.

Ограничение на создание экземпляров

Так как мы не будем явно создавать экземпляр нашего класса, то всё доступное из вне, должно быть статик функциями и статик полями. Несмотря ни на что, один экземпляр все же должен существовать, пишем:

Код AS3:
private static var _instance:SimpleSinglton;
Введем флаг, запрещающий создание нашего класса без нашего разрешения:

Код AS3:
private static var allowConstructor:Boolean;
перепишем конструктор:

Код AS3:
	public function SimpleSinglton() 
		{
			if (!allowConstructor) {			
				throw(new Error('Class cannot be instansiated'));
			}
 
		}
Теперь создать наш класс не может никто. Но нам-то можно?

Для доступа к единственному экземпляру нашего класса(_instance) напишем статический геттер, он же будет разрешать создание класса для нас, и запрещать всем остальным:

Код AS3:
	private static get instance():SimpleSinglton {
			if (_instance == null) {
				allowConstructor = true;
				_instance = new SimpleSinglton();
				allowConstructor = false;
			}
 
			return _instance;
		}
Как это работает?

Если нас еще не создавали – разрешим это сделать. И на будущее – запретим.

Таким образом у нас будет только один экземпляр, и создаст он сам себя при первом вызове функции instance.

А зачем нам эта функция?? Для доступа к функционалу класса!

Так как доступа к НЕ СТАТИЧЕСКИМ методам класса у нас нет, создадим статические функции-прокси:

Для красоты переименуем нашу не статичную функцию StartCalculations в _StartCalculations, и напишем такое:

Код AS3:
public static function StartCalculations(startNumber:Number):void {
			instance._StartCalculations(startNumber);
		}
Далее надо добавить возможность добавления/удаления слушателей:

Код AS3:
                public static function addPrimeListener(targetFunction:Function):void {
			instance.addEventListener('NEW_PRIME', targetFunction);
		}
 
		public static function removePrimeListener(targetFunction:Function):void {
			instance.removeEventListener('NEW_PRIME', targetFunction);
		}
Вот и все!

Как этим теперь пользоваться?

Код AS3:
SimpleSinglton.addPrimeListener(traceActivity);
SimpleSinglton.StartCalculations(10);
Цитата:
[SWF] F:\singleton\bin\singleton.swf - 3 589 bytes after decompression.
11
13
17
19
Удачи!

полный листинг того что у нас получилось:

Код AS3:
package  
{
	import flash.events.*;
	import flash.utils.*;
	/**
	 * ...
	 * @author drnet_ua
	 */
	public class SimpleSinglton extends EventDispatcher
	{
 
		private static var _instance:SimpleSinglton;
		private static var allowConstructor:Boolean;
 
		private var currentNumber:Number;
		private var _lastPrime:Number;
		private var progressTimer:Timer;
 
		private static function get instance():SimpleSinglton {
			if (_instance == null) {
				allowConstructor = true;
				_instance = new SimpleSinglton();
			}
 
			return _instance;
		}
 
		public function get lastPrime():Number {
			return _lastPrime;
		}
 
		public static function isPrime(a:Number):Boolean {
			var multiplier:Number = 2;
			var numberIsPrime:Boolean = true;
 
			while (numberIsPrime && ( multiplier <= (a / multiplier))) {
 
				if ((a % multiplier) == 0) {
					numberIsPrime = false
				} else {
					multiplier++;
				}
 
			}
			return numberIsPrime;
		}
 
		private function onTimerHandler(e:TimerEvent):void {
 
			currentNumber++;
 
			while (!isPrime(currentNumber)) {
				currentNumber++;	
			}
 
				_lastPrime = currentNumber;
				this.dispatchEvent(new Event('NEW_PRIME'));					
 
 
		}
 
		public function _StartCalculations(startNumber:Number):void {
			currentNumber = startNumber;			
			progressTimer = new Timer(1000, 0);
			progressTimer.addEventListener(TimerEvent.TIMER, onTimerHandler);
			progressTimer.start();
		}
 
		public static function StartCalculations(startNumber:Number):void {
			instance._StartCalculations(startNumber);
		}
 
		public static function addPrimeListener(targetFunction:Function):void {
			instance.addEventListener('NEW_PRIME', targetFunction);
		}
 
		public static function removePrimeListener(targetFunction:Function):void {
			instance.removeEventListener('NEW_PRIME', targetFunction);
		}
 
		public function SimpleSinglton() 
		{
			if (!allowConstructor) {			
				throw(new Error('Class cannot be instansiated'));
			}
 
		}		
	}
}
Всего комментариев 37

Комментарии

Старый 20.12.2010 14:55 gloomyBrain вне форума
gloomyBrain
 
Аватар для gloomyBrain
Цитата:
синглтон, это такой класс, который ограничивает количество своих экземпляров одним.

Одним из подвидов данного типа классов является UtilityClass, основным отличием которого
является наличие кучи независимых функций, например Math
У класса Math методы статические. С чего Вы решили, что Math - это синглтон? Неужто у Вас вышло получить ссылку на экземпляр? =)

И по поводу статических addEventLstener - я бы сделал статический диспатчер и вешал листенеры ему, а не экземпляру синглтона.
Обновил(-а) gloomyBrain 20.12.2010 в 14:57
Старый 20.12.2010 15:03 drnet_ua вне форума
drnet_ua
 
Аватар для drnet_ua
Math насколько я понимаю это Utility Class

несколько попутался в терминологии

нельзя получить ссылку на Math, т.к. у него нет конструктора

мне важен результат в итоге - я имею доступ к классу, который что-то делает сам по себе, а не просто набору функций.

откуда угодно, когда угодно и тд.

в случае с тицианом - туда уходит работа с его СмартФоксом.
Обновил(-а) drnet_ua 20.12.2010 в 15:16
Старый 20.12.2010 15:06 drnet_ua вне форума
drnet_ua
 
Аватар для drnet_ua
тициана забанили я ему сообщения отправить не могу.
поэтому с утра за 45 минут написал "на коленке".

да. там есть несколько нюансов которые я бы тоже сделал по другому.

текст не претендует на оскара, это скорее пример как можно сделать, но нужно-ли именно так - это на усмотрение читателя
Старый 20.12.2010 15:28 gloomyBrain вне форума
gloomyBrain
 
Аватар для gloomyBrain
Цитата:
откуда угодно, когда угодно и тд
В таком случае необходимости в синглтоне нет. Можно просто сделать класс, у которого все методы static

Цитата:
это скорее пример как можно сделать
Так написали бы хороший пример тогда.
Старый 20.12.2010 15:38 dimarik вне форума
dimarik
 
Аватар для dimarik
Здесь тема SingletonsAreEvil раскрыта более полно.
А Вики верно упоминает о единственном назначении шаблона Одиночки: существовать объект должен в единственном экземпляре. Все остальное - неверное толкование этого паттерна.
Старый 20.12.2010 15:50 drnet_ua вне форума
drnet_ua
 
Аватар для drnet_ua
Цитата:
В таком случае необходимости в синглтоне нет. Можно просто сделать класс, у которого все методы static
согласен, тогда я в растерянности в таком виде синглтон действительно не нужен

Цитата:
Здесь тема SingletonsAreEvil раскрыта более полно.
от туда:

Код AS3:
... Singletons usually are used to provide a single point of access to a global service. ...
My little world is about to change.

Ok. It's evil pattern.

Попробую обойтись без них в течении года
Старый 20.12.2010 16:07 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
"Глобальная точка управления" - это как большая красная кнопка в штаб квартире. Маленький разгром в квартире - и вся страна под угрозой.
Старый 20.12.2010 16:31 drnet_ua вне форума
drnet_ua
 
Аватар для drnet_ua
Цитата:
"Глобальная точка управления" - это как большая красная кнопка в штаб квартире. Маленький разгром в квартире - и вся страна под угрозой.
да. я это уже понял

Это обсуждалось некоторое время назад. Именно в разрезе замены _root
Старый 20.12.2010 16:33 drnet_ua вне форума
drnet_ua
 
Аватар для drnet_ua
а если так:

Код AS3:
package  
{
	import flash.events.*;
	import flash.utils.*;
	/**
	 * ...
	 * @author drnet_ua
	 */
	public class SimpleStatic
	{
		public static const NEW_PRIME:String = 'NEW_PRIME';
 
		private static var eventManager:EventDispatcher;
		private static var currentNumber:Number = 1;
		private static var lastPrimeNumber:Number = 1;
		private static var incrementTimer:Timer;
 
		public static function get eventDispatcher():EventDispatcher {
			if (eventManager == null) {
					eventManager = new EventDispatcher();
				}
			return eventManager;	
		}
 
		public static function get getLastPrime():Number {
			return lastPrimeNumber;
		}
 
		public static function isPrime(a:Number):Boolean {
			var multiplier:Number = 2;
			var numberIsPrime:Boolean = true;
 
			while (numberIsPrime && ( multiplier <= (a / multiplier))) {
 
				if ((a % multiplier) == 0) {
					numberIsPrime = false
				} else {
					multiplier++;
				}
 
			}
			return numberIsPrime;
		}
 
		private static function onTimerHandler(e:TimerEvent):void {
 
			currentNumber++;
 
			while (!isPrime(currentNumber)) {
				currentNumber++;	
			}
 
				lastPrimeNumber = currentNumber;				
 
				eventDispatcher.dispatchEvent(new Event(NEW_PRIME));
		}
 
		public static function start(startNumber:Number = 1, delay:Number = 1000):void {
			currentNumber = startNumber;
			incrementTimer = new Timer(delay, 0);
			incrementTimer.addEventListener(TimerEvent.TIMER, onTimerHandler);
			incrementTimer.start();			
		}
 
		public static function stop():void {
			if (incrementTimer != null) {
				incrementTimer.stop();
			}				
		}
 
	}
 
}
Старый 20.12.2010 20:42 Dukobpa3 вне форума
Dukobpa3
 
Аватар для Dukobpa3
Хз. Я синглтон ни разу не юзал но насколько я понимаю его предназначение это должно быть или что-то типа хинт-манагера о котором писалось пару постов назад в блогах. Или же какой-то игровой мир на который надо ссылаться из всех игровых объектов (хотя в случае с игровым миром я тоже не совсем согласен, ибо там можно обойтись вариантом добавления игровых объектов в мир и управления оттуда. Т.е. можно обойтись опять же без синглтона).

А текущий пример это пример неправильно организованного статик-класса. При чем именно в этом конкретном случае (если нам надо просто выдавать ряд простых чисел) гораздо проще было бы сделать именно статик. И текста в коде было бы меньше, и обращение проще, незачем инстанциировать чтоб получить ссылку.
Старый 20.12.2010 21:44 dimarik вне форума
dimarik
 
Аватар для dimarik
Цитата:
"Глобальная точка управления" - это как большая красная кнопка в штаб квартире. Маленький разгром в квартире - и вся страна под угрозой.
Отличная аналогия!

Повторюсь. Пожалуйста, применяйте шаблон Одиночки (Singleton) именно там, где он нужен.

Он прост. Его осваивает большинство изучающих ОО проектирование новичков. Продолжайте работать над более сложными шаблонами.
Старый 21.12.2010 00:52 Mur4ik вне форума
Mur4ik
Цитата:
Пожалуйста, применяйте шаблон Одиночки (Singleton) именно там, где он нужен.
Основная проблема как раз в том что Огромная масса народа пишет/считает синглтоны злом, и мало кто говорит где же все же их уместно использовать.

И лично я ничего злого не вижу использовании одиночек, как бы они не использовались.
Человек может и класс со всеми статическими методами написать и так же безграмотно использовать его по всему коду, разница не велика.
Старый 21.12.2010 01:14 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Куча статиков - это те же яйца, только в профиль. И тот, и другой делаются для создания глобального доступа, хотя для синглтона это побочный эффект, который я, кстати, пытаюсь убирать по мере возможности.
Люди привыкли к _root`у и всему такому, вот они и рвуться к синглтону. Не потому что им четко один экземпляр нужен, а потому что привязку хотят жесткую.
Я, если честно, вообще слабо представляю ситуацию в которой синглтон жизненно необходим. А сделать лишать себя случайной радости от бага, при котором у меня "большой" контроллер случайно раздвояйца и всё продолжает невозмутимо работать - не хочу. Тешит эго, какое всё у меня независимое =)
Старый 21.12.2010 01:29 Mur4ik вне форума
Mur4ik
Тут у каждого свое мнение
Еще ни в одном хливаре не видел веских доводов "за" и "против".
Где то читал что сложно тестируется такой код, но я до TDD еще не дорос.
Старый 21.12.2010 01:31 iNils вне форума
iNils
 
Аватар для iNils
Никогда не видел ничего плохого в синглтоне.
Старый 21.12.2010 10:36 drnet_ua вне форума
drnet_ua
 
Аватар для drnet_ua
ок. давайте тогда немного по другому посмотрим на это.
Пример с вычислением простых чисел - такой пример

Из тех кто не считает одиночку злом, или не большим злом - пример в котором его можно было-бы применить?

Я вижу для него только три случая:
1) замена _рута, т.е. глобальный контейнер, в котором живут разные части интерфейса/логики.
вот через него они и общаются
2) подвид случая п.1 - например это клиент осуществляющий коммуникацию с сервером.
все кому от сервера что-то нужно - подписываются на события, которые он генерит в ассортименте
3) глобальный менеджер загрузки.
к примеру врап вокруг балк лоадера

ваши варианты?
Старый 21.12.2010 12:36 GBee вне форума
GBee
 
Аватар для GBee
Я храню в синглтоне данные, которые постоянно нужны в разных частях программы. Это у меня после пробы Каингорма осталось. Злом считаю кол-во синглтонов в проге больше 1.

По коду allowConstructor по идее лишняя, для проверок на уникальность достаточно _instance использовать
Старый 21.12.2010 15:08 Ivanaka вне форума
Ivanaka
 
Аватар для Ivanaka
GBee, а почему нельзя (или можно?) хранить эти данные в стат классе? Какие плюсы-минусы и польза именно от синглтона?
Старый 21.12.2010 15:18 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Цитата:
1) замена _рута, т.е. глобальный контейнер, в котором живут разные части интерфейса/логики.
вот через него они и общаются
Сейчас замечательная аналогия всплыла в голове. Из коктейлей я больше всего люблю слоёные шоты (вроде Б-52), да так, чтобы верхушка горела и было красиво.
Шейкеры не горят, а вкус коктейлей оттуда не столь интересный.

Цитата:
2) подвид случая п.1 - например это клиент осуществляющий коммуникацию с сервером.
все кому от сервера что-то нужно - подписываются на события, которые он генерит в ассортименте
Всё таки считаю что ненужно всем подряд знать о сервере. Например, организуя модульную программу - где основная флешка будет сервер иметь, а загрузочные пользоваться вовсю соединением - синглтончик уходит далеко и надолго. Передавать инстанс и говорить - "инстанциировано?".
Цитата:
3) глобальный менеджер загрузки.
к примеру врап вокруг балк лоадера
Менеджеров может быть несколько. Менеджер текстур итемов рюкзака и менеджер текстур внешнего мира. Я бы их не взбалтывал.
Старый 21.12.2010 17:02 Vilya21 вне форума
Vilya21
Хм, такие классы как модель, фабрика звуков, другие фабрики - у меня все синглтоны, так логичней. Я считаю для многих вещей хороша жёсткая привязка.
Старый 21.12.2010 17:13 GBee вне форума
GBee
 
Аватар для GBee
Ivanaka, не знаю. Привык, что статичное, это что-то "прочное" :о) и не должно особо меняться. Да и статик везде писать лень. Кроме того на синглтон можно переменную ссылку с коротким названием прописать и юзать, а на статичный класс ОгромноеНазваниеСтатКласса.юзеры?
Старый 21.12.2010 20:22 Rzer вне форума
Rzer
 
Аватар для Rzer
2GBee Кто тебе сказал, что на класс нельзя ссылку сделать?
Код AS3:
var my:* = Math;
trace(my.random());
И кто тебя заставляет давать своим статическим классам длинные имена. + вот это вызвать легче?

Код AS3:
var math:Math = Math.getInstance();
trace(math.random());
Не пишите синглтонами. На крайний случай напишите статический класс с именем "O" и напихайте туда ссылки на обычные классы, и примите на веру, что они единственные.
Обновил(-а) Rzer 21.12.2010 в 20:44
Старый 21.12.2010 21:13 iNils вне форума
iNils
 
Аватар для iNils
Цитата:
а почему нельзя (или можно?) хранить эти данные в стат классе? Какие плюсы-минусы и польза именно от синглтона?
А почему нельзя хранить эти данные в синглтоне?
Старый 22.12.2010 11:29 Diestro вне форума
Diestro
 
Аватар для Diestro
Чем меньше классы знают друг о друге - тем лучше. Есть возможность их использовать повторно в других приложениях и проектах. Если в проекте есть синглтон о нем как правило знают очень много классов. У приложения появляется высокая связанность, что нехорошо. Синглтоны нужны, но использовать их нужно разумно.

Пример с Math.random() уберите чем быстрее тем лучше, к паттерну синглтон он никакого отношения не имеет. Не путайте читателей.
Обновил(-а) Diestro 22.12.2010 в 11:31
Старый 22.12.2010 11:36 iNils вне форума
iNils
 
Аватар для iNils
Цитата:
Если в проекте есть синглтон о нем как правило знают очень много классов.
Со статиком будет тоже самое.
Цитата:
Есть возможность их использовать повторно в других приложениях и проектах.
Классы можно условно поделить на два вида. Классы которые дальше проекта не выйдут и классы которые можно использовать везде. И меня как-то самом собой получается, что глобальные классы не связанны. Хотя я даже знаю почему, потому что сразу видно, что этот класс универсален и держать его нужно отдельно.
Старый 22.12.2010 11:53 Diestro вне форума
Diestro
 
Аватар для Diestro
Цитата:
Со статиком будет тоже самое.
Да, именно так. Использую и классы со статическими методами и синглтоны. Как правило статикой оформлены классы, являющиеся утилитными, подобные Math, например ArrayUtil, GraphUtil и т.п. Синглтонами делаю классы к которым нужен глобальный доступ в приложении. Как правило все ограничивается синглтоном для модели.
Цитата:
И меня как-то самом собой получается, что глобальные классы не связанны. Хотя я даже знаю почему, потому что сразу видно, что этот класс универсален и держать его нужно отдельно.
Важно это видеть сразу. Кажется это с опытом приходит
Конечно же в приложении существуют классы, которые абсолютно не подразумевается использовать где бы то ни было повторно, но нужно стремится к минимизации их количества, а из универсальных классов формировать библиотеки, которые использовать в дальнейшем и говорить себе спасибо.
Старый 22.12.2010 12:08 GBee вне форума
GBee
 
Аватар для GBee
2Rzer, никто не говорил, да я и не писал, что нельзя. Просто не додумался.

Цитата:
И кто тебя заставляет давать своим статическим классам длинные имена
Ну Math не ахти какой пример. Возьмем, например, URLLoaderDataFormat. Обычно классам дают осмысленные имена, а с О передергивание.

Цитата:
Не пишите синглтонами.
Почему? Похоже все-таки дело вкуса и привычки. У себя использую 1 синглтон, как уже писал выше. А статические исключительно для констант и утилиты.

Цитата:
Пример с Math.random() уберите чем быстрее тем лучше, к паттерну синглтон он никакого отношения не имеет. Не путайте читателей.
Да это просто пример был, если бы матх был синглтоном, то как бы фигово было бы его юзать.
Старый 22.12.2010 12:11 Diestro вне форума
Diestro
 
Аватар для Diestro
Цитата:
Да это просто пример был, если бы матх был синглтоном, то как бы фигово было бы его юзать.
Пример со статическими методами нужно приводить в статье про статические методы, в статье про сингтон нужно приводить примеры с синглтоном. Зачем путать читателя?
Старый 22.12.2010 12:20 GBee вне форума
GBee
 
Аватар для GBee
Да никто не путает, там надо смотреть сообщение целиком, вкупе с предыдущим.
Старый 22.12.2010 12:21 iNils вне форума
iNils
 
Аватар для iNils
Цитата:
но нужно стремится к минимизации их количества
Зачем? Универсальность - это ограниченность возможностей. Классы должны выполнять свою задачу. Если класс можно использовать везде - хорошо, нельзя - тоже нормально.
Старый 22.12.2010 14:13 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Ну, доводы у вас хорошие в пользу синглтона, но я всё равно останусь при своём мнении.

Точка "глобализации" безвозвратно превращается в гиганта, локализовывать баги в котором крайне сложно. Для меня это пройденный этап, когда один класс самый главный и отвечает за всё. Я предпочитаю главными классами делать классы, которые сидят глубоко-глубоко, их не видно и не слышно, а он самый умный. Ну что ты ему скажешь?

Возможно, конечно, что следующим этапом для меня будет "синглтоны - клёво!". Но конкретно сейчас я от них плююсь. Те же статики для важной логики, а не утилиток. Это моё имхо, никому не навязываю.
Старый 26.12.2010 11:08 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
У меня с синглтоном три проблемы:
- он мне никогда не нужен.
- когда он, тем не менее, присутствует, его тяжело тестировать.
- при загрузке / выгрузке модулей начинается свистопляска с рефлекшеном, и как бы так получить ссылку, чтобы при выгрузке ее не сохранить.
Кроме того, он как правило попадается в чужом коде, что, конечно же, добавляет негатива
Старый 26.12.2010 20:01 Slip_91 вне форума
Slip_91
 
Аватар для Slip_91
Сейчас появилась необходимость ковырять собственный проект, который писал месяца полтора назад. Там как раз синглтон. Настолько всё друг на друге завязано, что если дёрнуть за одну ниточку - где-нибудь обязательно порвётся 5 других. В общем крайне тяжело что-то менять в такой программе.

Но я не считаю, тем не менее, что синглтон - это плохо. Скорее это я его ни к месту / неправильно применил. И вообще имхо любое высказывание о любом паттерне в стиле "он не нужен" скорее стоит трактовать как "мне не нужен" или "я его не понимаю" =)
Старый 03.01.2011 21:45 LOS2008 вне форума
LOS2008
MonsterDebugger никто что-ли не использует тут? Отличный пример того: где и в каких местах без синглтона не обойтись.

Даже не надо далеко ходить, в соседних блогах обсуждаете SocialConnector и CacheManeger. Например, нужно аватарку показать в разных местах десяти разнородных объектов. Вы к ним как обращаетесь?
Код AS3:
var cashe:CacheManeger = parent.parent.parent.parent.....parent.parent.cacheManeger;
или по цепочке друг другу в конструкторе ссылку передавать?
Код AS3:
public function ItemA(cashe:*) {
  var itemB:ItemB = new ItemB(cashe);
}
 
public function ItemB(cashe:*) {
  var itemC:ItemC = new ItemC(cashe);
}
 
public function ItemC(cashe:*) {
  var itemD:ItemD = new ItemD(cashe);
}
Старый 04.01.2011 22:10 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
LOS2008: А синглтон какое отношение имеет к тому, что вы сейчас сказали? Смысл синглтона в том, что запрещается создание множества однотипных элементов, а не в том, что создается всего один.
Где это бывает нужно, например, так это во многопоточном окружении, когда в базе могут быть конкурирующие транзакции, и нужно, чтобы они встали в очередь, если они пытаются добраться до одних и тех же данных. Это тоже можно разрулить по-другому, но там хотя бы понятно зачем. А т.как многопоточности в АС3 нет как данности, то и необходимости в таких решениях быть не может.
Обновил(-а) wvxvw 04.01.2011 в 22:16
Старый 04.01.2011 23:31 mayakwd вне форума
mayakwd
 
Аватар для mayakwd
А как же классы инициализаторы вроде StylesManager для UIComponent?
Старый 05.01.2011 11:13 alatar вне форума
alatar
 
Аватар для alatar
StyleManager не синглтон. Внутри него создается класс реализующий IStyleManager2, вот созданием этого класса ведает класс Singleton, который следит за тем, что бы экземпляр был один. А вот LayoutManager как раз синглтон и сам распоряжается своим созданием.
 

 


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


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