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

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

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

блогер
Регистрация: Sep 2008
Адрес: Менск
Сообщений: 586
Записей в блоге: 1
Отправить сообщение для incvizitor с помощью Skype™
По умолчанию Глобальный доступ к объекту без синглотона или ДИ

Допустим есть такой класс ResourseManager, который абстрагирует доступ приложения к разному типу данных (картинки, звуки, тескта и т.д.).
Все приложение получает данные именно через него. Что бы дать всему приложению доступ на него существует несколько разных способов:
1 - Синглтон. Думаю что реализацию и возможные проблемы вы уже знаете.
2 - ДИ. Вообщем для данной проблемы не плохой подход, однако не хочется прикручивать ДИ движок к приложению, так как это преопределит его архитектуру не так как мне этого хочется.
3 - Впихнуть ResourseManager в основную модельку и через нее все получать. То же вроде бы не плохой вариант, однако мне кажется идеологически не правельным засовывать ResourseManager в модель, так как хотелось бы что бы у представления была непосредственная ссылка на него.
4 - Можно кидать евент, в который передать каллбек. Евент будет ловится медиатором, и обработчике будет вызыватся коллбек, как только данные будут загружатся. Вообщем этот вариант конечно полностью отгораживает нас от ссылки на ресоурс менеджер, но тогда каждое обращение к ResourseManager выльется в несколько строчек. Да и вообще мне кажется это не правильным, так как код будет не приятным для обслуживания, дебага и вообще это просто не правильно

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

Зарание благодарен.
__________________
ranga

Старый 10.04.2012, 14:14
Aquahawk вне форума Посмотреть профиль Отправить личное сообщение для Aquahawk Посетить домашнюю страницу Aquahawk Найти все сообщения от Aquahawk
  № 2  
Ответить с цитированием
Aquahawk
 
Аватар для Aquahawk

Регистрация: Nov 2010
Адрес: Москва
Сообщений: 915
Записей в блоге: 4
Отправить сообщение для Aquahawk с помощью ICQ Отправить сообщение для Aquahawk с помощью Skype™
Синглтон. Какую реализацию вы хотите использовать и какие проблемы вы предвидите? Я вот в данном случае особых проблем не вижу.
__________________
:)

Старый 10.04.2012, 14:22
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 3  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Минусы синглтона это почти минусы глобального доступа, вы хотите глобальный доступ без глобального доступа.
У меня это статическая функция вообще и не парюсь)
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

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

блогер
Регистрация: Sep 2008
Адрес: Менск
Сообщений: 586
Записей в блоге: 1
Отправить сообщение для incvizitor с помощью Skype™
Накидаю возможный пример (если синглтон):

Код AS3:
public class BaseImage extends Sprite{
   public function BaseImage(uri:String = ""){
        if(uri) this.uri = uri;
   }
 
   public function set uri(s:String):void{
        ResourseManager.instanse.getResourse(s, _onImageReceived);
   }
 
   private function _onImageReceived(image:*):void{
        if(image is BitmapData){
            addChild(new Bitmap(image as BitmapData));
        }else{
             addChild(image);
        }
   }
}
Тут вроде бы всё ок, так как доступ скрыт в отдельном компоненте. Однако ResourseManager не только скармливает, но и кушает:

Код AS3:
public class UIProvider implements IResourseProvider{
 
     [Embed(source="example.png")]
     public var example:Class;
 
     public function UIProvider(){
          ResourseManager.instanse.registerNamespace("ui", this);
     }
 
     public function getResourse(urn:String, callback):void{
          callback(new (this[urn] as Class)());
     }
}
Вот такой пример мне нравится гораздо меньше, так как классы такого типа могут находится в различных модулях приложения. Получается что все эти модули должны будут иметь ссылку на модуль в котором лежит ResourseManager, что мне и не нравится. Не говоря уже о том, что все они 100% работают с конкретной релизацией, а не с интерфейсом.

Добавлено через 2 минуты
Цитата:
вы хотите глобальный доступ без глобального доступа.
Что то вроде этого
__________________
ranga

Старый 10.04.2012, 14:46
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 5  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Только ведь объекты созданные в классе-документе приложения могут / должны пользоваться ресурсами - логично сделать ссылку на менеджер ресурсов свойством этого класса. Соответственно, таким образом можно избежать накладок при загрузке одной флешки в другую - когда статические методы перекроются. Собственно, loaderInfo.applicationDomain.getDefinition() выполняет ту самую задачу, с которой вы столкнулись. Выполняет ее нормально, не вижу смысла делать по-другому.
__________________
Hell is the possibility of sanity

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

блогер
Регистрация: Sep 2008
Адрес: Менск
Сообщений: 586
Записей в блоге: 1
Отправить сообщение для incvizitor с помощью Skype™
wvxvw, я не очень понял что Вы имеете ввиду.

Для простоты примера:

Код AS3:
public class Main extends Sprite{
 
    private var resourseManager:ResourseManager;
 
    public function Main(){
          resourseManager = new ResourseManager();
    }
}
как мне правильно раздать ссылку на этот объект?

Цитата:
Только ведь объекты созданные в классе-документе приложения могут / должны пользоваться ресурсами
почему?
__________________
ranga

Старый 10.04.2012, 15:03
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 7  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Цитата:
как мне правильно раздать ссылку на этот объект?
Что значит раздать ссылку? Тоесть получить инстанс с любой точки флеша? Статик методы или синглтон - дургого еще не придумали и не придумают.
Но чтобы такого не было, помоему мвс для этого и сделали
__________________
Марк Tween

Старый 10.04.2012, 15:06
incvizitor вне форума Посмотреть профиль Отправить личное сообщение для incvizitor Найти все сообщения от incvizitor
  № 8  
Ответить с цитированием
incvizitor
 
Аватар для incvizitor

блогер
Регистрация: Sep 2008
Адрес: Менск
Сообщений: 586
Записей в блоге: 1
Отправить сообщение для incvizitor с помощью Skype™
in4core, нет. Как сделать так, что бы ссылку на этот объект можно было получить через loaderInfo.applicationDomain.getDefinition()? Он же ссылку на класс мне вернет а не на конкретный объект...
__________________
ranga

Старый 10.04.2012, 15:18
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 9  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Почему? - потому что вы не знаете кто может загрузить эту флешку, и нужны ли загрузчику те же статические переменные, что и данной флешке.

Как раздать ссылку? -
Код AS3:
public class Main extends Sprite implements IResourcemanager {
 
// Получить ссылку на класс конструктор ресурса.
public function recourceFactory(id:String):Class {
return this._knownClasses[id];
}
 
// Возможно, ресурсы кешируются, используются по-новой.
public functin resource(id:String):Object {
return this._availableResources[id];
}
 
public function recycle(id:String, resource:Object):void {
this._availableResources[id] = resource;
}
 
public function Main() {
super();
ResourceManager.addManager(this);
}
. . .
/* ResourceManager */
public static function addManager(manager:IResourceManager):void {
_managers[getQualifiedClassName(manager)] = manager;
}
public static function getResource(manager:String, id:String):Object {
return _managers[manager].resource(id);
}
. . .
Поскольку два одинаковых Main класса загрузить в одну флешку, в один домейн все равно не получится, мы можем смело расчитывать на то, что getQualifiedClassName() будет уникальным. Таким образом мы, не создавая лишних зависимостей, "знаем" только про Resourcemanager + IResourceManager и избегаем ситуации, когда менеджер один на всех, а загрузило его две разные флешки.
__________________
Hell is the possibility of sanity

Старый 10.04.2012, 15:19
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 10  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Цитата:
что бы ссылку на этот объект можно было получить через loaderInfo.applicationDomain.getDefinition()
Если это аналогия - то поймите, что loaderInfo FlashPlayer прокидывает за Вас во все отображаемые объекты.
__________________
...вселенская грусть

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

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

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


 


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


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