2

複数のウィンドウを同じ情報と同期させたいFirefox拡張機能に取り組んでいます。ツールバーは、ウィンドウが開いた日時に基づいて、リモートサーバーに定期的に情報を照会します。Firefoxウィンドウはすべて個別に自己完結型の環境であるため、それぞれに個別のコードを実行する独自のツールバーがあり、ここではシングルトンを使用すると思いました。実際には複数のリクエストは必要ありません。ウィンドウごとに1つのリクエストが存在する可能性がありますが、問題は、複数のウィンドウコンテキストを支配するグローバルマスタースコープがなく、ウィンドウコンテキストしかないことです。ウィンドウの1つに通知クラスのインスタンスがすでに実行されているかどうかを確認するファクトリクラスを作成し、実行されている場合は同じインスタンスを使用して更新を取得すると思いました。

シングルトンの合法的な使用のようですが、私はそれらがどのように邪悪な獣であるかについて読み続けています。これは大丈夫ですか?

4

3 に答える 3

3

シングルトン自体には本質的に何も問題はありません。問題は、それをどのように(乱用)使用できるかにあります。それは本質的にグローバルを持つための素晴らしい方法です。シングルトンを使用すると、そのデータのほとんどを自己完結させるレベルの間接参照を使用できます。ただし、特定の問題を解決できる唯一の方法がこのパターンである場合もあります。その場合、それは完全に問題ありません。ただし、コード/メモリ/パフォーマンスヒットを少しだけ多く使用して達成する別の方法を考えられる場合は、可能であればそれを使用します。それ以外の場合は、自分が何に取り組んでいるのかを認識している限り、シングルトンを使用しても何も問題はありません。

于 2009-05-01T20:56:33.850 に答える
2

シングルトン自体は悪ではありません。それは彼らの悪用です...(通常、DIコンテナを使用してインスタンスを「シングルトーン」にすることで、このパターンの推奨を少なくすることができます)。

あなたが説明している分野での経験はありません。しかし、シングルトンは私には合理的な選択肢のように思えます。

于 2009-05-01T20:57:34.317 に答える
2

問題は、JavaScriptに関する限り、各Firefoxウィンドウが完全に別個のプロセスであるということです。

そうですね、それは機能しますが、条件付きでシングルトンを作成する場合に限ります。グローバルスコープで(私の場合は、最上位の拡張オブジェクトのメンバーとして)無条件に作成された場合、すべてのウィンドウに表示されます。

もう1つの問題は、WindowsがJavaScriptを起動して実行するのに時間がかかり、同期のようなものがないことです。ウィンドウ1がウィンドウ2がシングルトンを作成したかどうかを確認し、作成していないことを確認し、ウィンドウ2がウィンドウ1を確認し、作成していないことを確認してから、両方が独自のシングルトンを作成することは完全に可能です。

私は経験から話します:私はあなたがやりたいことと非常によく似た何かをするFirefox拡張機能を書きました:リモートサーバーをチェックするのは1つのウィンドウだけです(そして他のすべてのウィンドウは誰かのウィンドウが閉じたときに通知される必要があります)。

(私の場合、起動時の各ウィンドウは他のすべてのウィンドウにクエリを実行して「マスター」ウィンドウを見つけます。)

これを回避するためのよりクリーンな方法は、ブラウザーがjavascriptに公開するサービスと同じようにサービスを作成することです。ただし、これにはjavascriptではなくCでのコーディングが必要であり、拡張機能のクロスプラットフォームのインストールがさらに面倒になります。

于 2009-05-01T21:05:31.803 に答える