EventEmitter (EventDispacher) の階層構造
フロントエンドにおいて、それなりに普遍的な問題な気もするんだけど、
例えば、何かDOMと紐づくクラスを作ると、
どうしても親子関係を持たせたくなって
class ParentUnit extends EventEmitter constructor: -> @childUnit = new ChildUnit render: -> """<div>#{@childUnit.render()}</div>""" class ChildUnit extends EventEmitter constructor: -> someHandler: (e) -> @emit "childevent", e render: -> "<p>child unit</p>" parentUnit = new ParentUnit parentUnit.on "childevent", -> # こうしたい
このとき、子から親にどうやってイベント(クリックとか)を伝えるかという問題に直面する。
1. バブリングさせる
class ParentUnit constructor: -> @childUnit = new ChildUnit @childUnit.on "childevent", @handlerChildEvent handlerChildEvent: (e) => @emit "childevent", e
メリット
- わかりやすい
- 子が疎結合を維持できる
- イベントを消したりまとめたり変形できる
デメリット
- 階層が深くなるとめんどい
- イベントを消したりまとめたり変形される
2. グローバルなEventEmitterを使う
globalEventEmitter = new EventEmitter class ChildUnit someHandler: (e) -> globalEventEmitter.emit "childevent", e
メリット
- 楽
デメリット
- 良くない
3. 親を引き連れ回す
class ChildUnit constructor: (@parent) -> someHandler: (e) -> @parent.emit "childevent", e
メリット
- イベントがそのまま届く
デメリット
- 気をつけないと子が密結合っぽくなる
- 似たようなことをするのに表現の仕方が多すぎる
4. EventEmitterをメンバとして持つ
parentEvent = new EventEmitter class ParentUnit constructor: (@eventEmitter) -> @childUnit = new ChildUnit @eventEmitter class ChildUnit constructor: (@eventEmitter) -> someHandler: (e) -> @eventEmitter.emit "childevent", e parentUnit = new ParentUnit parentEvent parentEvent.on "childevent", ->
メリット
- イベント用のオブジェクトが独立できる
デメリット
- あまり見ない
- イベント用のオブジェクトが独立してる
5. そもそも親子関係を持たせない
メリット
- 親も疎結合になる
- 複雑な親子関係を組む時、見通しが良い
デメリット
- めんどい
ちなみに eventemitter2 は名前空間を切れる
感想『日本SF短篇50 V』
Amazon.co.jp: 日本SF短篇50 V: 日本SF作家クラブ創立50周年記念アンソロジー (ハヤカワ文庫 JA ニ 3-5): 日本SF作家クラブ: 本
重力の使命 林譲治
70点
ハードな感じする。
竜の卵思い出した。
日本改暦事情 冲方丁
90点
普通におもしろい。
納得の映画化。
人に勧めるなら確実にこれ
ヴェネツィアの恋人 高野史緒
60点
難しくてよくわかんなかったです。
魚舟・獣舟 上田早夕里
85点
結構好きなやつ。
長編で読みたい
The Indifference Engine 伊藤計劃
75点
前に読んだ
白鳥熱の朝に 小川一水
70点
ギャルゲー感
自生の夢 飛浩隆
100点
飛浩隆は神
オルダーセンの世界 山本弘
60点
まあまあ
人間の王 Most Beautiful Program 宮内悠介
80点
すごく面白い
ただ、オチが自生の夢と似たようなコンセプトだから若干霞む
きみに読む物語 瀬名秀明
75点
面白い
そして内容もテッド・チャンっぽい
coffee + lodashでやらかす凡ミス
class MyClass hide: -> @visible = false
みたいなクラス作って lodash.eachで
_.each instances, (i) -> i.hide()
みたいな回し方すると全部回らなくて死ぬ
なぜかconsole.logすると動くみたいな闇な感じになって死ぬ
Google Chart API で QRコード作れる
しらなかった〜