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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 20.06.2012, 20:10
pas.delger вне форума Посмотреть профиль Отправить личное сообщение для pas.delger Найти все сообщения от pas.delger
  № 1  
Ответить с цитированием
pas.delger
 
Аватар для pas.delger

блогер
Регистрация: Mar 2010
Сообщений: 108
Записей в блоге: 1
По умолчанию Нормальная ли реализация синглтона?

Добрый день!

Родилась в голове идея реализации синглтона через замыкание, возвращающее его инстанс описанный рядом. Вся логика, разумеется, в инстансе.

Код AS3:
package  {
 
	public function get Singleton():SingletonInstance{
		if (!instance) instance = new SingletonInstance;
 
		return instance;
	}
 
}
 
var instance:SingletonInstance;
 
class SingletonInstance {
 
	public function sayHello():void{
		trace("Hello from singleton");
	}
 
}
Таким образом можно красиво обратиться:

Код AS3:
Singleton.sayHello()
Т.е. исключительно эстетическое удовольствие, без всякий методов getInstance и прочей лабуды. И вот хотелось бы узнать мнение гуру, насколько это тупо или не тупо совсем?

Спасибо!

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

Регистрация: Nov 2010
Сообщений: 497
А чем вам статические методы не угодили, зачем вам singleton? Вопрос, конечно, провокационный, но позволяет задуматься, нужен вам singleton, набор методов или Dependency injection container.

Старый 20.06.2012, 21:32
a_[w] вне форума Посмотреть профиль Отправить личное сообщение для a_[w] Найти все сообщения от a_[w]
  № 3  
Ответить с цитированием
a_[w]

Регистрация: Dec 2005
Адрес: вне пространствавремени
Сообщений: 27
Вводит в заблуждение, как использовать типизацию по отношению к Singleton?
Интуитивно если класс, то var object:Class, а если экземпляр, то var object:Singleton.
Код AS3:
var instance:* = new Singleton.constructor();
Если это реальный синглтон, то он должен защищаться от попыток создать экземпляр.
__________________
while(true){trace(Math.random());};

Старый 20.06.2012, 22:00
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 4  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
1. Вау, оказывается и переменные можно вне пакета создавать - буду иметь ввиду
2. Если SingletonInstance не реализует никакого внешнедоступного интерфейса, то Вы уничтожили одно преимущество синглтона по сравнению со статическим классом:
Его теперь нельзя передавать в качестве параметра
(правда, что мешает сделать SingletonInstance публичным, а не пихать вместе с функцией, так ведь?)
3. Вообще да, использовать глобальную функцию вместо статической - прикольно

Цитата:
Если это реальный синглтон, то он должен защищаться от попыток создать экземпляр.
Описание "реального", канонического синглтона у GoF - это один из самых вредных текстов для чтнения начинающими. Они сами уже сомневаются, стоило ли его включать в книжку.
Ну вот посудите сами:

Нам нужен глобальный доступ к сервису, мы решаем забить на проблемы глобальности и сделать статическую точку доступа, но чего ради мы должны:
- ограничивать число экземпляров класса
- добавлять код, отвечающий за создание объектов в сам класс

А ведь делают синглтоном обязательно, а потом, когда требуется второй сервис вместо добавления ещё одного метода getSecondInstance() лепят переключатель isSecondMode() и кучу условной логики в сам синглтон, а потом надеются что 2 состояния внутри синглтона не будут запрошены одновременно. И я такое видел. Вот от чего здесь спасла защита от создания 2-го экземляра интересно? От экономии времени, от _не_появления багов?
Хватит уже цитировать книжки, там много чего пишут.


Последний раз редактировалось expl; 20.06.2012 в 22:15.
Старый 20.06.2012, 22:27
a_[w] вне форума Посмотреть профиль Отправить личное сообщение для a_[w] Найти все сообщения от a_[w]
  № 5  
Ответить с цитированием
a_[w]

Регистрация: Dec 2005
Адрес: вне пространствавремени
Сообщений: 27
expl, тема звучит так "реализация синглтона" -- разница между точкой доступа и паттерном "синглтон" есть. Если текст о вреде синглтонов для меня, то не стоит заморачиваться -- я не использую их.


Подумал и появился вопрос -- можно ли как-то извне получить доступ к переменной?
__________________
while(true){trace(Math.random());};


Последний раз редактировалось a_[w]; 20.06.2012 в 22:36.
Старый 20.06.2012, 23:50
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 6  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
expl, тема звучит так "реализация синглтона" -- разница между точкой доступа и паттерном "синглтон" есть.
Терминологически, конечно, Вы правы, просто не сдержался, в большинстве ведь случаев эта "защита" только делает хуже
Кстати здесь автор таки её реализовал в полном обёме - синглтон снаружи второй раз не создать никак (ценой невозможности передачи в качестве параметра). ИМХО оно не надо было - я за всю историю на типичной as3-шной реализации словил исключение создания второго экземпляра 2 раза, а проблем с невозможностью создать второй и трудностями наследования из-за этих хитрых защит - получал неоднократно.
Хотя последнее время стало полегче - коллеги вроде "научились" обходится без этого паттерна/антипаттерна (в последних проектах их насчитывается единицы на несколько сотен "нормальных" классов)


Последний раз редактировалось expl; 20.06.2012 в 23:52.
Старый 21.06.2012, 01:20
pas.delger вне форума Посмотреть профиль Отправить личное сообщение для pas.delger Найти все сообщения от pas.delger
  № 7  
Ответить с цитированием
pas.delger
 
Аватар для pas.delger

блогер
Регистрация: Mar 2010
Сообщений: 108
Записей в блоге: 1
Вердикт - ну его в баню вообще этот синглтон. (:

На самом деле, как я понимаю, ведь простота обращения к синглтону - достоинство куда важнее чем защита от повторного создания и прочего. Отсюда в общем-то и родилась идея попробовать такой подход, через функцию. Максимально отделить логику объекта от функционала передачи доступа к нему. Что б красиво было (: Пусть за это отвечает абсолютно обособленный сервис.

Старый 21.06.2012, 02:24
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 8  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Да хороший подход, всё правильно. Проблема в недоступности интерфейса SingletonInstance отдельно от этой функции (не все же объекты будут обращаться через этот метод, некоторые будут получать объект как параметр, для некоторых синглтон придётся подменить на время тестирования другим классом - для всего этого нужен публичный интерфейс)

Функцию отдельно - класс отдельно - и будет нормально, только защита от пересоздания будет не такой антиидиотской/пулинепробиваемой.

А простота обращения, через одну точку или без - это вообще дело последней важности (просто приятно её не писать). Eсли это действительно важно - значит у вас их так много и так активно используются, что будет куча других проблем, которые затмят написание лишней точки.


Последний раз редактировалось expl; 21.06.2012 в 02:37.
Создать новую тему Ответ Часовой пояс GMT +4, время: 21:53.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

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

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


 


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


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