У меня действительно есть потребность в Синглтоне?
-
03-07-2019 - |
Вопрос
Я работаю над расширением Firefox, где я хочу синхронизировать несколько окон с одной и той же информацией. Панель инструментов периодически запрашивает информацию на удаленном сервере в зависимости от того, когда было открыто окно. Поскольку все окна Firefox - это отдельные автономные среды, каждая со своей собственной панелью инструментов, на которой выполняется отдельный код, я подумал, что здесь я буду использовать синглтон. В действительности нет необходимости в нескольких запросах, может быть один запрос для каждого из окон, однако проблема заключается в том, что нет глобальной главной области, которая переопределяет его в контексте нескольких окон, есть только контексты окон. Я подумал, что создам фабричный класс, который проверяет, есть ли в одном из окон уже запущенный экземпляр моего класса уведомлений и, если да, использует этот же экземпляр для получения обновлений.
Это похоже на законное использование синглтона, но я продолжаю читать о том, как они злые звери. Это нормально?
Решение
Проблема в том, что каждое окно Firefox - это совершенно отдельный процесс в отношении Javascript.
Так что да, это сработает, но только если вы условно создадите синглтон. Если он просто безоговорочно создан в глобальной области (в моем случае, как член моего объекта расширения верхнего уровня), он будет во всех окнах.
Другая проблема, с которой вы столкнетесь, заключается в том, что для запуска и запуска javascript окнам требуется некоторое время, а у вас нет ничего похожего на синхронизацию. Вполне возможно, что окно 1 проверяет, создало ли окно 2 синглтон, видит, что оно не имеет, окно 2 проверяет окно 1, видит, нет ли, и затем оба создают свой собственный синглтон.
Я говорю по своему опыту: я написал расширение для Firefox, которое делает нечто очень похожее на то, что вы хотите сделать: только одно окно должно проверять удаленный сервер (и все другие окна должны быть проинформированы, когда закрывается какое-либо одно окно) . р>
(В моем случае каждое окно при запуске запрашивает все остальные окна, чтобы найти «главное» окно.)
Более чистый способ - создать службу, подобную той, которую браузер предоставляет для javascript; но это требует написания кода на C, а не javascript, и делает установку расширения кросс-платформенной более трудной. Р>
Другие советы
По сути, нет ничего плохого в одиночке. Проблема заключается в том, как его можно использовать (ab): это по сути причудливый способ иметь глобальные переменные. Синглтон позволяет вам иметь уровень косвенности, который содержит большую часть этих данных. Однако иногда этот шаблон - единственный способ решить определенные проблемы. В этом случае это прекрасно. Однако, если вы можете придумать другой способ, который использует чуть больше кода / памяти / производительности для достижения, я бы пошел на это, если бы мог. В противном случае нет ничего плохого в использовании синглтона, если вы знаете, во что ввязываетесь.
Синглтоны сами по себе не являются злом. Это их злоупотребление ... (Обычно вы можете избежать использования DI-контейнера, чтобы иметь свой экземпляр "singletoned", что делает этот шаблон менее рекомендуемым).
У меня нет никакого опыта в области, которую вы описываете. Однако синглтон кажется мне разумным вариантом.