デシジョンテーブル
もともと入ってるテストクラスを元にして気分転換までに確認。ルールとしては年齢、性別で
設定金額が異なるよーといったもの。
s2ebiではこんな感じのExcelのデシジョンテーブル
で、実装はこんな感じ
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]);
特徴としては、
- User情報をMapにしてexcelとbindingしてるところ。
- 1ルール=1Sheetっぽい。
- 1ルール1アクション。
- s2ebi内でburiパッケージはjxlを使っていてebiパッケージではPOIを使用している
- ExcelDecisionTableでsheetごとにキャッシュ保持(map)
- RuleSet.getResultsがObject[](複数の戻り値)を返す!
- buriパッケージ内にあるharricene/TablePickupだとExcelの記述方法が他にもある
(参考Excelの場所はここ↓)
test\resources\org\seasar\buri\harricene\impl
test\java\org\seasar\buri\tablepickup\impl
test\resources(メニュー/権限での応用例)
って感じですかね。
んで、これをJBossRulesに焼きなおすとデジジョンテーブルはこんな感じ。
んで、実装はこれ。
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クラスに金額をもつのは変だけど、 //あくまでサンプルまでに。
特徴としては、
- Excel内でUser情報とクラス情報bindingしてるところ。あちゃー!リファクタリングしたらこっちも直さねば。
- オブジェクト(データ)操作ができる(賛否両論あるのかもしれないが、JBossRulesでは可能にしている。)
- nルール=1Sheet。
- 1ルールnアクション。(とはいっても、Actionの意味合いがs2ebiとは異なると思うけど)
- jxlを使っている
- cacheOK.
ちなみにExcelはお互いちょっとしたルールのもとに記述をしていくんだけど、ちょっとした記述ミスで起きるExceptionは若干、JBossRulesの方がわかりやすいかな、若干ね。(Null PointerException(s2ebi)に対して、ちゃんとしたExceptionと、それらしいメッセージが返ってくる(JBossRules)、ま、どっちみちソースみるけどね。