Hatena::Groupptech

ぷちてく RSSフィード

Archive
 
ProfileProfile

2014-10-15

XHRの違和感

05:26

どーもこんちわ。以下でXMLHttpRequest(XHR)に思ったポエム。

XHR、大枠だとなんかこんな感じで書くと思う。

var xhr = new XMLHttpRequest();
xhr.open(/* ... */);
xhr.xxxxType = 'xxxxx';
xhr.setXXXXX = 'xxxxx';
xhr.onload = function (e) { // and/or xhr.onreadystatechange
// ...
};
xhr.send(null);

慣れると違和感ないんだろうけど、なんとなく気持ち悪くて、直感だとこういう感じがする。

// FIXME wrong code
var xhr = new XMLHttpRequest();
xhr.xxxxType = 'xxxxx';       // ヘッダとか色々設定する
xhr.setXXXXX = 'xxxxx';
xhr.open(/* ... */);          // 設定を前提にして「開く」
xhr.onload = function (e) {   // ハンドラが処理する
// ...
};
xhr.send(null);               // ...という諸々をリクエストする

「こういう間違い多くて、open()という名前が良くない」というのを昔どこかで見た。「開く」という時点でリクエスト的なのが飛ぶとか、準備いるみたいに感じるのは自然だと思う。

どっちかっていうと、「プロパティonloadとかonreadystatechangeみたいなメソッドopen()関係ないですよー」「ただしプロパティで値設定するのはopen()した後な」という裏切り型のサンプルが多くて気持ち悪いし間違えそう。

// ...
httpRequest.onreadystatechange = function() { alertContents(httpRequest); };
httpRequest.open('GET', url, true);
httpRequest.send('');
Getting Started - AJAX | MDN

天下のMDNもこんな感じ。

statusとか全体の設計がー」とか聞くけど、時代を考えずに後世から批判するのは簡単で、それは厳しすぎる。

ただ、当時最高のプログラマが納期ないにしろ頑張って考えた物体なのに、もうちょっとにどうにかなんなかったのかなー・・位は思ってしまう。土台がアレだったからこうなった、と言われればそうかもしれないけど。


ロクに資料見ないで書いた。昔はこういう想像で書く気軽な記事が世の中に多かった気がする。キチッとしないと石斧が飛んできたり怒られたり、「追記」とかする状況になったからかもしれない。

きちんと調べるとキチッとしたもの出来るけど時間かかるから届くのにスピード感が減るし、ユルさみたいなものも失われて、書く楽しみがスポイルされていく感じがする。これがベンチマークとかだと、キチッとしてないと意味ないと思うけど、大多数の話は想像で指摘したりしても世の中には有益になると思う。

こうやって適当でふわっとしてて感性みたいなやつ投下して抵抗していきたい。

SyoichiSyoichi2014/10/16 06:21現在、ServiceWorkerなどの次世代のWeb標準のAPIに対応するリクエスト用の新しいAPIであるfetch()の仕様策定と各レンダリングエンジンへの実装が進行しているので、そう遠くない将来にXHRはfetch()に置き換えられるかもしれませんね。
https://fetch.spec.whatwg.org/

noromanbanoromanba2014/10/17 01:32> id:Syoichi
最近動向追ってないので助かります!とりあえずこれ眺めてみました。
http://html5experts.jp/myakura/8365/
ナウい設計で、Promises前提 w/*Workers みたいですね。確かにChromeも完全対応すれば一気に来るかも。
jsまわり、並列・非同期化で進めてこー、みたいな反面、思ったよりES6の実装進んでいかないなー、という印象です。

SyoichiSyoichi2014/10/17 10:19>並列・非同期化
この分野は、ES6ではPromiseとGeneratorは各JSエンジンで実装が出揃いつつありますが、SIMDのような試みはまだ一部でしか進んでいませんね。ES7でawaitと共に標準化が進むと良いですね。

>ES6の実装
これそのものは2015年に向けてかなり進んできているというのが私の認識です。SpiderMonkeyは既にClass、Module、Symbolの一部、TypedArray関連、RegExp関連以外では、主要な機能の基本的な実装はほぼ完了した状態になっています。V8もSpiderMonkeyで実装が進んでいない分野と様々な新規構文以外は実装されてきていますし、WebKitのJavaScriptCoreやIEのChakraも一部ではありますが徐々に実装されつつありますね。
Moduleは一昨日出たES6 draft Rev28でも大幅な更新があったりと、まだ仕様が安定していないのが実装が進んでこなかった原因だと思いますが、Moduleはこれでほぼ固まったはずですので、これから実装が進んでいくかもしれません。

参考
https://bugzilla.mozilla.org/show_bug.cgi?id=es6
http://www.2ality.com/2014/06/es6-schedule.html
http://www.2ality.com/2014/09/es6-modules-final.html
https://esdiscuss.org/topic/a-new-es6-draft-rev28

noromanbanoromanba2014/10/18 04:57できたてホヤホヤ!。2alityのmodules、AMD入るの!?。Generator楽しみですが、letの魔窟で沈没しそうです。確かに地固め出来て2015年スケジュール超加速するかも。Harmony出来てよかった。ES7が待ってる。
SIMDはこれ眺めました。
https://01.org/node/1495
ぼくは世間のコードが出てくるまで待って、気が向いたらkangaxさんのtable見る程度なんですが、意外とSpiderMonkeyないんですよね。

・・AMD、SIMDとか数年前ならCPUコアの話してるようにしか見えない。

トラックバック - http://ptech.g.hatena.ne.jp/noromanba/20141015