Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   реализация паттерна singleton на AS3 (http://www.flasher.ru/forum/showthread.php?t=109596)

divinus 17.03.2008 15:36

реализация паттерна singleton на AS3
 
собств. вопрос... )
на AS2 использую давно... код примерно такой:
Код:

class Main{
        private static var instance : Main;
        public static function getInstance() : Main {
                if (instance == null)
                        instance = new Main();
                return instance;
        }       
        public static function main() : Void {               
                var m : Main = getInstance();
        }
        private function Main() {
                ******
        }
}

но вот встала потребность создать "одиночку" на AS3, а там как мне помнится запрещается объявления конструктора "приватным"... как быть? может быть кто-то сталкивался?

etc 17.03.2008 15:45

Можно выкидывать ошибку, если instance уже есть.
А вот необходимость использования подобного шаблона сомнительна.

Molecula 17.03.2008 15:46

А Гугл отменили?
http://www.cynergysystems.com/blogs/...ngleton_in_as3

http://www.gskinner.com/blog/archive...ingletons.html

WindWalker 17.03.2008 15:50

Вот тут довольно подробно расписано:

http://yarovoy.com/2007/10/24/single...ctionscript_3/

divinus 17.03.2008 15:53

2__etc, хм, а ведь и правда! )

Iv 17.03.2008 17:02

Цитата:

Сообщение от __etc
...
А вот необходимость использования подобного шаблона сомнительна.

- в данном случае или вообще?

etc 17.03.2008 17:10

Цитата:

Сообщение от Iv
- в данном случае или вообще?

В абсолютном большинстве случаев. Разводить очередной холивар я не хочу, так что в дискуссии участвовать не буду.

Iv 17.03.2008 17:19

Да нет холивара. Я согласен с твоей формулировкой.

Mr. Fixit 17.03.2008 18:15

Код:

private static var __instance :  SomeClass = null;
               
public static function getInstance() : SomeClass {
    if(SomeClass.__instance == null) SomeClass.__instance = new SomeClass();
        return SomeClass.__instance;
    }
               
public function SomeClass() {
                       
}


divinus 17.03.2008 18:30

и что это такое по вашему Mr. Fixit?
это тот же синглтон, только корявый...
что будет если мы где-то напишем:
Код:

var someClassInst:SomeClass = new SomeClass();
?

etc 17.03.2008 18:56

Цитата:

Сообщение от divinus
это тот же синглтон, только корявый...

Это просто товарищ Mr. Fixit не читал в этой теме ничего, кроме первого поста, ничего страшного.

Mr. Fixit 17.03.2008 20:05

Цитата:

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

Цитата:

Это просто товарищ Mr. Fixit не читал в этой теме ничего, кроме первого поста, ничего страшного.
Попросил бы не делать выводов, и не говорить за мои действия товарищ __etc.

По сабжу.. кидать ошибку как и сказано постами выше.

BlooDHounD 17.03.2008 20:16

ну рас всё было сказано, зачем в чужой огород со своими граблями?

WindWalker 17.03.2008 20:16

Цитата:

Сообщение от Mr. Fixit
это будет неправильно.. зачем такое писать если вы знаете что создание класса должно быть единождое?

Ну, типа, новые времена, прогрес и всё такое.
"Защита от дурака" должна быть не только в GUI (против пользователя, который жмёт все красные кнопки), но и в коде (против кодера, которому тоже свойственно ошибаться).

Mr. Fixit 17.03.2008 20:35

Цитата:

Ну, типа, новые времена, прогрес и всё такое.
Спасибо, буду знать)

divinus 17.03.2008 20:49

абсолютно согласен с WindWalker, от себя добавлю... придерживаться инкапсуляции даже для себя ИМХО правильно... ) так как сейчас даже в своем фреймворке лень лезть и смотреть синглтон это или еще чего... )

NePridymal 17.03.2008 20:49

Вот с защитой от дурака...

Код:


package
{
       

        // Singleton class
       
        public class MyClass
        {
               
               
               
                private static var instance:MyClass;
               
                public function MyClass(block:Blocker):void
                {
                        if (instance == null) instance = this;
                }
               
               
                public static function getInstance():MyClass
                {
                        if (instance == null) instance = new MyClass(new Blocker());
                        return instance;
                }
               

       
               
        }
       
}

        // блокиратор конструктора MyClass

        internal final class Blocker
        {
                public function Blocker():void
                {
                }
        }


Mr. Fixit 17.03.2008 21:09

Код:

package com.dimpiax.laboratory.view {
        import flash.display.Sprite;       

        /**
        * @author Pilipenko Dmytro
        */
        public class ClassA extends Sprite {
                private static var __instance : ClassA = null;
               
                public static function getInstance() : ClassA {
                        if(ClassA.__instance == null)
                        ClassA.__instance = new ClassA(true);
                       
                        return ClassA.__instance;
                }
               
                public function ClassA(block : Boolean = false) {
                        if(!block) throw new Error('error');
                }
               
                public function initClass() : void {
                        trace(this);
                }
        }
}


etc 17.03.2008 23:43

Цитата:

Сообщение от Mr. Fixit
Попросил бы не делать выводов, и не говорить за мои действия товарищ __etc.

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

Iv 18.03.2008 02:06

Я не очень поддерживаю карательные меры, но, если говорить о коде синглтонов опубликованых здесь, то __etc прав. Код ужасный.
Могу показать конкретные косяки.
А по линку на сайт Юры Ярового не только код, но и хорошее описание.

lowka 18.03.2008 02:24

Цитата:

Сообщение от divinus
собств. вопрос... )
но вот встала потребность создать "одиночку" на AS3, а там как мне помнится запрещается объявления конструктора "приватным"... как быть? может быть кто-то сталкивался?

Можно воспользоваться статическим блоком инициализации - это гарантирует нам, что экземпляр нашего класса будет создан(в момент первого обращения к классу), а желание создать еще один экземпляр(как уже упоминалось) выкидыванием исключения, когда экземпляр уже создан.
Код:

package  {
        public class Singleton {
               
                private static var _instance:Singleton;
               
                //static block
                {
                        _instance = new Singleton();
                }
               
                public function Singleton() {
                        if (_instance != null) {
                                throw new ArgumentError("bla-bla-bla");
                        }
                }
               
                public static function getInstance():Singleton {
                        return _instance;
                }
        }
}


Mr. Fixit 18.03.2008 03:06

Цитата:

Могу показать конкретные косяки.
Покажи мне будет интересно, и на пользу.

Iv 18.03.2008 03:20

Цитата:

Сообщение от Mr. Fixit
Покажи мне будет интересно, и на пользу.

var foo:ClassA = new ClassA(true);
var boo:ClassA = new ClassA(true);
trace("is it singleton? -"+foo == boo);

Во многих случаях можно спорить о том что нравится/не нравится. Это называется холивар.
Холивар обычно заканчивается, если кто-то способен доказать свою точку зрения примером. Например, как тот, что я написал.

Mr. Fixit 18.03.2008 03:37

да я согласен что при тру.. кривость есть.. но зачем писать в данном контексте тру разработчику.. ну вообще то можно конечно ссылатся на того кто вызывает.. если не сам класс.. то ошибка.
Ясн... Iv спасибо.

WindWalker 18.03.2008 09:58

Холивар - это обычно что-то vs что-то. А Синглтон - он против кого?
В смысле, кто у него прямые конкуренты?

Вот если хочется чего-то глобааального такого, то выбор не велик: или синглтон, или статические методы или методы пекеджа (что по сути те же статические методы). Статические методы имеют свои минусы.
Совсем отказаться от глобального доступа - тоже не всегда хорошо.

BlooDHounD 18.03.2008 10:24

Холивар - это когда писками меряются. например я это уже 1й зачаток холивара в данном топе. может хоть один разовьём? а скучно.

terbooter 18.03.2008 13:03

Почитав книжку Foe, Object-Oriented Actionscript 3.0 (2007) долгое время использовал их версию синглтона
Код:

package {

    public class Singleton {

        private static var instance:Singleton;
        private static var allowInstance:Boolean;

        public function Singleton() {
            if(!allowInstance) {
                throw new Error("Error: use Singleton.getInstance() instead of new keyword");
            }
        }

        public static function getInstance(fg):Singleton
        {
            if(instance == null) {
                allowInstance = true;
                instance = new Singleton();
                trace("Singleton instance created");
                allowInstance = false;
            } else {
                trace("Singleton instance already exists");
            }
            return instance;
        }
       
        public function doSomething():void {
            trace("doing something");
        }
    }
}

В последнем проекте решил не использовать этот паттерн вовсе, никаких неудобств пока не обнаружил.
В каких конкретных случаях из практики использование этого паттерна необходимо?
И какие причины против его использования?

divinus 18.03.2008 13:16

"необходимость" в программировании возникает вообще крайне редко... одну и ту же задачу можно решить множеством способов. Другое дело удобство, расширяемость, сопровождение, инкапсуляция, повторное использование кода и т.д. и т.п.... :)

WindWalker 18.03.2008 13:21

Ну взять, скажем, опции: громкость музыки и эффектов, режим оконный/полноэкранный, качество высокое/низкое, режим паузы, режим mute и так далее.

Частенько нужны из самых разных и отдалённых концов приложения. Самый простой способ - сделать нечто с глобальным доступом.
Одиночка тут вполне годиться.

Iv 18.03.2008 13:30

terbooter, вообще, синглтон сейчас многие относят к антипаттернам. И, наверное, это правильно.
Я думаю, что правильно его относить к антипаттернам, но не правильно совершенно от него отказываться.

Так сложилось исторически. Это как использование _root в AS1-2. Синглетон объявили паттерном (т.е. рекомендуемым к применению шаблоном), но его используют в целях, для которых он совершенно не предусмотрен.

Реальное назначение синглетона - предоставлять доступ к единственному экземпляру класса и не допускать возможность создания второго.
Как правило, ошибочное использование синглетона - организация глобального доступа к объекту.

Так вот, синглетон используют для организации глобального доступа раз в 100 чаще, чем в целях, которым он должен служить.
Объявляя синглетон антипаттерном можно добиться того, что люди будут куда внимательнее относиться к его использованию.

WindWalker 18.03.2008 13:35

Цитата:

Сообщение от Iv
Так вот, синглетон используют для организации глобального доступа раз в 100 чаще, чем в целях, которым он должен служить.

Потому что глобальный доступа требуется в 100 раз чаще, чем гарантированно единственный экземпляр. :)

Можно не переносить его в раздел антипаттернов, а переименовать в Глобалтон.

Iv 18.03.2008 13:36

Пока я писал, небыло сообщения от WindWalker.
С сожалением констатирую, что им предложена ошибочная интерпретация синглетона.

Iv 18.03.2008 13:38

Цитата:

Сообщение от WindWalker
переименовать в Глобалтон.

- ну да, правильно. Получив антипаттерн, с вытекающим к нему отношением.

WindWalker 18.03.2008 13:44

Ну ладно, бог с ним, с синглотоном.

Вот если есть нечто глобальное, что влияет на всё приложение в целом, то каким образом это лучше всего реализовать?

Пример с опциями уже приводил.
Другой пример - имя игрового аккаунта (в мультиплеерной) или игрового профиля (в сингплеерной) игре. Показывать и использовать надо в разных местах. А хранить надо в одном.
Каким образом это лучше всего реализовать?

divinus 18.03.2008 13:49

Iv, я конечно понимаю, что строить всё приложение на синглтонах - бред, но вот создавать "большие" классы (основная сцена, конфиг, и др.) удобнее все же с применением синглтона, ну или фабрик... ;) холивар!!!

Iv 18.03.2008 13:50

Я вообще не склонен к категорическим запретам.
Антипаттерн - не запрет, а повод быть очень внимательным и критичным.
Делай как тебе нравится, но учитывай чужой опыт.
Ты должен знать, на какие подводные камни налетали люди до тебя и здраво оценивать риски.

divinus 18.03.2008 13:50

WindWalker, есть ведь и другие порождающие паттерны ;)

BlooDHounD 18.03.2008 14:01

из веше перечисленных примеров, ни в одном из них я бы синглтон не использовал бы даже пьяный.

Iv 18.03.2008 14:04

отсюда вывод: не садись пьяным за руль и за комп :)

WindWalker 18.03.2008 14:05

Цитата:

Сообщение от divinus
WindWalker, есть ведь и другие порождающие паттерны ;)

Вот мне и интересно, с помощью чего зубры флеша решают вышеназванные задачи.
Подозреваю, что с помощью тех же синглтонов - перекрестившись и с полным осознанием того, что это неправильно, но куда деваться...

Цитата:

Сообщение от BlooDHounD
из веше перечисленных примеров, ни в одном из них я бы синглтон не использовал бы даже пьяный.

Вопрос не в том, что ты не стал бы использовать, вопрос в том, что стал бы.
Но от тебя ответ и не требуется. Вопрос зубрам, а не ламерам.


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

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