JS と私と HTTP 通信

現在、私は JavaScript を、主にウェブ上の定期的なメンテナンス作業のために利用しています。これは、Bloglines Notifier (id:reinyannyan:20051018:p1) の記事でご紹介したように、ウェブ・ページをタスクバー項目にできることを知っていたため、JavaScript という言語が HTTP 通信を伴う常駐プログラムの開発に適していると考えたからです*1

さて、開発をするなかで私が最も腐心したのが、いかにオブジェクト指向的にプログラミングするか、ということでした。でも、なかなか「これ!」という方法論と言うか、理想的な様式を見出すことができず、試行錯誤を繰り返していました。

そんな時に出会ったのが prototype.js (以下 Prototype) だったのです。

ただ、上述のように、私の主な関心事はバックグラウンドでの HTTP 通信であり、一般的なウェブ開発ではありませんので、Prototype の提供する殆どの機能は私にとって必要の無いものでした。

そんな私を Prototype が強く魅了した点は、Class.create() という明快なクラス宣言、自動的な初期化メソッドの呼び出し、そして (new Klass).extend() によるクラス継承*2といった、クラス・ベース的オブジェクト指向の仕組みでした。

この出会いは私の中に、まさにパラダイム・シフトをもたらしました。私の JavaScript 観が決定的に方向付けられた瞬間であり、またクラス・ベースの世界で培われた叡智をそのまま JavaScript の世界に適用できる、という大きな可能性を切り開いた事件でした。

以上のようなことを踏まえて、今の私が HTTP 通信の機能をどのように JavaScript で実装しているかを見ていただこうと思います。下記のクラス群が主に関わっています:

XMLHTTP (API。呼び出されたメソッドを Command.HTTPReq オブジェクト化し、センターに投げる)

Command (抽象)
Command.HTTPReq (具象。XMLHTTP.Req オブジェクトを生成、実行)

Command.Center (Command オブジェクトを受け付けるセンター)
Command.Center.Manager (センターの中の人)

XMLHTTP.Req (呼び出されたメソッドに応じて、下のいずれか一つを Mix-in する)
XMLHTTP.Req.GET  (具象メソッド "act" を実装 (モジュールとして))
XMLHTTP.Req.HEAD (同上)
XMLHTTP.Req.POST (同上)

元は Bloglines Notifier のためだけの実装でしたので、クラス一つか二つの単純な構造でした。が、間もなく大量の HTTP リクエストを行うタスクを組み入れるようになったため、一斉にリクエストの数と同じだけの HTTP 通信をしてしまわないような仕組みを必要としました (同期通信は Bloglines Notifier が止まってしまうため論外でした)。

当初は配列でリクエストを溜めていたんですが、Prototype との出会いによって、上のように発展していったわけです。

ちなみに呼び出し側は、単純に

var http = new XMLHTTP;
http.post(url [,on_complete_handler [,option]]);

等とするだけです。

また、この XMLHTTP というクラスは XMLHTTP.Req クラスがサポートするメソッドを動的に取得して公開する仕組みになっており、新たなメソッドの追加が容易です (実際、MIRROR 等の独自なメソッドがあります)。

つづく

*1:実際にはローカルの HTML ファイルを指定できなくて困りましたが。参照: http://d.hatena.ne.jp/brazil/20051210/1134191161

*2:これは現在の Prototype からは失われました。そこから生まれたのが http://www.bloglines.com/blog/reinyannyan?id=1 です