我在項(xiàng)目中一直使用JBoss Drools 這個(gè)開(kāi)源的規(guī)則驅(qū)動(dòng)引擎, 為什么要用它? 我要想出個(gè)一二三來(lái)說(shuō)服別人。
對(duì)于business rule, 一般的情況是, 好的BA,可能更善于發(fā)現(xiàn)、抽取business rule ,并用結(jié)構(gòu)化的方式描述、記錄下來(lái), 普通的BA可能更是一種流水賬式的、吃那拉那的描述方式。
不管怎樣,BA在寫(xiě)文檔,use case的時(shí)候,那些business rule被分布在文檔中不同的部分,然后這些rule,在分工時(shí),有被理所當(dāng)然的分給不同的開(kāi)發(fā)人員來(lái)開(kāi)發(fā)。
好的開(kāi)發(fā)人員會(huì)刻意的使用各種手段剝分離、封裝、結(jié)構(gòu)化他們,并積極的重構(gòu)他們,以防止規(guī)則的變化,沖擊到設(shè)計(jì)或代碼的結(jié)構(gòu)。
而普通的開(kāi)發(fā)人員則極有可能硬編碼寫(xiě)死在代碼當(dāng)中,完成coding 任務(wù),草草了事。
可以看出,這種方式,隨意性太大,不可控的風(fēng)險(xiǎn)也隨之增大。后果是,開(kāi)發(fā)人員總是抱怨需求的變更,殊不知,合理的設(shè)計(jì)手段,在一定程度上,可以緩沖需求的變化。
JBoss Drools, 它在一定程度上解決了上面的問(wèn)題:
1)規(guī)則首先應(yīng)當(dāng)是可管理的
?? 規(guī)則是相對(duì)靈活、復(fù)雜的,我們要控制、管理它們,而不是直接暴露給開(kāi)發(fā)人員,愿意怎么搞,就怎么搞,一個(gè)人一種style。
?? Drools使用script,將rule集中寫(xiě)在規(guī)則庫(kù)文件當(dāng)中, 使得設(shè)計(jì)人員更容易管理。同時(shí)可以設(shè)計(jì)復(fù)雜的業(yè)務(wù)規(guī)則,并在沒(méi)有編寫(xiě)任何代碼的情況下自動(dòng)綁定企業(yè)數(shù)據(jù)。提供帶有菜單提示和下拉列表的向?qū)?lái)幫助用戶完成設(shè)計(jì)過(guò)程。
2)我們則設(shè)計(jì)是,總要遵循一些原則:
?? 將易變的和不變的分離出來(lái)
?? 封裝可變的規(guī)則, 避免硬編碼編程
?? 將多源的規(guī)則,合并、整理成單源的規(guī)則,一進(jìn)一出,降低復(fù)雜度。
?? Drools將規(guī)則寫(xiě)在配置文件當(dāng)中,以集中強(qiáng)制的方式剝離了規(guī)則,而不是寫(xiě)死在代碼當(dāng)中。在規(guī)則變化而修改腳本文件時(shí),不用重新部署系統(tǒng)。
3)規(guī)則應(yīng)當(dāng)使用一種清晰、易懂的方式記錄下來(lái),并明確下來(lái),無(wú)論是漢語(yǔ)還是英文句子,都不是表達(dá)規(guī)則的好的方式。大段大段的文字,往往讓人發(fā)暈。
?? 偽代碼、script語(yǔ)言反而時(shí)表達(dá)規(guī)則的一種極好的方式, 結(jié)構(gòu)化的表達(dá)方式,讓開(kāi)發(fā)人員覺(jué)得非常親切,更加平易近人。
?? Drools 引入了更為強(qiáng)大且的業(yè)務(wù)行為腳本語(yǔ)言(MVFlex表達(dá)式語(yǔ)言)。用戶會(huì)發(fā)現(xiàn)腳本語(yǔ)言的引入使得代碼變得更為簡(jiǎn)明且可讀性更好。