namespace vs singleton
От: Аноним  
Дата: 18.08.09 13:22
Оценка:
Здравствуйте,

В проекте понадобился маленький класс, объект которого должен существовать в единственном экземпляре. Кроме того, он должен быть доступен из любого места программы. В качестве альтернативы синглтону был предложен namespace. Думаю из кода будет понятна общая идея:

// manager.h
namespace Manager
{
    void f();
    void g();
}

// manager.cpp
#include "manager.h"

namespace
{
    // keep here Manager "instance" variables state
    int managerData_ = 0;
    ...
}

void Manager::f()
{
   ++managerData_;
}

void Manager::g()
{
   ...
}


Т.е. определяем интерфейс в хедере, а все переменные кладем в cpp в unnamed-namespace. Таким образом гарантируется существование лишь одного экземпляра. Конечно, это не ООП подход, но у него есть свои преимущества:
1) Простота. Не требуется абсолютно никаких манипуляций с тем, чтобы сделать класс синглтоном
2) Инкапсуляция: пользователю виден лишь интерфейс класса, скрыты даже переменные класса.

Наследование от класса не требуется. Хочется узнать, плоха ли такая идея, и если да, то чем?
(Не из идеологических соображений ООП, а с точки зрения использования)
Re: namespace vs singleton
От: Alexander G Украина  
Дата: 18.08.09 13:43
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Т.е. определяем интерфейс в хедере, а все переменные кладем в cpp в unnamed-namespace. Таким образом гарантируется существование лишь одного экземпляра. Конечно, это не ООП подход, но у него есть свои преимущества:

А>1) Простота. Не требуется абсолютно никаких манипуляций с тем, чтобы сделать класс синглтоном
А>2) Инкапсуляция: пользователю виден лишь интерфейс класса, скрыты даже переменные класса.

А>Наследование от класса не требуется. Хочется узнать, плоха ли такая идея, и если да, то чем?

А>(Не из идеологических соображений ООП, а с точки зрения использования)

Пользуюсь, доволен. Только не в реализациии анонимное пространсто, а пространство Manager::detail, чтобы легче анализировать креш-дампы (в которых глобальные переменные, типа Manager::detail::managerData_ доступны, в отличии от переменных кучи).

Инкапсуляция хороша — можно переделать с инициализции в конструкторе глобальной переменной на boost::call_once и обратно, без перекомпиляции клиентов.

Разве что будет долго из такого синглтона делать не-синглтон.
Русский военный корабль идёт ко дну!
Re: namespace vs singleton
От: Ovl Россия  
Дата: 18.08.09 13:44
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте,


А>В проекте понадобился маленький класс, объект которого должен существовать в единственном экземпляре. Кроме того, он должен быть доступен из любого места программы. В качестве альтернативы синглтону был предложен namespace. Думаю из кода будет понятна общая идея:


это не синглтон в полном смысле — вы не можете отдать его куда-нибудь. у него нет конструктора и (возможно более важно) деструктора. хотя можно анонимный namespace заменить классом и все будет
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.