Инициализация программы с использованием Singleton - PullRequest
1 голос
/ 24 мая 2009

Я прочитал несколько статей о том, почему синглеты плохие.
Я знаю, что у него мало применений, таких как логирование, но как насчет инициализации и деинициализации.
Есть ли проблемы с этим?
У меня есть скрипт-движок, который мне нужно привязать при запуске к библиотеке.
В библиотеках нет main (), так что мне использовать?
Обычные функции или синглтон.
Можно ли как-то скопировать этот объект:

class
{
public:
   static void initialize();
   static void deinitialize();

}  bootstrap;

Если нет, то почему люди скрывают копию ctor, оператор присваивания и ctor?

Ответы [ 4 ]

4 голосов
/ 24 мая 2009

Библиотеки в C ++ имеют гораздо более простой способ выполнить инициализацию и очистку. Это точно так же, как вы сделали бы это для всего остального. RAII.

Оберните все, что нужно инициализировать в классе, и выполните его инициализацию в конструкторе. Вуаля, проблемы решены.

Все обычные проблемы с синглетами все еще применяются:

  • Вам понадобится более одного экземпляра, даже если вы не планировали этого. Если ничего другого, вы захотите это при юнит-тестировании. Каждый тест должен инициализировать библиотеку с нуля, чтобы она работала в чистой среде. Это трудно сделать с помощью одноэлементного подхода.
  • Вы облажались, как только эти синглтоны начинают ссылаться друг на друга. Поскольку фактический порядок инициализации не виден, вы быстро получите кучу циклических ссылок, что приведет к получению доступа к неинициализированным синглетам, переполнению стека, тупикам или другим забавным ошибкам , которые могли быть обнаружены во время компиляции, если бы у вас не было ' Я был одержим идеей сделать все глобальным .
  • Многопоточность. Обычно плохая идея заставить все потоки совместно использовать один и тот же экземпляр класса, потому что он заставляет этот класс блокировать и синхронизировать все , что требует большой производительности и может привести к взаимоблокировкам.
  • Код спагетти. Вы скрываете зависимости своего кода каждый раз, когда используете одиночный или глобальный код. Больше не ясно, от каких объектов зависит функция, потому что не все они видны как параметры. И поскольку вам не нужно добавлять их в качестве параметров, вы легко можете добавить гораздо больше зависимостей, чем необходимо. Вот почему синглетоны практически невозможно удалить, если они у вас есть.
1 голос
/ 24 мая 2009

Цель синглтона - иметь в вашей системе только ОДИН экземпляр определенного класса. C'tor, D'tor и CC'tor скрыты, чтобы иметь единую точку доступа для получения единственного существующего экземпляра.

Обычно экземпляр является статическим (может быть также размещен в куче) и закрытым, и есть статический метод (обычно называемый GetInstance), который возвращает ссылку на этот экземпляр.

Вопрос, который вы должны задать себе, решая, иметь ли синглтон, таков: действительно ли мне нужно иметь один объект этого класса?

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

Другая проблема - Как убить одиночку (в Интернете полно статей об этой проблеме)

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

Обратите внимание, что если вы многопоточные, статические переменные могут причинить вам боль в XXX ...

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

В вашем случае я не думаю, что вам нужен синглтон, потому что вы хотите, чтобы библиотеки были инициализированы в начале, но это не имеет ничего общего с принудительным использованием только одного экземпляра вашего класса. Вы можете просто держать статический флаг (static bool Initialized), если все, что вам нужно, это обеспечить его инициализацию только один раз.

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

0 голосов
/ 30 мая 2009

посчитайте количество синглетонов в вашем дизайне и назовите это число '100' *

посчитайте количество нитей в вашем дизайне и назовите это число 't'

теперь поднимите t до s-й степени; это примерно количество волос, которые вы можете потерять при отладке полученного кода.

(лично я столкнулся с кодом, содержащим более 50 синглетонов с 10 различными потоками, которые в первую очередь участвуют в гонке.

0 голосов
/ 24 мая 2009

Хорошей практикой является предоставление интерфейса для ваших библиотек, чтобы несколько модулей (или потоков) могли использовать их одновременно. Если вам действительно нужно запустить какой-то код при загрузке модулей, используйте синглтоны для инициализации parts , чтобы должен быть init один раз.

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