Question

Je travaille sur une extension Firefox où je souhaite synchroniser plusieurs fenêtres avec les mêmes informations. La barre d'outils interroge périodiquement un serveur distant pour obtenir des informations, en fonction de la date d'ouverture de la fenêtre. Comme les fenêtres de Firefox sont des environnements autonomes distincts, chacun avec sa propre barre d’outils exécutant un code séparé, je pensais utiliser un singleton ici. Il n'y a vraiment pas besoin de requêtes multiples, il peut y avoir une requête pour chacune des fenêtres. Le problème est qu'il n'y a pas d'étendue principale globale qui la superpose au contexte de fenêtres multiples, il n'y a que des contextes de fenêtres. Je pensais que je créerais une classe fabrique qui vérifiera si l'une des fenêtres a déjà une instance de ma classe de notification en cours d'exécution et, le cas échéant, utilise cette même instance pour obtenir des mises à jour.

Cela semble être une utilisation légitime d'un singleton, mais je ne cesse de lire en quoi ces bêtes sont méchantes. Est-ce une utilisation acceptable?

Était-ce utile?

La solution

Le problème est que chaque fenêtre de Firefox est un processus entièrement séparé en ce qui concerne Javascript.

Alors oui, cela fonctionnera, mais uniquement si vous créez le singleton de manière conditionnelle. S'il est simplement créé de manière inconditionnelle au niveau global (dans mon cas, en tant que membre de mon objet extension de niveau supérieur), il le sera dans toutes les fenêtres.

L'autre problème que vous allez avoir est que Windows prend un certain temps pour démarrer et exécuter JavaScript, et vous n'avez rien de comparable à la synchronisation. Il est tout à fait possible que la fenêtre 1 vérifie si la fenêtre 2 a créé le singleton, voit que ce n'est pas le cas, que la fenêtre 2 vérifie la fenêtre 1, voit que ce n'est pas le cas, puis que les deux créent leur propre singleton.

Je parle d'expérience: j'ai écrit une extension Firefox qui ressemble beaucoup à ce que vous voulez faire: une seule fenêtre est supposée vérifier le serveur distant (et toutes les autres fenêtres doivent être informées à la fermeture d'une fenêtre). .

(Dans la mienne, chaque fenêtre au démarrage interroge toutes les autres fenêtres pour trouver la fenêtre "maître".)

La solution la plus simple consiste à créer un service, tout comme ceux que le navigateur expose à javascript; mais cela nécessite de coder en C, pas de javascript, et rend l'installation de l'extension multiplateforme plus pénible.

Autres conseils

Il n'y a rien de fondamentalement faux avec un singleton, en soi. Le problème réside dans la façon dont il peut être utilisé (ab): c’est essentiellement une manière élégante d’avoir des globals. Un singleton vous permet simplement d’avoir un niveau d’indirection qui contient la plupart de ces données. Parfois, cependant, ce modèle est le seul moyen de résoudre certains problèmes. Dans ce cas, c'est parfaitement bien. Cependant, si vous pouvez imaginer une autre méthode utilisant peut-être un peu plus de code, de mémoire ou de performances à accomplir, je choisirais cette solution si je le pouvais. Sinon, l'utilisation d'un singleton n'a rien d'anormal, à condition que vous sachiez dans quoi vous vous engagez.

Les singletons eux-mêmes ne sont pas mauvais. C’est leur abus qui est ... (Vous pouvez généralement vous en tirer en utilisant le conteneur DI pour que votre instance soit "singletoned", ce qui rend ce modèle plutôt moins recommandé).

Je n'ai aucune expérience dans le domaine que vous décrivez. Cependant, singleton me semble être une option raisonnable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top