所有項目都是被需求變更累死的,eXtreme Programing提供了一種哲學(xué),一種態(tài)度,但更實際的,是那些能夠應(yīng)付需求變更的技術(shù)。
比如用OLAP支持復(fù)雜報表的快速定制,用script語言如Groovy支持客戶自定義公式,
還有Rule Engine,我們一天到晚掛在口上的親愛的商業(yè)規(guī)則。
Rule Engine并不新鮮,但通常只要一些名詞已經(jīng)足夠把所有普通項目組震退,CLisp、Rete、前向推導(dǎo).... 惟有Drools,終于把java和xml帶回我們身邊,讓規(guī)則引擎簡單到和JSP一樣可以進(jìn)入所有的程序組。
先看一段精簡又實用的HelloWorld,由兩部分組成, 一個是調(diào)用規(guī)則的test.jsp :
//設(shè)置一個測試用的VO
Vo vo = new Vo();
vo.setPoStatus("A:draft");
//讀入規(guī)則
RuleBase ruleBase = RuleBaseBuilder.buildFromURL("rule.drl");
//把vo放入WorkingMemory中并執(zhí)行
WorkingMemory workingMemory = ruleBase.newWorkingMemory( );
workingMemory.assertObject( vo );
workingMemory.fireAllRules( );
//顯示結(jié)果
out.print(po.getPoStatus());
一個是規(guī)則文件rule.drl:
<rule-set name="test rules"
<rule name="Bob Likes Cheese">
<parameter identifier="vo">
<java:class>com.ito.vo</java:class>
</parameter>
<java:condition>vo.getStatus().equals("A:draft")</java:condition>
<java:consequence>
vo.setStatus("B:order");
</java:consequence>
</rule>
</rule-set>
整個規(guī)則分成三段, 第一段定義剛剛放入的對象; 第二段用Java語法判斷條件; 第三段為條件符合時的執(zhí)行語句
真的非常簡單吧
經(jīng)過小范圍的試用,發(fā)現(xiàn)沒有這么簡單,因為Drools主要提供了一個RETE的規(guī)則匹配算法和一個Script Engine,具體怎么用,還很靠自己。如果drl文件的定義方式和RETE算法能夠使條件的表達(dá)大大簡化,那么它就是有用的。否則,一段重構(gòu)后的代碼能夠達(dá)到和drl文件相仿的功能。所以,還是要多看點基礎(chǔ),把Business Rules用在正確的地方。
提供一個eclipse的插件 url: http://www.zymose.com/index.html