Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Глобальный доступ к объекту без синглотона или ДИ (http://www.flasher.ru/forum/showthread.php?t=177859)

incvizitor 10.04.2012 14:11

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

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

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

Aquahawk 10.04.2012 14:14

Синглтон. Какую реализацию вы хотите использовать и какие проблемы вы предвидите? Я вот в данном случае особых проблем не вижу.

-De- 10.04.2012 14:22

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

incvizitor 10.04.2012 14:33

Накидаю возможный пример (если синглтон):

Код 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 минуты
Цитата:

вы хотите глобальный доступ без глобального доступа.
Что то вроде этого :)

wvxvw 10.04.2012 14:46

Только ведь объекты созданные в классе-документе приложения могут / должны пользоваться ресурсами - логично сделать ссылку на менеджер ресурсов свойством этого класса. Соответственно, таким образом можно избежать накладок при загрузке одной флешки в другую - когда статические методы перекроются. Собственно, loaderInfo.applicationDomain.getDefinition() выполняет ту самую задачу, с которой вы столкнулись. Выполняет ее нормально, не вижу смысла делать по-другому.

incvizitor 10.04.2012 14:52

wvxvw, я не очень понял что Вы имеете ввиду.

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

Код AS3:

public class Main extends Sprite{
 
    private var resourseManager:ResourseManager;
 
    public function Main(){
          resourseManager = new ResourseManager();
    }
}

как мне правильно раздать ссылку на этот объект?

Цитата:

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

in4core 10.04.2012 15:03

Цитата:

как мне правильно раздать ссылку на этот объект?
Что значит раздать ссылку? Тоесть получить инстанс с любой точки флеша? Статик методы или синглтон - дургого еще не придумали и не придумают.
Но чтобы такого не было, помоему мвс для этого и сделали

incvizitor 10.04.2012 15:06

in4core, нет. Как сделать так, что бы ссылку на этот объект можно было получить через loaderInfo.applicationDomain.getDefinition()? Он же ссылку на класс мне вернет а не на конкретный объект...

wvxvw 10.04.2012 15:18

Почему? - потому что вы не знаете кто может загрузить эту флешку, и нужны ли загрузчику те же статические переменные, что и данной флешке.

Как раздать ссылку? -
Код 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 и избегаем ситуации, когда менеджер один на всех, а загрузило его две разные флешки.

gloomyBrain 10.04.2012 15:19

Цитата:

что бы ссылку на этот объект можно было получить через loaderInfo.applicationDomain.getDefinition()
Если это аналогия - то поймите, что loaderInfo FlashPlayer прокидывает за Вас во все отображаемые объекты.


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

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