質問

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

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

役に立ちましたか?

解決

問題は、各FirefoxウィンドウがJavascriptに関する限り完全に独立したプロセスであるということです。

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

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

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

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

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

他のヒント

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top