Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

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

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top