5.腳本式規則集
概述
在向導式規則集中(zhōng),我們通過鼠标點擊就可(kě)以定義出各種類型的複雜業務(wù)規則;如果你是一個程序員,可(kě)能(néng)會更青睐代碼的方式來定義業務(wù)規則,所以在URule Pro中(zhōng)還提供了腳本式規則集,讓我們可(kě)以采用(yòng)腳本的方式來定義業務(wù)規則。與向導式規則集對應,腳本式規則集裏可(kě)以實現向導式規則中(zhōng)能(néng)實現的所有(yǒu)功能(néng),反過來也是一樣。
雖然說腳本式規則集能(néng)實現向導式規則集的所有(yǒu)功能(néng),但在實際使用(yòng)中(zhōng),我們還是推薦大家使用(yòng)向導式規則集來定義我們的業務(wù)規則,這是因為(wèi)向導式規則集是通過鼠标點擊方式,一步步引導我們進行操作(zuò),所以它的出錯機率很(hěn)小(xiǎo),所以推薦使用(yòng)。在URule Pro當中(zhōng)所有(yǒu)的功能(néng)點都可(kě)以采用(yòng)向導方式來完成定義。
在腳本式規則集中(zhōng),采用(yòng)URule Pro自定義的一套腳本語法,關鍵字既可(kě)以使用(yòng)英文(wén)也可(kě)以是中(zhōng)文(wén),在一個普通規則或一個循環規則當中(zhōng),我們可(kě)以使用(yòng)純英文(wén)關鍵字來定義,也可(kě)以全部使用(yòng)純中(zhōng)文(wén)關鍵字來定義,如果你願意,也可(kě)以使用(yòng)中(zhōng)英文(wén)混合的關鍵字來定義。因為(wèi)支持中(zhōng)文(wén)關鍵字,使得URule Pro的腳本式決策集更加适合国人編寫,可(kě)讀性也就更強,再配合URule Pro中(zhōng)提供的腳本式決策集編輯器中(zhōng)提供的全功能(néng)代碼提示功能(néng),可(kě)大幅提高腳本式決策集的編寫效率。
打開URule Pro控制台,在項目下的“決策集”節點右鍵,選擇“添加腳本式決策集”菜單項,即可(kě)創建一個新(xīn)的腳本式決策集文(wén)件,如下图所示:
語法
URule Pro中(zhōng)的腳本的語法定義與解析采用(yòng)的是ANTLR實現,在一個腳本式決策集當中(zhōng),同樣可(kě)以導入變量庫、常量庫、參數庫以及動作(zuò)庫,同樣可(kě)以編寫普通規則和循環規則。對于一個完整的腳本規則文(wén)件,它的内容主要由三部分(fēn)構成,分(fēn)别是:導入資源庫的頭部分(fēn)、規則定義部分(fēn)以及函數定義部分(fēn);我們先來看看資源庫導入的頭部分(fēn)。
庫文(wén)件導入部分(fēn)
所謂的庫文(wén)件導入部分(fēn),就是指在整個腳本規則文(wén)件的最頂部來定義導入哪些庫文(wén)件,前面提到,通過最上方的工(gōng)具(jù)欄,可(kě)以将我們規則當中(zhōng)需要用(yòng)到的資源為(wèi)導入進來。以導入變量庫文(wén)件為(wèi)例,在導入操作(zuò)之前,需要我們首先将編輯光标定位于文(wén)件頭部,然後點擊最上方工(gōng)具(jù)欄中(zhōng)“導入常量庫”按鈕,在彈出窗口中(zhōng)選擇目标資源庫文(wén)件,确定後,就可(kě)以在當前腳本規則文(wén)件中(zhōng)加入要導入的資源庫文(wén)件,如下图所示:
導入其它類型的資源庫操作(zuò)也是一樣,每條導入可(kě)以添加“;”結尾,也可(kě)以不加;在導入資源庫文(wén)件時,如果我們選擇當前資源庫文(wén)件的某個具(jù)體(tǐ)版本,那麽版本号就會出現在文(wén)件名(míng)的後方,如下图所示:
可(kě)以看到版本号置于文(wén)件結尾處,與文(wén)件名(míng)之間以“:”分(fēn)隔。
需要注意的是,導入庫文(wén)件的定義信息,必須要置于整個腳本規則文(wén)件的頂部,具(jù)體(tǐ)的規則及函數定義必須位于導入資源庫定義信息之下,否則就有(yǒu)語法錯誤。但對于變量庫、參數庫、常量庫及動作(zuò)庫之間的順序則是任意的。
接下來我們來看看規則定義,規則的位置是任意的,隻是保證它們的位置在導入資源庫定義内容之下就行。
規則定義
在一個腳本式規則文(wén)件當中(zhōng),可(kě)以添加零至多(duō)個普通規則或循環規則定義信息,其定義位置必須要在導入庫文(wén)件的定義信息之下。一個标準的普通規則定義的結構如下。
在一個普通規則當中(zhōng),else部分(fēn)如果沒有(yǒu)動作(zuò)可(kě)定義,那麽是可(kě)以省略不寫的,就像下面這樣:
看完普通規則後,我們再來看看循環規則定義,下面是一個标準的循環規則定義結構:
對照向導式決策集裏的循環規則定義,可(kě)以看到結構完全一緻,唯一不同的是這裏采用(yòng)腳本方式實現。同樣在腳本式循環規則的循環體(tǐ)中(zhōng),如果沒有(yǒu)“否則”部分(fēn),那麽這裏的“else”部分(fēn)的定義就可(kě)以省略,這與普通規則一樣。
規則屬性
無論是普通規則,還是循環規則,屬性定義部分(fēn)都是一樣的,而且與向導式規則中(zhōng)普通規則和循環規則保持一緻。
如果不記得屬性有(yǒu)哪些可(kě)以通過ALT+"/"鍵打開代碼提示,選擇需要的屬性即可(kě),多(duō)個屬性之間可(kě)以用(yòng)空格或","号分(fēn)隔,具(jù)體(tǐ)屬性中(zhōng)英文(wén)名(míng)及描述見規則屬性部分(fēn)介紹,如下图所示:
在腳本式決策集編輯器當中(zhōng),通過使用(yòng)ALT+"/"鍵就可(kě)以打開當前光标所在位置的代碼提示功能(néng),如果你在按ALT+"/"鍵時沒出現代碼提示菜單,則你的浏覽器可(kě)能(néng)已占用(yòng)了這個快捷鍵,我們必須要将這個快捷鍵開放出現,留給腳本式決策集編輯器使用(yòng)。
屬性賦值通過”=“實現,多(duō)個屬性之間需要添加空格或回車(chē),對于String類型的屬性值需要添加雙引号包裹,日期類型要采用(yòng)“yyyy-MM-dd HH:mm:ss”格式來定義,布爾類型則直接輸入true或false,如下图所示的屬性:
條件定義部分(fēn)
對于一個普通規則,條件定義部分(fēn)在if與then之間,對于循環規則,條件定義部分(fēn)指的是循環體(tǐ)中(zhōng)在if與then之間的部分(fēn)。
在條件定義部分(fēn)中(zhōng)我們可(kě)以添加具(jù)體(tǐ)的業務(wù)條件判斷,與向導式規則類似,在編寫腳本式規則條件時,單個條件也是由條件左邊部分(fēn),比較操作(zuò)符及條件右邊部分(fēn)。在條件左邊部分(fēn),同樣可(kě)以使用(yòng)參數、變量及方法,當然也可(kě)以添加簡單的加、減、乘、除,對于條件的比較操作(zuò)符,我們可(kě)以通過ALT+"/"鍵打開代碼提示來進行查看,如下图所示:
條件左邊值
條件左邊值格式為(wèi):變量/參數/方法 [+][/][*][/] 變量/參數/方法/數字/字符串 [+][/][*][/]變量/參數/方法/ 數字/字符串...
合法的條件左邊值定義示例 |
---|
員工(gōng).salary/10 |
員工(gōng).salary-10 |
員工(gōng).salary+10-5*2/3 |
員工(gōng).salary+10 |
員工(gōng).salary*10 |
員工(gōng).salary |
參數.approve |
參數.amount+10 |
MethodTest.判斷用(yòng)戶名(míng)("張三")+12*12 |
MethodTest.判斷用(yòng)戶名(míng)("張三") |
條件右邊值
與條件左邊值類似,條件右邊值除了可(kě)輸入單個普通的數字、字符串、變量、參數、方法、常量外,也可(kě)以使用(yòng)一級或多(duō)級加、減、乘、除操作(zuò)連接複雜表達式,但一級或多(duō)級加、減、乘、除操作(zuò)的右邊對象同樣可(kě)以是普通的數字、字符串、變量、參數、方法、常量,其語法格式如下:
數字/字符串/變量/參數/方法/常量 [+][-][*][/] 數字/字符串/變量/參數/方法/常量 [+][-][*][/] 數字/字符串/變量/參數/方法/常量 ...
在條件右邊值當中(zhōng),可(kě)以使用(yòng)括号來實現加、減、乘、除運算優先級,依照條件右邊值語法格式,上面條件左邊值格式為(wèi)不合法的示例,在條件右邊值中(zhōng)都是合法的。在條件左值當中(zhōng),我們可(kě)不以使用(yòng)常量,但在條件右值當中(zhōng)就可(kě)以使用(yòng)常量,下面是幾個合法的條件右邊值定義示例:
合法的條件右邊值定義示例 |
---|
員工(gōng).salary+10-(員工(gōng).level-2.11*(2+2.1)) |
MethodTest.判斷用(yòng)戶名(míng)("張三")+員工(gōng).salary |
員工(gōng).salary+員工(gōng).level+10 |
MethodTest.判斷用(yòng)戶名(míng)("張三")+12*12 |
員工(gōng).salary+10-5*2/3*(2+1.11) |
MethodTest.判斷用(yòng)戶名(míng)("張三") |
員工(gōng).salary+10-5*2/3 |
員工(gōng).salary-10 |
員工(gōng).salary-10 |
參數.approve |
參數.amount+10 |
員工(gōng).salary+10 |
員工(gōng).salary*10 |
true |
false |
10 |
"yes" |
$學(xué)曆.大專 |
10+20 |
20*0.08+30 |
多(duō)條件組合
在規則編寫過程當中(zhōng),如果有(yǒu)多(duō)個條件,那麽可(kě)以采用(yòng)“and”或“or”符号來對多(duō)個條件進行連接組合,同時對于組合的條件,還可(kě)以添加括号來實現組件條件計算的優先級,在未添加括号的多(duō)個組合條件之間,要使用(yòng)相同連接符号,也就是說在未添加括号的多(duō)個組合條件之間,要麽使用(yòng)“and”,要麽使用(yòng)“or”。下面當前羅列了一些常用(yòng)的組合條件示例:
組合條件 | 描述 |
---|---|
員工(gōng).level==1 or 員工(gōng).level==2 | 兩條件隻滿足一個條件即可(kě) |
員工(gōng).salary>1000 and 員工(gōng).salary<10000 | 兩條件必須同時滿足 |
員工(gōng).salary>1000 and 員工(gōng).salary<10000 and (員工(gōng).level==1 or 員工(gōng).level==2 or (員工(gōng).學(xué)曆 == $學(xué)曆.大專 and 員工(gōng).salary>員工(gōng).level*1.5 and 員工(gōng).dept.id=="D21")) | 前兩個條件滿足,括号内前兩個條件與最後那括号内條件必須要滿足其一 |
員工(gōng).salary>1000 and 員工(gōng).salary<10000 and (員工(gōng).level==1 or 員工(gōng).level==2) | 前兩個條件必須同時滿足,同時後面兩個條件必須要有(yǒu)一個滿足 |
員工(gōng).學(xué)曆 == $學(xué)曆.大專 and 員工(gōng).salary>員工(gōng).level*1.5 and 員工(gōng).dept.id=="D21" | 表示三個條件必須同時滿足 |
通過上面的例子可(kě)以看到,通過“and”或“or”符号來對多(duō)個條件進行連接組合以及添加括号或多(duō)層嵌套括号可(kě)以實現非常複雜的條件組合,從而滿足我們的業務(wù)需求。對于連接多(duō)個條件的“and”或“or”符号,在使用(yòng)時還可(kě)以用(yòng)“&&”或“||”來替換,程序員一定很(hěn)熟悉,“&&”或“||”在代碼中(zhōng)表示的就是“并且”“或者”,除此之外,我們還可(kě)以直接使用(yòng)“并且”“或者”的中(zhōng)文(wén)來連接多(duō)個條件,如下面的截图所示:
在腳本式規則中(zhōng),條件定義的可(kě)讀性與向導式規則相比就很(hěn)差了,所以這也是我們不推薦使用(yòng)腳本式規則的原因之一。
動作(zuò)定義部分(fēn)
腳本式決策集中(zhōng)普通規則的的動作(zuò)定義部分(fēn)寫在“then”與“end”之間或者是“else”與“end”之間,循環規則中(zhōng)除了循環體(tǐ)中(zhōng)可(kě)在上述兩個地方添加動作(zuò)外,還可(kě)以在"loopStart"與“if”之間或"loopEnd"與"end"之間添加動作(zuò),動作(zuò)可(kě)有(yǒu)一個或多(duō)個,每個動作(zuò)以“;”或回車(chē)結束。可(kě)執行的動作(zuò)有(yǒu)三種類型,那就是為(wèi)變量或參數賦值、執行方法、執行自定義函數以及控制台内容輸出。我們首先來看看針對變量或參數的賦值操作(zuò)。
賦值操作(zuò)
賦值操作(zuò)的語法格式如下:
變量或參數 = 數字/字符串/變量/參數/方法/常量 [+][-][*][/] 數字/字符串/變量/參數/方法/常量 [+][-][*][/]數字/字符串/變量/參數/方法/常量 ...
可(kě)以看到,針對變量或參數的賦值,首先要寫出具(jù)體(tǐ)的變量或參數名(míng),然後是“=”符号,接下來在“=”右邊是一個簡單或複雜的賦值表達式。在這裏賦值表達式與條件的右邊值格式完全相同,所以這裏不再贅述。
執行方法
在做執行方法操作(zuò)時,我們需要導入定義目标方法的動作(zuò)庫,一旦導入,我們通過ALT+"/"鍵代碼提示中(zhōng)就可(kě)以看到當前文(wén)件中(zhōng)可(kě)用(yòng)的方法,選擇好一個方法後,如果這個方法中(zhōng)包含參數,那麽我們還要根據在方法定義時指定的參數類型,為(wèi)方法填充适當的參數,對于方法參數,它也支持類型條件右邊值那種複雜的語法格式,執行方法的語法格式如下:
方法名(míng)([參數1,參數2...])
執行自定義函數
所謂執行自定義函數是指執行在當前規則文(wén)件當中(zhōng)定義的自定義函數,關于自定義函數見後面内容描述,執行自定義函數的格式如下:
函數名(míng)([參數1,參數2...])
控制台内容輸出
在URule Pro當中(zhōng),内置了一個名(míng)為(wèi)out的向控制台内容輸出内容的函數,其語法格式如下:
out(數字/字符串/變量/參數/方法/常量 [+][-][*][/] 數字/字符串/變量/參數/方法/常量 [+][-][*][/] 數字/字符串/變量/參數/方法/常量 ... )
從格式中(zhōng)可(kě)以看到,它以“out”開頭,後面的括号中(zhōng)就是我們需要輸出的内容,對于輸出内容格式,與條件的右邊值格式完全相同。
對中(zhōng)文(wén)的支持
在規則編寫當中(zhōng),無論是普通規則還是循環規則,所有(yǒu)的關鍵字可(kě)以使用(yòng)對應的中(zhōng)文(wén)來進行替代,具(jù)體(tǐ)見下表:
關鍵字 | 對應的中(zhōng)文(wén)關鍵字 |
---|---|
rule | 規則 |
loopRule | 循環規則 |
loopTarget | 循環對象 |
loopStart | 開始前動作(zuò) |
loopEnd | 結束後動作(zuò) |
if | 如果 |
then | 那麽 |
end | 結束 |
and | 并且 |
or | 或者 |
> | 大于 |
< | 小(xiǎo)于 |
>= | 大于等于 |
<= | 小(xiǎo)于等于 |
== | 等于 |
!= | 不等于 |
EndWith | 結束于 |
NotEndWith | 不結束于 |
StartWith | 開始于 |
NotStartWith | 不開始于 |
In | 不集合中(zhōng) |
NotIn | 不在集合中(zhōng) |
Match | 匹配 |
NotMatch | 不匹配 |
EqualsIgnoreCase | 忽略大小(xiǎo)寫等于 |
NotEqualsIgnoreCase | 忽略大小(xiǎo)寫不等于 |
下面的截图中(zhōng)是一個用(yòng)英文(wén)關鍵字編寫的普通規則
對應的中(zhōng)文(wén)規則如下:
下图中(zhōng)是一個用(yòng)中(zhōng)英文(wén)關鍵字混合的規則:
在腳本式決策集中(zhōng),可(kě)通過//來添加單行備注,多(duō)行備注用(yòng)/..備注内容../實現
盡管在腳本式規則集中(zhōng)提供了與向導式規則集一樣的功能(néng),但由于其需要手寫的特點,決定了它的編寫過程中(zhōng)出現錯誤的可(kě)能(néng)性,同時,腳本式規則中(zhōng)多(duō)條件的組合可(kě)讀性相比向導式規則中(zhōng)图形化展現方式也要差很(hěn)多(duō),所以我們還是推薦大家使用(yòng)向導式規則集。在URule Pro中(zhōng),所有(yǒu)的功能(néng)點都可(kě)以通過向導配置的方式完成,完全不需要手寫任何腳本。