Pergunta

Eu estou trabalhando em uma extensão do Firefox onde eu vou querer manter várias janelas em sincronia com a mesma informação. A barra de ferramentas consulta um servidor remoto para informações periodicamente, com base em quando a janela foi aberta. Porque as janelas do Firefox são todos os ambientes independentes separadamente, cada um com sua própria barra de ferramentas executar código separado eu pensei em usar um singleton aqui. Não há realmente nenhuma necessidade de várias solicitações, pode haver um pedido de cada uma das janelas, o problema é que embora não há espaço mestre global ao longo dominando-lo sobre o contexto janelas múltiplas, só há contextos janelas. Eu pensei em criar uma classe de fábrica que verifica se uma das janelas já tem uma instância da minha classe notificação correndo e se assim usa a mesma instância para obter atualizações.

Parece que um uso legítimo de um singleton, mas eu manter a leitura sobre como eles são feras. É este um uso ok?

Foi útil?

Solução

O problema é que cada janela do Firefox é um processo totalmente separado, tanto quanto Javascript está em causa.

Então, sim, ele vai trabalhar, mas só se você condicionalmente criar o singleton. Se é apenas incondicionalmente criado no escopo global (no meu meu caso, como um membro da minha de nível superior objeto de extensão), que vai estar em todas as janelas.

O outro problema que você vai ter é que as janelas demorar um pouco para começar e executar JavaScript, e você não tem qualquer coisa como sincronização. É inteiramente possível que a janela 1 verifica para ver se a janela 2 criou o Singleton, vê que não tem, janela 2 janela de verificação 1, vê que não tem, e então ambos criar seu próprio singleton.

Falo por experiência: Eu escrevi uma extensão do Firefox que faz algo muito parecido com o que você quer fazer: apenas uma janela é suposto para verificar o servidor remoto (e todas as outras janelas precisam ser informados quando qualquer fecha a janela um) .

(Em minha, cada janela em consultas de start-up todas as outras janelas para encontrar a janela "mestre").

A maneira mais limpa de contornar isso é criar um serviço, assim como os que os expõe navegador para javascript; mas que exige a codificação em em C, não javascript, e torna a instalação teh multiplataforma extensão mais de uma dor.

Outras dicas

Não há nada de intrinsecamente errado com um singleton, per se. As mentiras problema no modo como ele pode ser (ab) usado: é essencialmente uma maneira elegante de ter globals. Um singleton apenas permite que você tem um nível de engano que a auto-contém a maioria dos dados. Às vezes, porém, esse padrão é a única maneira você pode resolver alguns problemas. Nesse caso, é perfeitamente bem. No entanto, se você pode pensar em outra maneira que usos talvez só um pouquinho mais de código / memória / performance-hit para realizar, eu iria com que se pudesse. Caso contrário, não há realmente nada de errado com o uso de um singleton, contanto que você está ciente do que você está se metendo.

Singletons si não são o mal. É o abuso que é ... (Você normalmente pode obter afastado com o uso recipiente DI para ter o seu exemplo "singletoned" o que torna esse padrão bastante menos recomendado).

Eu não tenho qualquer experiência na área que você descreve. No entanto Singleton parece-me como opção razoável.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top