デシジョンテーブル

もともと入ってるテストクラスを元にして気分転換までに確認。ルールとしては年齢、性別で
設定金額が異なるよーといったもの。
s2ebiではこんな感じのExcelのデシジョンテーブル
f:id:wkzk:20060830033046p:image
で、実装はこんな感じ

File file = new File("src/test/resources/test1.xls");
DecisionTable decisionTable = new ExcelDecisionTable(file); 
RuleSet ruleSet = decisionTable.getRuleSet("食べ放題の金額設定");
User user = new User();
user.setAge(10);
user.setSex("male");

Map context = new HashMap();
context.put("user", user);

Object[] actual = ruleSet.getResults(context);

assertEquals("800", actual[0]);

特徴としては、

  1. User情報をMapにしてexcelとbindingしてるところ。
  2. 1ルール=1Sheetっぽい。
  3. 1ルール1アクション。
  4. s2ebi内でburiパッケージはjxlを使っていてebiパッケージではPOIを使用している
  5. ExcelDecisionTableでsheetごとにキャッシュ保持(map)
  6. RuleSet.getResultsがObject[](複数の戻り値)を返す!
  7. buriパッケージ内にあるharricene/TablePickupだとExcelの記述方法が他にもある

(参考Excelの場所はここ↓)
test\resources\org\seasar\buri\harricene\impl
test\java\org\seasar\buri\tablepickup\impl
test\resources(メニュー/権限での応用例)
って感じですかね。


んで、これをJBossRulesに焼きなおすとデジジョンテーブルはこんな感じ。
f:id:wkzk:20060830033537p:image
んで、実装はこれ。

SpreadsheetCompiler compiler = new SpreadsheetCompiler();
String drl = compiler.compile(getSpreadsheetStream(), InputType.XLS);

RuleBase ruleBase = buildRuleBase(drl);
   	
WorkingMemory wm = ruleBase.newWorkingMemory();
		
User user = new User();
user.setAge(10);
user.setSex("male");

wm.assertObject(user);
		
wm.fireAllRules();
		
assertEquals(800, user.getPrice()); //<-※画像だとわかりづらいけど、ActionでUser.setPriceで
//該当値が格納される。クラス設計としては、Userクラスに金額をもつのは変だけど、
//あくまでサンプルまでに。   	

特徴としては、

  1. Excel内でUser情報とクラス情報bindingしてるところ。あちゃー!リファクタリングしたらこっちも直さねば。
  2. オブジェクト(データ)操作ができる(賛否両論あるのかもしれないが、JBossRulesでは可能にしている。)
  3. nルール=1Sheet。
  4. 1ルールnアクション。(とはいっても、Actionの意味合いがs2ebiとは異なると思うけど)
  5. jxlを使っている
  6. cacheOK.



ちなみにExcelはお互いちょっとしたルールのもとに記述をしていくんだけど、ちょっとした記述ミスで起きるExceptionは若干、JBossRulesの方がわかりやすいかな、若干ね。(Null PointerException(s2ebi)に対して、ちゃんとしたExceptionと、それらしいメッセージが返ってくる(JBossRules)、ま、どっちみちソースみるけどね。