Ao projetar uma API que fornece uma interface de escuta de eventos, parece haver duas maneiras conflitantes de tratar chamadas para adicionar / remover ouvintes:
Várias chamadas para addListener adicionarão apenas um único ouvinte (como adicioná-lo a um conjunto); pode ser removido com uma única chamada para removeListener.
Várias chamadas para addListener adicionarão um ouvinte a cada vez (como adicioná-lo a uma lista); deve ser equilibrado por várias chamadas para removeListener.
Encontrei um exemplo de cada um: (1) - A chamada DOM addEventListener nos navegadores apenas adiciona ouvintes uma vez, ignorando silenciosamente as solicitações para adicionar o mesmo ouvinte pela segunda vez e (2) - o .on
comportamento do jQuery adiciona ouvintes várias vezes .
A maioria das outras APIs de ouvintes parece usar (2), como ouvintes de eventos SWT e Swing. Se (1) for escolhido, há também a questão de saber se deve falhar silenciosamente ou com um erro quando houver uma solicitação para adicionar o mesmo ouvinte duas vezes.
Nas minhas implementações, costumo seguir com (2), uma vez que fornece uma interface mais limpa do tipo configuração / desmontagem e revela bugs em que a 'instalação' é feita acidentalmente duas vezes e é consistente com a maioria das implementações que já vi.
Isso me leva à minha pergunta - Existe uma arquitetura específica ou outro design subjacente que se presta melhor à outra implementação? (ou seja: por que o outro padrão existe?)
foo
== bar
, ele seria substituído, caso contrário, ele teria um foo
e um bar
como ouvintes. Se sempre sobrescrevesse, não seria um conjunto, mas um único objeto que representava um observador.
addListener(foo); addListener(foo); addListener(bar);
. O seu caso nº 1 adiciona umfoo
e umbar
, ou apenasbar
(ou seja,bar
sobrescrevefoo
como ouvinte)? No caso 2,foo
dispararia duas ou uma vez?