Форум 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=177053)

Alexmody 23.03.2012 15:12

Стиль реализации статического класса
 
Вариант 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(){       
        }
        ...
}


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

maxkar 23.03.2012 15:53

Цитата:

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

dsQuadro 23.03.2012 16:33

может проще синглтон использовать?

КорДум 23.03.2012 16:34

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

carrotoff 23.03.2012 17:41

Терпеть не могу статику. Мне кажется лучший вариант от maxkar.
Статику можно использовать исключительно в качестве хэлперов.

dsQuadro 23.03.2012 17:45

Код 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()

и работаете как с обычным экземпляром класса

Alexmody 23.03.2012 17:47

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();
                }
 
                //...
}


maxkar 23.03.2012 18:00

Цитата:

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

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

КорДум 23.03.2012 18:04

Цитата:

Не очень хорошо, когда в статик классе нельзя пользоваться другими статик функциями, пока не вызвать статик ф-ю init. В этом и изначальная загвоздка была.
Смотря где.
У flashdynamix есть в утилитах SWFProfiler со статическим методом init(), который принимает ссылку на stage.
Ну и я делал как-то похожее.

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

Alexmody 23.03.2012 22:38

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

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


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

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