forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   singleton vs static (http://forum.boolean.name/showthread.php?t=15571)

den 30.09.2011 22:23

singleton vs static
 
Чем singleton лучше статичного класса (т.е. у которого все методы и переменные static)?

moka 30.09.2011 22:40

Ответ: singleton vs static
 
Две разные вещи, по разному используются.
Имхо, их сравнивать нельзя никак. Тот же синглтон - имеет статик переменную в себе, но указывает на дин объект, который при обращении инициализируется.
В статик полностью же объекте, инициализацию делать геморнее - нужен вызов функции инициализации вручную. Но не в этом суть.
То же "вкл/выкл" делать для статик класса проще, с больше экономией памяти и более удобным использованием, чем для синглтона.

Зависит от ситуации, и где и для чего нужно заюзать.

den 30.09.2011 23:25

Ответ: singleton vs static
 
Ну допустим есть класс MyCl
Если он синглетон:
PHP код:

//1 кусок кода
MyCl *MyCl::init();
m->someFuncA();
delete m;

//2 кусок кода
MyCl *MyCl::init();
m->someFuncB();
delete m

если же он статичный класс то:
PHP код:

//1 кусок кода
MyCl::someFuncA();

//2 кусок кода
MyCl::someFuncB(); 

Помойму второй пример удобней и понятней.
Но многие почемуто используют первый.

moka 30.09.2011 23:28

Ответ: singleton vs static
 
delete - удаляет объект, или указатель? Если объект - то это не разумно имхо. Суть такого синглтона, это инициализация лишь для совершения определённых действий, и затем разрушение. Имхо, весьма извратный подход, и не удобный.
Я просто на C# сижу.

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

Mr_F_ 01.10.2011 00:20

Ответ: singleton vs static
 
Цитата:

//1 кусок кода
MyCl *m = MyCl::init();
m->someFuncA();
delete m;

//2 кусок кода
MyCl *m = MyCl::init();
m->someFuncB();
delete m;
зачем delete? суть синглтона - объект класса в единственном уникальном экземпляре будет доступным в разное время в разных участках кода. delete нужен только на выходе из программы уже.

Цитата:

Помойму второй пример удобней и понятней.
в твоём случае да.
а в таком нет:

статик:
Код:

class myClass
{
 static float a,b,c;
public:
 static void do();
};

float myClass::a = 0; // неявный момент назначения статик переменных (может вызваться в рандомной последовательности относительно инициализации данных других классов)
float myClass::b = 0;
float myClass::c = 0;

void myClass::do()
{
 a = b+c;
}

синглтон:

Код:

class myClass
{
 float a,b,c;
 static myClass* instance;
public:
 static myClass* Instance()
 {
  if (!instance) instance = new myClass();
  return instance;
 }
 static void Release()
 {
  if (instance) delete instance;
 }

 void do();

};

myClass* myClass::instance = 0; //единственная инициализация статик данных для синглтон класса. остальные нормальные будут сидеть внутри объекта класса

void myClass::do()
{
 a=b+c;
}


moka 01.10.2011 01:02

Ответ: singleton vs static
 
А так нельзя?

Код:

class myClass
{
 static float a = 0;
 static float b = 0;
 static float c = 0;
public:
 static void do();
};

void myClass::do()
{
 a = b+c;
}

В C# можно если что..

Mr_F_ 01.10.2011 01:09

Ответ: singleton vs static
 
Цитата:

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

ну и потом - нельзя
Цитата:

error C2864: 'a' : only const static integral data members can be initialized inside a class or struct

moka 01.10.2011 01:19

Ответ: singleton vs static
 
Ех, вот жеж неудобства с С++.

В C#, это выглядит так.
static:
Код:

class MyClass {
    private static float a, b, c;

    public static void Do() {
        a = b + c;
    }
}
...
MyClass.Do();

singleton:
Код:

class MyClass {
    private float a, b, c;
    private static MyClass instance;

    private MyClass() { }

    public static MyClass Instance {
        get {
            if (instance == null) {
                instance = new MyClass();
            }
           
            return instance;
        }
    }

    public void Do() {
        this.a = this.b + this.c;
    }
}

...

MyClass.Instance.Do();

Судите сами, но реальная необходимость в singleton'е, очень мало вероятна имхо.
Но конечно, многим религия не позволяет юзать static'и..


Кстати, Den, зачем ссылку удалил?
http://habrahabr.ru/blogs/refactoring/103681/

Тут отлично описываются разница их. И кстати да, много отличным поинтов подмечено.
Но суть больше в том что люди начинают сравнивать singleton'ы как альтернатива static'ам, но это не так, т.к. это две схожие но различные сущности. Singleton хорош в виде объекта, для расширения, наследия и т.п. Но если это не нужно, так зачем клепать ещё?


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot