Rxはじめました

お久しぶりです、そしてまるで金持ち以外が手を出したら死滅するようなアレに手を出したかのようなタイトルですが、違います。
Rx(Reactive Extensions) にハマってしまいました。 これ超面白いです。

これを使ったらものすごく泥臭いプログラムが色々闇に葬る事ができそうでものすごくワクワクしてます。
下記参考にした各種サイトのリンクです。 記事を書かれた方達に感謝です。

Reactive Extensions入門「まとめ」
Reactive Extensions再入門その46「Reactive Extensions 入門」
Rx入門
Hokuriku.NET C# Rx編
実践 Reactive Extensions
C# 次世代非同期処理外観 Task vs Reactive Extensions
Reactive Programming by UniRx
連載:Reactive Extensions(Rx)入門
UniRx – Reactive Extensions for Unity
UniRx を使ってみた。マウスクリックの回数を数える

そのようなわけで早速 Unity3D の Rx 実装である、UniRxを入手して使ってみました。
使い道は今のところ

・SQLiteの入出力にRx
・Unity3DからウェブサーバのAPIアクセスにRx

で攻め込んでます。まだ使い方が把握できてないメソッドも色々あるので感覚がつかめてきたらバリバリ使い倒したいところです。

// テーブル初期化系 IObservable を全部連結する
var initialize_table =
    from q1 in SQLiteController.instance.DropTableIfExists(typeof(data_table1))
    from q2 in SQLiteController.instance.DropTableIfExists(typeof(data_table2))
    from q3 in SQLiteController.instance.CreateTableIfNotExists(typeof(data_table1))
    from q4 in SQLiteController.instance.CreateTableIfNotExists(typeof(data_table2))
    from q5 in SQLiteController.instance.TruncateTable(typeof(data_table2)) // 意味ないけどサンプル的な意味で
    select new { };
// 実行
initialize_table.Subscribe(
    x => {
        // 成功時の処理
    },
    ex => {
        // 例外発生時の処理
    },
    () => {
        // 成功時の処理後にここが実行される
});

上は SQLite の処理を連結して実行させてみたサンプル。
Reflection を使ってクラス定義をそのままテーブルに変換できるようにしてみました。
上みたいに単純なのはわざわざ Rx にしなくても直接実行すればよさげですが、大量のデータを
SELECT する場合はコルーチンで数件づつ取得するとかだとええ感じかもしれません。

ServerAPI.NewAccount(stAPIURL, stEMailAddress)
.Subscribe(
    oResponse => {
    },
    ex => { },
    () => { });
public class ServerAPI {
    static public IObservable<APIResponse> NewAccount(string stAPIURL, string stEMailAddress) {
        return ObservableWWW.PowtWWW(stAPIURL, MeraPost.GetForm(new Dictionary<string,string>() {
            {"email", stEMailAddress}
        }))
        .Retry(3)
        .Select(x => new APIResponse(x));
    }
}

こちらは ObservableWWW.PostWWW を使用してサーバ API をコールする時のイメージ。
実際には API 実行後、返却された JSon をパースして戻り値用クラスに値を突っ込んで返します。

ちょっと複雑になる場合、メソッドチェーンで戻り値を加工したり、他の IObservable と合成して複雑な処理もできそうです。
(でもシンプルで読みやすいコードにしたいので複雑になったら負けなのかもしれない)

SQLite はアセットストアの SQLiteKit をゲットして使っています。
C# 用のラッパーも入ってますが、こっちは色々カスタマイズしないとちょいと使いにくそうです。

久しぶりなので今日は軽く雑談っぽい感じでまた今度。

ツイートツイート