Domanda

Sto lavorando su un'estensione di Firefox in cui voglio mantenere sincronizzate più finestre con le stesse informazioni. La barra degli strumenti richiede periodicamente informazioni su un server remoto, in base all'apertura della finestra. Poiché le finestre di Firefox sono tutti ambienti autonomi separati, ognuno con la propria barra degli strumenti che esegue codice separato ho pensato che avrei usato un singleton qui. Non c'è davvero bisogno di più richieste, può esserci una richiesta per ciascuna delle finestre, ma il problema è che non esiste un ambito master globale che lo sovrascrive nel contesto di più finestre, ci sono solo contesti di Windows. Ho pensato di creare una classe factory che controlla se una delle finestre ha già un'istanza della mia classe di notifica in esecuzione e, in tal caso, utilizza quella stessa istanza per ottenere gli aggiornamenti.

Sembra un uso legittimo di un singleton, ma continuo a leggere su come sono bestie malvagie. È un uso accettabile?

È stato utile?

Soluzione

Il problema è che ogni finestra di Firefox è un processo completamente separato per quanto riguarda Javascript.

Quindi sì, funzionerà, ma solo se crei il singleton in modo condizionale. Se viene creato incondizionatamente nell'ambito globale (nel mio caso, come membro del mio oggetto di estensione di livello superiore), sarà in tutte le finestre.

L'altro problema che avrai è che Windows impiega un po 'di tempo per avviare ed eseguire javascript e non hai nulla di simile alla sincronizzazione. È del tutto possibile che la finestra 1 controlli per vedere se la finestra 2 ha creato il singleton, vede che non ha, la finestra 2 controlla la finestra 1, vede che non ha, e quindi entrambi creano il proprio singleton.

Parlo per esperienza: ho scritto un'estensione di Firefox che fa qualcosa di molto simile a quello che vuoi fare: solo una finestra dovrebbe controllare il server remoto (e tutte le altre finestre devono essere informate quando una finestra si chiude) .

(Nella mia, ogni finestra all'avvio interroga tutte le altre finestre per trovare la finestra "quotata".)

Il modo più pulito per aggirare questo è creare un servizio, proprio come quelli che il browser espone a javascript; ma ciò richiede la codifica in C, non javascript, e rende l'installazione dell'estensione multipiattaforma più una seccatura.

Altri suggerimenti

Non c'è nulla di intrinsecamente sbagliato in un singleton, di per sé. Il problema sta nel modo in cui può essere (ab) utilizzato: è essenzialmente un modo elegante per avere i globuli. Un singleton ti consente solo di avere un livello di riferimento indiretto che contiene da solo la maggior parte di quei dati. A volte, tuttavia, questo modello è l'unico modo per risolvere determinati problemi. In quel caso, va benissimo. Tuttavia, se riesci a pensare a un altro modo che utilizza forse solo un po 'più di codice / memoria / performance-hit per realizzare, lo farei se potessi. Altrimenti, non c'è davvero niente di sbagliato nell'usare un singleton, purché tu sia consapevole di cosa stai prendendo.

I singoli non sono malvagi. È il loro abuso che è ... (Di solito puoi cavartela usando il contenitore DI per avere la tua istanza "singletoned" che rende questo schema un po 'meno raccomandato).

Non ho alcuna esperienza nell'area che descrivi. Comunque singleton mi sembra un'opzione ragionevole.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top