JBoss Rule Engine - Drools (1)

来源:互联网 发布:上网监控软件破解版 编辑:程序博客网 时间:2024/05/16 18:52

[緣起]
上次和 JBoss Ben Wang 閒聊時, 因為不知道 JBoss Rule Engine - Drools 而被嘲笑了一下,
可能從未實際接觸過 Rule Engine 的領域, 所以就只能馬上查閱資料惡補...

[RuleEngine]
當今技術前端應用應該就屬 ajax 最火紅, 加上 MVC Framework 的整合, 應該就可以快速處理許多系統.
而後端技術應用就屬 Hibernate, EJB3(JPA) 最熱門, 可以利用 ORM 與資料庫溝通.
而中間層商業邏輯段, 我們常常需要 if else 的應用,
如果硬寫太多規則在裡面, 會造成程式面過於龐大難以維護.
以往, 在我設計多彈性的系統之中, 讓模組可 "嵌入" 到我的平台,
我大多採用先設計 BizInterface 再利用 Object.newInstance(); 去進行商業處理.
但是很多例外規則時, 我就得在平台之中, 不斷地寫例外狀況..
或是不斷修正 BizInterface 與 input/output 參數,
這應該是大家不願意樂見的情況 !

所以, 我們先來知道, 什麼情況你需要 Rule Engine, 就是不斷在寫例外的流程,
不斷有 if else, 不斷有特殊規則, 不斷有他媽的需求變更....
換句話說, 如果你有規則引擎在系統之中,
可以減少一些負擔.


if( areaCode.equals("A"|| areaCode.equals("B") ) {
 
if( regionCode.equals("A1"|| regionCode.equals("B2"{
  
if( officeCode.equals("A12F") ) {
   
// show detail data

  }
 else {
   
// show basic data
  }


 }
 else if ( regionCode.equals("B1")) {
  
// show B1 Data
 }
 else {
  
// don't show any data
 }

}
 else {
 
// do some other business logic
}

 

例如上面的這段程式碼, 我哪知道 A 代表啥意思, 為什麼 A12F 要顯示 Detail data,
雖然可以倚靠著 SA/SD 文件, 但這種程式的可讀性相對低,
自然沒有辦法做到 "易於維護" ! 撰寫這段程式碼的工程師, 更需要花相同的時間去撰寫 UnitTest,
來證明自己的程式碼結果是正確的, 如果換了下一個客戶, 是否又得花相同時間,
去撰寫這些 code 的特殊邏輯 ? 所以有太多理由, 我們不適合在程式中寫太多的 if else.

在 JSR 94 ( http://www.jcp.org/en/jsr/detail?id=94 )規範中 ( 2004/08 Final Released )
就是定義 Java Rule Engine API,
相容的有如 Jess ( http://herzberg.ca.sandia.gov/jess/ ),
JLisa( http://jlisa.sourceforge.net/ ),
Jena ( http://jena.sourceforge.net/ ),
JRuleEngine ( http://jruleengine.sourceforge.net/ ),
以及 benwang 叫我學習的 JBoss Rules - Drools ( http://labs.jboss.com/jbossrules/docs ) 等
其實 Java 的 Rule Engine 之多, 上網亂查都有一大票,
不過, Jess 不算 Opensources, 另外我考量的還有幾點, 包含了 IDE 開發與 XML 規則.

如果有 Eclipse Plugins 的話, 撰寫 Script 應該就會更容易,
另外 能夠遵循 RuleML 就會更好了 ( http://www.ruleml.org/ ),
Mandarax ( http://mandarax.sourceforge.net/ ) 就是採 RuleML 規則的.
畢竟, 我會希望如果我今天用 Drools,
也許明天會考慮 ILog JRules (http://www.ilog.com/products/jrules/) 或是
PST ( http://www.pst.com ) 都可以利用所產生出是相同的定義檔.

 


[References]
http://blog.vgod.tw/?p=86
http://www.manageability.org/blog/stuff/rule_engines/
http://www.onjava.com/pub/a/onjava/2005/08/03/drools.html
http://www.onjava.com/pub/a/onjava/2005/08/24/drools.html
http://labs.jboss.com/jbossrules/docs/index.html