めも

  1. もう1個hibernateに似ているところ(というか普通かな)workingMemoryの中で管理されるFact(object)はidentity/equalityで管理される。
  2. RuleBaseのインスタンスはスレッドセーフ。
  3. workingMemoryに渡すオブジェクト(Fact)は1個だけなので、複数オブジェクトを使う場合はDTOにするしかない。(ムムッ)
  4. workingMemoryに渡すオブジェクト(Fact)はcloneではないので、Ruleの中で値を書き換えられる。->何か値をJavaに返す場合はオブジェクトに何かしら値をセットすればそのまま使える。
  5. fireするRuleは指定できない。Filterでallを対象にしたなかから抽出するようにする。(ムムッ2)

上記のこともあるので、jBossRulesそのままでは不可能っぽいけど、もっと軽くこんなふうに使えればなぁと思った

Person person = new Person();
person.setAge(12);
workingMemory.assertObject( person, "SS");                   <--現行Rulesではできない
Integer value = workingMemory.fireRule("映画館チケット購入");  <--現行Rulesではできない

ちょっと利便性を高めて、さらに

Integer value = workingMemory.fireRule("映画館チケット購入",new Object{person,"SS"});  <--現行Rulesではできない
                                         ↑ルール            ↑Factで利用するオブジェクト達

これぐらいは、jBossRulesをさらに包むようなものをフレームワークでは提供しようと思えばできそうだけど、現行仕様にあわせるばかりにオブジェクトの生成や、オブジェクト間のメッセージのやり取りが増えてフレームワークでのオーバーヘッドが出そう。。あんまたいしたことないのかな。ま、おいおい。