Pregunta

Estoy trabajando en una extensión de Firefox donde desearé mantener varias ventanas sincronizadas con la misma información. La barra de herramientas consulta la información de un servidor remoto periódicamente, según el momento en que se abrió la ventana. Debido a que las ventanas de Firefox son entornos independientes por separado, cada uno con su propia barra de herramientas ejecutando un código separado, pensé que usaría un singleton aquí. Realmente no hay necesidad de solicitudes múltiples, puede haber una solicitud para cada una de las ventanas, aunque el problema es que no hay un alcance maestro global que las sobrescriba en el contexto de ventanas múltiples, solo hay contextos de ventanas. Pensé que crearía una clase de fábrica que compruebe si una de las ventanas ya tiene una instancia de mi clase de notificación en ejecución y, si es así, utiliza esa misma instancia para obtener actualizaciones.

Parece un uso legítimo de un singleton, pero sigo leyendo sobre cómo son bestias malvadas. ¿Es este un uso correcto?

¿Fue útil?

Solución

El problema es que cada ventana de Firefox es un proceso completamente separado en lo que respecta a Javascript.

Así que sí, funcionará, pero solo si creas condicionalmente el singleton. Si se crea de forma incondicional en el ámbito global (en mi caso, como miembro de mi objeto de extensión de nivel superior), estará en todas las ventanas.

El otro problema que tendrás es que las ventanas tardan un poco en iniciar y ejecutar javascript, y no tienes nada como la sincronización. Es completamente posible que la ventana 1 verifique si la ventana 2 ha creado el singleton, ve que no tiene, la ventana 2 verifica la ventana 1, ve que no, y ambos crean su propio singleton.

Hablo por experiencia: escribí una extensión de Firefox que hace algo muy parecido a lo que quieres hacer: se supone que solo una ventana comprueba el servidor remoto (y todas las demás ventanas deben estar informadas cuando se cierra una ventana) .

(En la mía, cada ventana en el inicio consulta todas las demás ventanas para encontrar la ventana "maestro").

La forma más limpia de evitar esto es crear un servicio, al igual que los que el navegador expone a javascript; pero eso requiere codificación en C, no en javascript, y hace que la instalación de la extensión multiplataforma sea un problema.

Otros consejos

No hay nada inherentemente incorrecto con un singleton, per se. El problema radica en cómo se puede (ab) usar: es esencialmente una forma elegante de tener globales. Un singleton solo le permite tener un nivel de direccionamiento indirecto que contiene la mayor parte de esos datos. A veces, sin embargo, este patrón es la única forma en que puede resolver ciertos problemas. En ese caso, está perfectamente bien. Sin embargo, si puede pensar en otra forma que use tal vez solo un poco más de código / memoria / impacto en el rendimiento para lograrlo, lo haría si pudiera. De lo contrario, realmente no hay nada de malo en usar un singleton, siempre y cuando sepas en qué te estás metiendo.

Los singletones en sí mismos no son malos. Es su abuso el que ... (Por lo general, puede salirse con la utilización del contenedor DI para tener su instancia "singletoned", lo que hace que este patrón sea menos recomendado).

No tengo ninguna experiencia en el área que describe. Sin embargo, Singleton me parece una opción razonable.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top