More Related Content
Similar to 大規模なギョームシステムにHaxeを採用してみた話
Similar to 大規模なギョームシステムにHaxeを採用してみた話 (20)
大規模なギョームシステムにHaxeを採用してみた話
- 3. terurouです。
• Web・GUI・分散処理を手広くやってます
– Windows 8(なんとか Style Apps), Silverlight,
JavaScript, Android, …
– Cassandra, 自作KVS, AWS, …
– DataGridの自作に定評があるらしいです
• フロントエンド寄りのアーキテクチャの設計が
割と得意です
– MVC/MVVM, Client-side Cache, 通信, …
3
- 8. ActionScript と C# によく似た言語
• 構文はActionScriptに似ている
• 提供している機能はほぼC#
– enum(パターンマッチ)と構造的部分型を足し、
– LINQとeventとasync/awaitを引く
– メソッドをdelegateとして扱える
• thisのスコープがメソッドにバインドされる
– using mixin = 拡張メソッド
– ラムダ式、レキシカルクロージャ
8
- 12. システムについてざっくりと
• ギョーム系SaaS
– セルフカスタマイズとかもあるよ!
– 画面レイアウト情報を動的に扱う
• HTML5/JavaScript, Ext JS
• Java, PostgreSQL, Cassandra
• IE9~ + モダンブラウザの最新版に対応
12
- 17. 既存コードの問題点
• Ext JSのMVCを採用していた
– 自動スクリプトローディングや独自OOPなど、
深く学習しないとコードを読み書きできない。
– 実装者のスキル不足もあり、訳がわからなく…
– 個人的には「この設計思想はないわー」
• データ構造・管理が破綻
– JavaScriptが柔軟(動的)すぎる
– 「このオブジェクトにデータ入れちゃえ!」
17
- 18. で、どうするか
• Haxeを採用
– 型をキッチリ管理したい
– まともなモジュールシステムが必須
– 数か月学習していたので不安はなかった
• MVCは独自実装に変更
– 既成のMVC Frameworkでは要件に合わない
– システムが少々特殊
– でもExt JSのUIコンポーネントは使いたい
18
- 20. typedef/enumの例
enum ComponentType {
コンポーネントの種別を
Text(x : TextDefinition); enumで定義
Number(x : NumberDefinition);
RadioButton(x : RadioDefinition);
}
typedef TextDefinition {
x : Int,
y : Int,
width : Int,
コンポーネントごとに
height : Int, 固有の設定情報
allowChars : TextAllowChars;
maxLength : Int,
}
20
- 22. Observer + enumの例
class Text extends Observale<TextEvent> { }
enum TextEvent {
Click;
Change(newValue : String, oldValue : String);
Blur(event : { cancel : Void -> Void });
}
text.observe(function (event : TextEvent) {
switch (event) {
case Blue(x): if (!validate()) x.cancel();
default:
}
});
22
- 23. 続いて通信・非同期処理回りを実装
• 通信コンポーネントも独自実装
– 通信時にシステム用のidを付けたり、色々と
– 標準のhaxe.Http(ほぼ生XHR)をラップ
– 内部でQueue/簡易フローを実装
• 非同期処理はDeferred(Promiseパターン)
– Haxeから使うにはよいライブラリがなかったので
これも自前実装した
23
- 24. Deferred(Promise)の例
showLoadingMask();
var http = new HttpClient();
http.send(‘/foo/bar’, ‘get’)
.success(function (data : Dynamic) {
var value = cast(data.value, Int);
trace(value);
})
.fail(function (error : HttpError) {
trace(‘なんかエラーでた’);
})
.done(function () {
clearLoadingMask();
});
24