Beim Entwerfen einer API, die eine Schnittstelle zum Abhören von Ereignissen bereitstellt, gibt es anscheinend zwei widersprüchliche Methoden zum Behandeln von Aufrufen zum Hinzufügen / Entfernen von Listenern:
Bei mehreren Aufrufen von addListener wird nur ein einziger Listener hinzugefügt (wie beim Hinzufügen zu einem Set). kann mit einem einzigen Aufruf von removeListener entfernt werden.
Bei mehreren Aufrufen von addListener wird jedes Mal ein Listener hinzugefügt (z. B. zum Hinzufügen zu einer Liste). muss durch mehrere Aufrufe von removeListener ausgeglichen werden.
Ich habe jeweils ein Beispiel gefunden: (1) - Der Aufruf von DOM addEventListener in Browsern fügt Listener nur einmal hinzu, ignoriert stillschweigend Anfragen, denselben Listener ein zweites Mal hinzuzufügen, und (2) - jQuery- .on
Verhalten fügt Listener mehrmals hinzu .
Die meisten anderen Listener-APIs scheinen (2) zu verwenden, z. B. SWT- und Swing-Ereignis-Listener. Wenn (1) ausgewählt ist, stellt sich auch die Frage, ob es stillschweigend oder mit einem Fehler fehlschlagen soll, wenn derselbe Listener zweimal hinzugefügt werden muss.
In meinen Implementierungen bleibe ich eher bei (2), da es eine übersichtlichere Setup- / Teardown-Schnittstelle bietet und Fehler aufdeckt, bei denen das Setup unbeabsichtigt zweimal durchgeführt wird und mit den meisten Implementierungen übereinstimmt, die ich gesehen habe.
Dies führt mich zu meiner Frage: Gibt es eine bestimmte Architektur oder ein anderes zugrunde liegendes Design, das sich besser für die andere Implementierung eignet? (dh: warum existiert das andere Muster?)
foo
== bar
, dann würde es überschreiben, andernfalls würde es eins foo
und eins bar
als Zuhörer haben. Wenn es immer überschrieben würde, wäre es keine Menge, sondern ein einzelnes Objekt, das einen Beobachter darstellt.
addListener(foo); addListener(foo); addListener(bar);
. Fügt Ihr Fall Nr. 1 einsfoo
und eins hinzubar
oder nurbar
(dhbar
überschreibtfoo
als Hörer)? Würde Fall 2foo
zweimal oder einmal feuern?