イベントリスニングインターフェイスを提供するAPIの設計では、リスナーの追加/削除の呼び出しを処理する方法が2つ競合しているようです。
addListenerを複数回呼び出しても、1つのリスナーのみが追加されます(セットに追加するなど)。removeListenerを1回呼び出すだけで削除できます。
addListenerを複数回呼び出すと、毎回リスナーが追加されます(リストに追加するなど)。removeListenerへの複数の呼び出しでバランスを取る必要があります。
私はそれぞれの例を見つけました:(1)-ブラウザーのDOM addEventListener呼び出しはリスナーを1回だけ追加し、同じリスナーを2回追加する要求を静かに無視します(2)-jQuery .on
動作はリスナーを複数回追加します。
SWTやSwingイベントリスナーなど、他のほとんどのリスナーAPIは(2)を使用しているようです。(1)を選択した場合、同じリスナーを2回追加する要求があったときに、通知なしに失敗するのか、エラーで失敗するのかという問題もあります。
私の実装では、よりクリーンなセットアップ/ティアダウンタイプのインターフェースを提供し、「セットアップ」が意図せずに2回行われ、私が見たほとんどの実装と一致するバグを明らかにするため、私は(2)に固執する傾向があります。
これは私の質問につながります-他の実装に向いている特定のアーキテクチャまたは他の基本的な設計はありますか?(つまり、なぜ他のパターンが存在するのですか?)
foo
==のbar
場合、それは上書きされ、そうでなければ、リスナーとして1つと1つfoo
を持ちbar
ます。常に上書きされた場合、それはセットではなく、オブザーバーを表す単一のオブジェクトになります。
addListener(foo); addListener(foo); addListener(bar);
。あなたのケース#1は1と1を追加しますfoo
かbar
、それともbar
(つまり、リスナーとしてbar
上書きするfoo
)だけですか?ケース#2の場合、foo
2回または1回発砲しますか?