2009-05-01 1 views
2

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

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

+0

Точно, какой будет синглтон? – willcodejavaforfood

ответ

2

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

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

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

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

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

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

+0

Я подумаю, может быть, я проведу время и время, чтобы увидеть, есть ли несколько экземпляров, и если так удалить все, кроме одного? Hrm –

+0

Честно говоря, я бы даже не потрудился, если он не супер. Помните, что память, потребляемая каждой копией расширения окна, представляет собой размер кода плюс любые объекты, которые создает код. Если вы закончите писать много кода для удаления небольшого объекта, вы уже проигрываете. – tpdi

3

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

+0

Ну, все расширение является глобальной областью. Таким образом, либо он помещает глобальную область с кучей дерьма, либо он все это в одном объекте, и помещает глобальную область видимости с одним объектом (плюс загружает его, чтобы загрузить его). Я сделал последнее. – tpdi

+0

Ну, все расширение находится в глобальном масштабе. Это просто дополнительный вар или варс в окне.Таким образом, либо он помещает глобальную область с кучей дерьма, либо он все это в одном объекте, и помещает глобальную область видимости с одним объектом (плюс загружает его, чтобы загрузить его). Я сделал последнее. – tpdi

+0

Crap, я не могу удалить свой первый комментарий. – tpdi

2

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

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