AzureaScript?のイベントハンドラ周りについて

  • ページ: 目安箱
  • 投稿者: tmyt?
  • 優先順位: 低
  • 状態: 却下
  • カテゴリー: 意見募集
  • 投稿日: 2011-04-02 (土) 17:02:30
  • バージョン:

メッセージ

現在、目安箱/4,目安箱/5,目安箱/6においていくつかのイベントハンドラ追加に対する提案が挙げられている。 これらのイベントハンドラの実装はかなり前向きではあるが、実装をどの用に行うかを決めかねている。

現在、スクリプトのインスタンスはファイルごとに別々の空間になっている。しかし、スクリプトのインスタンスが参照しているSystemやTwitterService?をはじめとする定義済みオブジェクトはすべてメモリ上の同一インスタンスを参照している。 このため、次の様な実装を行った際にどのインスタンスを参照しているのかを特定する実装が必要となる。

System.onQuit = function(arg){};

インスタンスを区別せずに、代入を行った際に内部のリストに追加する実装も考えられるが、イベントハンドラの削除を行うことができなくなってしまう。C#では次のような形でイベントハンドラの追加、削除を行う。

// Add
System.onQuit += <Handler>;
// Remove
System.onQuit -= <Handler>;

この構文を採用したいのではあるが、Javascriptの制限から+=や-=といった表現を採用できない。そこで、Javascriptを採用した開発環境である、Titaniumを参考にし、次のような形でイベントハンドラの追加、削除の実装を行おうと思う。

// Event handler
function Handler(arg){
    // Some instructions
}
// Add
System.addEventListener('quit', Handler);
// Remove
System.removeEventListener('quit', Handler);

イベントハンドラの追加/削除をこのように実装した後に、PreSendUpdateStatus? イベントハンドラなどの変更も考えている。

現在、PreSendUpdateStatus?イベントをはじめとした、いくつかのTwitter関連のイベントハンドラは、スクリプトファイルのグローバル空間に同一の名前を持った関数を定義することにより行っている。これらイベントハンドラの登録をTwitterService?.addEventListener?()用いることによって登録する形に変更しようと思う。

現状の実装はイベント毎にすべてのスクリプトに対してイベントハンドラ関数が登録されているかを問い合わせ、登録されていれば呼び出しを行うためにスクリプトファイルごとに約数十msのオーバーヘッドが生じている。 これを、addEventListener?を用いてスクリプトが能動的にハンドラを追加することで必要最低限のオーバーヘッドで処理が完了するので、全体的なパフォーマンスの向上も考えられる。

現状のイベント処理ががらっと変わるので、是非意見を頂けるとありがたい。


  • TitaniumのaddEventListener?, removeEventListener?は、単純にW3C DOM Level2 Events[ http://www.w3.org/TR/DOM-Level-2-Events/ecma-script-binding.html ]を踏襲したものと思われる。eventが発火するobjectに対して、addEventListener?するのは、良い方針だとかんがえる。 -- ne_sachirou? 2011-04-03 (日) 22:58:35
  • System, TwitterService?, TextArea? それぞれに対し、add/removeEventListener?を経由したイベントを実装した。また、グローバル空間に宣言することで使用していたイベントはTwitterService?.addEventListener?を経由するように変更した。 -- tmyt? 2011-04-05 (火) 18:41:17

もし見えてたら空欄にしてね!:

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-08-27 (土) 10:33:40 (1247d)