У меня действительно есть потребность в Синглтоне? - PullRequest
2 голосов
/ 02 мая 2009

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

Это похоже на законное использование синглтона, но я продолжаю читать о том, как они злые звери. Это нормально использовать?

Ответы [ 3 ]

3 голосов
/ 02 мая 2009

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

2 голосов
/ 02 мая 2009

Проблема в том, что каждое окно Firefox - это совершенно отдельный процесс в отношении Javascript.

Так что да, это будет работать, но только если вы условно создадите синглтон. Если он просто безоговорочно создан в глобальной области (в моем случае, как член моего объекта расширения верхнего уровня), он будет во всех окнах.

Другая проблема, с которой вы столкнетесь, заключается в том, что для запуска и запуска javascript Windows требуется некоторое время, а у вас нет ничего похожего на синхронизацию. Вполне возможно, что окно 1 проверяет, создало ли окно 2 синглтон, видит, что оно не имеет, окно 2 проверяет окно 1, видит, не имеет, и затем оба создают свой собственный синглтон.

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

(В моем случае каждое окно при запуске запрашивает все остальные окна, чтобы найти «главное» окно.)

Более чистым способом для этого является создание службы, аналогичной той, которую браузер предоставляет для JavaScript; но это требует написания кода на C, а не javascript, и делает установку расширения кросс-платформенной более сложной.

2 голосов
/ 02 мая 2009

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

У меня нет опыта в области, которую вы описываете. Однако синглтон кажется мне разумным вариантом.

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