GoTheDistance

ござ先輩と言われています。(株) クオリティスタートという会社をやっています。

AjaxとFlash

Ajaxって軽いよなぁ。Flashアプリで軽いFlashアプリってほとんど見たことが無い。軽いのは頑張って小さくしたSWFファイルサイズぐらいじゃないのか、と。

JavaScriptに元々組み込まれているオブジェクトであるXMLHttpRequestってので非同期にPOSTして、帰ってきたXMLをDOMで解析してDHTMLで特定のHTMLタグを書き換えて画面更新する流れなのはわかる。DHTML経由での画面更新処理が相当に軽いはず。

Flashアプリとかだと画面を初期化する際に相当な描画処理が内部的に走っているはずなので、どうしてもHTMLに比べて「画面の動きがもったりしている感」がぬぐえない時が過多ある。AjaxはRichだけどHeavyでないUI、普通のHTMLベースのUIなのにインタラクティブで軽量なのがすごい。

ただ「Webでできるクラサバ」的なアプリを求めると、Ajaxは心もとないかも。クライアントにデータを保持することができないのがネックになると思う。バイナリ通信もできないはず。

Flashだとオブジェクトをそのまま投げてjava.util.MapでゲットしてBeanUtils#populateでDTOにコピーしてー、みたいなことができるのがアツい。ORマッパー的な考えですね。

AjaxもFlashも共通的に気をつけないといけないことは、サーバー通信が非同期で発生する点だろう。ちゃんとデータを取ってきたコトを確認してから、ビジネスロジックを走らせないと予期せぬバグを生む。

なのでサーバー通信を行う時はそれだけを一つのFunctionとして切り出して、そのFunction内でサーバ通信を行ったことで得られるであろうデータを期待したような処理を書いてはいけないと思う。

//Main.as

function init() {
 var hoge = new Hoge();
 hoge.getShainInfo();

 //初期化処理がつらつら
doAfterInit();
}

function doAfterInit() {
//なんか処理
}

//Hoge.as
function getShainInfo() {
var lv = new LoadVars(); 
lv.sendAndLoad(url,param,method);
//便宜上こう書かせてください
lv.onLoad = Main.doAfterInit();
}

doAfterInit()をInit()の中で書いているのがダメ。getShainInfo()の処理が完了するのを待たずに初期化後処理が走るから。

あ、あとAjaxでDHTMLでDIVタグ更新するみたいなのはわかるんですが、そのあたりの設計をちゃんとやらないとものすごいスパゲティコードが生まれそうだし、微妙にハマりそう。それが一番怖いかな〜。