|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Dec 2010
Сообщений: 177
|
Стиль реализации статического класса
Вариант 1:
Есть статик класс: 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; и один раз получить куки, а далее использовать ее во всех статик функциях. public static function init(name:String, value:*):void { sharedObject:SharedObject = SharedObject.getLocal(Constant.SHARED_OBJECT_NAME); } Вариант 3: при объявлении статической переменной, сразу же ее инициализировать public class Profile { sharedObject:SharedObject = SharedObject.getLocal(Constant.SHARED_OBJECT_NAME); public function Profile(){ } ... } Какой вариант правильнее всего выбрать? |
|
|||||
Регистрация: Nov 2010
Сообщений: 497
|
Цитата:
|
|
|||||
может проще синглтон использовать?
|
|
|||||
Регистрация: May 2010
Сообщений: 543
|
Терпеть не могу статику. Мне кажется лучший вариант от maxkar.
Статику можно использовать исключительно в качестве хэлперов.
__________________
Вы грабите бедных людей. Парень со свирелью накажет вас. Хонгильдон (с) |
|
|||||
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 { }; Последний раз редактировалось dsQuadro; 23.03.2012 в 17:50. |
|
|||||
Регистрация: Dec 2010
Сообщений: 177
|
maxkar
>>правильнее всего сделать методы в Profile не статическими, создавать один его экземпляр при старте >>приложения Согласен, к этому и стараюсь идти, чтобы не плодить глобал переменные, но порой очень не удобно передавать экземпляр внутрь иерархической структуры классов. КорДум Я бы сделал еще статический метод init(), в который передавал SharedObject.getLocal(Constant.SHARED_OBJECT_NAME). Не очень хорошо, когда в статик классе нельзя пользоваться другими статик функциями, пока не вызвать статик ф-ю init. В этом и изначальная загвоздка была. dsQuadro Замечательное решение к данной задаче: - глобал доступ - создание экземпляра идет не при запуске программы, а в том месте, где в первый раз воспользовались функцией, это супер! - минимум статик функций - появилась возможность только один раз вызвать ф-ю getLocal в конструкторе и передать SharedObject приватной переменной, которая далее используется в функциях класса. - решилась проблема с первоочередностью вызова init - такую функцию вообще вырезаем. Ага спасибо за пример , реализация заготовки синглтона у меня была: 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(); } //... } Последний раз редактировалось Alexmody; 23.03.2012 в 17:51. |
|
|||||
Регистрация: Nov 2010
Сообщений: 497
|
Цитата:
Исключением является "крупномодульное" взаимодействие (плагины и т.п., получающие набор классов среды выполнения). Но там подобная передача ограничивается тем же одним уровнем, код внутри плагина точно так же собирается "от меньшего к большему". Так что "далеких" передач объектов нигде нет, есть только последовательность создания модуля/приложения. При использовании inversion-of-control контейнера там не линейная, а древовидная схема получается, но это не принципиально. |
|
|||||
Цитата:
У flashdynamix есть в утилитах SWFProfiler со статическим методом init(), который принимает ссылку на stage. Ну и я делал как-то похожее. Синглтон, в общем, нужен.
__________________
тут я |
|
|||||
Регистрация: Dec 2010
Сообщений: 177
|
maxkar
>>что где-то не до конца вынесены зависимости Для снижения связей и зависимостей между классами в древовидной иерархии, я стараюсь максимально применить композицию построенную на ее принципе и интерфейсах. Тем не менее, никогда не задумывался и не придерживался правилу "Вся программа при инициализации собирается "снизу вверх"". Как только узнаешь это правило, тут же всплывают все приемущества такого подхода, при том что я очень люблю композицию. Спасибо за совет, буду больше думать об этом! Действительно, если упрощенно говорить, то передача класса по дочерним классам, может быть выстроена почти на одном уровне вложенности. Кстати, посоветуйте какие книжки можно почитать по архетиктуре ПО? Т.е. к примеру по паттернам проектирования материал читаю, также стараюсь использовать правила SOLID и пр. Последний раз редактировалось Alexmody; 24.03.2012 в 10:20. |
Часовой пояс GMT +4, время: 09:27. |
|
« Предыдущая тема | Следующая тема » |
|
|