add○○という関数に対してremove○○を用意しない実装


このコンセプトは、「追加したヤツが責任を持って削除するべき」「追加したヤツのよかり知らぬところで削除させない」という発想に基づいている。

remove 関数を用意する代わりに、add 関数が remove 関数を返す。

以下は CoffeeScript の例。

"use strict"

module.exports = ->
  listeners = {}
  notifying = {}
  return {
    addListener: (eName, listener) ->
      listeners[eName] ?= []
      return (->) if listener in listeners[eName]
      listeners[eName].push listener
      return -> # remove 関数
        i = listeners[eName].indexOf listener
        if i >= 0
          listeners[eName].splice i, 1
    notify: (eName) ->
      return if notifying[eName] # 無限ループ防止用
      notifying[eName] = true
      listener.apply undefined, arguments for listener in (listeners[eName] or [])
      notifying[eName] = false
  }