« 2008年06月 | メイン | 2008年11月 »

2008年07月02日

フラグ駆動ライブラリ Flagment

フラグ(変数値)によってメソッドを呼び出すためのライブラリを SparkProject にコミットしました。

Flagment


そうめんに触発されて以前作ったChainライブラリに手を入れようかなと思ったんですが、非同期処理ってどうもソースコードが汚くなりがちなのでもっと単純にすべきなのではと考えた挙句、フラグ駆動に落ち着きました。

まあぶっちゃけこれだけで非同期処理やろうとしても、かえってフラグ管理が大変になるのでオススメできないのですが、依存度の低いクラスの中で判定のためだけにインスタンス参照持ちまわすとかアホくさいことしなくても済みます。
他に有用なケースはないか探してみますが、いい使い方あったら教えてください。


使いたい時にちょっとだけ入れてみる、それだけで使えます。
インスタンス作る必要もありません。


以下サンプルコード


Flagment.register("a", 1 ); // フラグaを登録(初期値:1)
Flagment.register("b", true ); // フラグbを登録(初期値:true)

Flagment.bind("a", 10, age ); // フラグaの値が10になったら関数ageを呼ぶ
Flagment.bind("a", 10, sage ); // フラグaの値が10になったら関数sageを呼ぶ
Flagment.bind("a", 20, hoge ); // フラグaの値が20になったら関数hogeを呼ぶ
Flagment.bind("b", false, ahoge, true ); // フラグbの値がfalseになったら一度だけ関数ahogeを呼ぶ

Flagment.update("a", 10 ); // フラグaの値を10に更新(ageとsageが呼ばれる)
Flagment.update("b", false ); // フラグbの値をfalseに更新(ahogeが呼ばれる)

Flagment.unbind("a", 10 ); // フラグaの値が10になった時の駆動メソッドを全て解放
Flagment.unbind("a"); // フラグaの駆動メソッドを全て解放

Flagment.unregister("a"); //フラグaを解放
Flagment.unregister("b"); //フラグbを解放


複数フラグのAND対応もしています。
第一引数はフラグ名ではなく識別用ラベルなので、どういう駆動なのか説明するラベルを推奨


Flagment.bindAnd("a5_and_!b", { a:5, b:false }, toge ); // フラグaの値が5かつフラグbの値がfalseになったら関数togeを呼ぶ
Flagment.update("a", 5 ); // フラグaの値を5に更新
Flagment.update("b", false ); // フラグbの値をfalseに更新(togeが呼ばれます)
Flagment.unbindAnd("a5_and_!b"); // 上記の駆動を解除


一元管理しているので、全く異なるクラス内で呼んでもOKです。
というか、元々そういう目的で作っています。
分散している処理の終了時にそれぞれフラグを立てて、全てが終了したらメソッドを呼ぶといった用途に使えると思いますが、それはそれで面倒かも?

優先度とか比較演算子の定義まで入れられたらと思うのですが、ちょっと冗長な気もするのでひとまず使ってみてから判断します。
複雑な条件を定義できるようにすべきかどうかも。