イベントのデリバリ

私にとって、プログラム内部の通信で同期的なイベント送信を使うとうれしいのは、イベント発行側が購読者のことを全く知らなくてもいいことです。

例えば、汎用的な機能を部品にパッケージしたとします。処理経過を呼び出し側にメッセージ送信で通知するよう実装することもできますが、

  • 通知先の個数をある程度特定しないと部品を設計できない
  • 通知機能が不要な状況の時でも動かすためには、ダミーの通知メソッドを実装しておくか、部品側で通知要否の判定を実装するなどが必要

という感じで、不必要に密結合となってしまいます。
しかしイベントで通信する場合は、購読者の数がいくついるかは一切考えなくてもいいので、部品間が疎結合になるように設計しやすいです。

また、Callback相手のオブジェクトを覚えているとオブジェクト間の参照関係がサイクルを作ってしまうので、ガベージコレクタを持たない(MS.NETより前の)インフラ世界ではメモリ管理が面倒になる、という話も昔はありましたね。

もっともMS世界のイベント送信はとても重いもので、通常のメソッド呼び出しより10倍以上のオーバーヘッドがかかったため、調子に乗ってイベントをがんがん使っていると、とても遅いプログラムができてしまったということもありました。

Tweakの非同期デリバリのモデルは、Croquetのisland間のメッセージ通信のように、イベントのデリバリ順番さえ保障されていればよいという場合にはぴったりだと感じます。ですがプログラム内部での通信にイベントを使う場合は、慣れているせいもありますが同期デリバリのほうが使いやすく感じます。

非同期・同期どちらでもいい局面だったら、どっちを使うほうがいいのでしょうかね。