5.腳本式規則集

概述

在向導式規則集中,我們通(tōng)過鼠标點擊就可(kě)以定義出各種類型的複雜業務規則;如果你(nǐ)是一個(gè)程序員,可(kě)能會(huì)更青睐代碼的方式來(lái)定義業務規則,所以在URule Pro中還(hái)提供了腳本式規則集,讓我們可(kě)以采用腳本的方式來(lái)定義業務規則。與向導式規則集對應,腳本式規則集裏可(kě)以實現向導式規則中能實現的所有(yǒu)功能,反過來(lái)也是一樣。

雖然說腳本式規則集能實現向導式規則集的所有(yǒu)功能,但(dàn)在實際使用中,我們還(hái)是推薦大(dà)家(jiā)使用向導式規則集來(lái)定義我們的業務規則,這是因為(wèi)向導式規則集是通(tōng)過鼠标點擊方式,一步步引導我們進行(xíng)操作(zuò),所以它的出錯機率很(hěn)小(xiǎo),所以推薦使用。在URule Pro當中所有(yǒu)的功能點都可(kě)以采用向導方式來(lái)完成定義。

在腳本式規則集中,采用URule Pro自定義的一套腳本語法,關鍵字既可(kě)以使用英文也可(kě)以是中文,在一個(gè)普通(tōng)規則或一個(gè)循環規則當中,我們可(kě)以使用純英文關鍵字來(lái)定義,也可(kě)以全部使用純中文關鍵字來(lái)定義,如果你(nǐ)願意,也可(kě)以使用中英文混合的關鍵字來(lái)定義。因為(wèi)支持中文關鍵字,使得(de)URule Pro的腳本式決策集更加适合國人(rén)編寫,可(kě)讀性也就更強,再配合URule Pro中提供的腳本式決策集編輯器(qì)中提供的全功能代碼提示功能,可(kě)大(dà)幅提高(gāo)腳本式決策集的編寫效率。

打開(kāi)URule Pro控制(zhì)台,在項目下的“決策集”節點右鍵,選擇“添加腳本式決策集”菜單項,即可(kě)創建一個(gè)新的腳本式決策集文件,如下圖所示:

語法

URule Pro中的腳本的語法定義與解析采用的是ANTLR實現,在一個(gè)腳本式決策集當中,同樣可(kě)以導入變量庫、常量庫、參數(shù)庫以及動作(zuò)庫,同樣可(kě)以編寫普通(tōng)規則和(hé)循環規則。對于一個(gè)完整的腳本規則文件,它的內(nèi)容主要由三部分構成,分别是:導入資源庫的頭部分、規則定義部分以及函數(shù)定義部分;我們先來(lái)看看資源庫導入的頭部分。

庫文件導入部分

所謂的庫文件導入部分,就是指在整個(gè)腳本規則文件的最頂部來(lái)定義導入哪些(xiē)庫文件,前面提到,通(tōng)過最上(shàng)方的工具欄,可(kě)以将我們規則當中需要用到的資源為(wèi)導入進來(lái)。以導入變量庫文件為(wèi)例,在導入操作(zuò)之前,需要我們首先将編輯光标定位于文件頭部,然後點擊最上(shàng)方工具欄中“導入常量庫”按鈕,在彈出窗口中選擇目标資源庫文件,确定後,就可(kě)以在當前腳本規則文件中加入要導入的資源庫文件,如下圖所示:

導入其它類型的資源庫操作(zuò)也是一樣,每條導入可(kě)以添加“;”結尾,也可(kě)以不加;在導入資源庫文件時(shí),如果我們選擇當前資源庫文件的某個(gè)具體(tǐ)版本,那(nà)麽版本号就會(huì)出現在文件名的後方,如下圖所示:

可(kě)以看到版本号置于文件結尾處,與文件名之間(jiān)以“:”分隔。

需要注意的是,導入庫文件的定義信息,必須要置于整個(gè)腳本規則文件的頂部,具體(tǐ)的規則及函數(shù)定義必須位于導入資源庫定義信息之下,否則就有(yǒu)語法錯誤。但(dàn)對于變量庫、參數(shù)庫、常量庫及動作(zuò)庫之間(jiān)的順序則是任意的。

接下來(lái)我們來(lái)看看規則定義,規則的位置是任意的,隻是保證它們的位置在導入資源庫定義內(nèi)容之下就行(xíng)。

規則定義

在一個(gè)腳本式規則文件當中,可(kě)以添加零至多(duō)個(gè)普通(tōng)規則或循環規則定義信息,其定義位置必須要在導入庫文件的定義信息之下。一個(gè)标準的普通(tōng)規則定義的結構如下。

在一個(gè)普通(tōng)規則當中,else部分如果沒有(yǒu)動作(zuò)可(kě)定義,那(nà)麽是可(kě)以省略不寫的,就像下面這樣:

看完普通(tōng)規則後,我們再來(lái)看看循環規則定義,下面是一個(gè)标準的循環規則定義結構:

對照向導式決策集裏的循環規則定義,可(kě)以看到結構完全一緻,唯一不同的是這裏采用腳本方式實現。同樣在腳本式循環規則的循環體(tǐ)中,如果沒有(yǒu)“否則”部分,那(nà)麽這裏的“else”部分的定義就可(kě)以省略,這與普通(tōng)規則一樣。

規則屬性

無論是普通(tōng)規則,還(hái)是循環規則,屬性定義部分都是一樣的,而且與向導式規則中普通(tōng)規則和(hé)循環規則保持一緻。

如果不記得(de)屬性有(yǒu)哪些(xiē)可(kě)以通(tōng)過ALT+"/"鍵打開(kāi)代碼提示,選擇需要的屬性即可(kě),多(duō)個(gè)屬性之間(jiān)可(kě)以用空(kōng)格或","号分隔,具體(tǐ)屬性中英文名及描述見規則屬性部分介紹,如下圖所示:

在腳本式決策集編輯器(qì)當中,通(tōng)過使用ALT+"/"鍵就可(kě)以打開(kāi)當前光标所在位置的代碼提示功能,如果你(nǐ)在按ALT+"/"鍵時(shí)沒出現代碼提示菜單,則你(nǐ)的浏覽器(qì)可(kě)能已占用了這個(gè)快捷鍵,我們必須要将這個(gè)快捷鍵開(kāi)放出現,留給腳本式決策集編輯器(qì)使用。

屬性賦值通(tōng)過”=“實現,多(duō)個(gè)屬性之間(jiān)需要添加空(kōng)格或回車(chē),對于String類型的屬性值需要添加雙引号包裹,日期類型要采用“yyyy-MM-dd HH:mm:ss”格式來(lái)定義,布爾類型則直接輸入true或false,如下圖所示的屬性:

條件定義部分

對于一個(gè)普通(tōng)規則,條件定義部分在if與then之間(jiān),對于循環規則,條件定義部分指的是循環體(tǐ)中在if與then之間(jiān)的部分。

在條件定義部分中我們可(kě)以添加具體(tǐ)的業務條件判斷,與向導式規則類似,在編寫腳本式規則條件時(shí),單個(gè)條件也是由條件左邊部分,比較操作(zuò)符及條件右邊部分。在條件左邊部分,同樣可(kě)以使用參數(shù)、變量及方法,當然也可(kě)以添加簡單的加、減、乘、除,對于條件的比較操作(zuò)符,我們可(kě)以通(tōng)過ALT+"/"鍵打開(kāi)代碼提示來(lái)進行(xíng)查看,如下圖所示:

條件左邊值

條件左邊值格式為(wèi):變量/參數(shù)/方法 [+][/][*][/] 變量/參數(shù)/方法/數(shù)字/字符串 [+][/][*][/]變量/參數(shù)/方法/ 數(shù)字/字符串...

合法的條件左邊值定義示例
員工.salary/10
員工.salary-10
員工.salary+10-5*2/3
員工.salary+10
員工.salary*10
員工.salary
參數(shù).approve
參數(shù).amount+10
MethodTest.判斷用戶名("張三")+12*12
MethodTest.判斷用戶名("張三")

條件右邊值

與條件左邊值類似,條件右邊值除了可(kě)輸入單個(gè)普通(tōng)的數(shù)字、字符串、變量、參數(shù)、方法、常量外,也可(kě)以使用一級或多(duō)級加、減、乘、除操作(zuò)連接複雜表達式,但(dàn)一級或多(duō)級加、減、乘、除操作(zuò)的右邊對象同樣可(kě)以是普通(tōng)的數(shù)字、字符串、變量、參數(shù)、方法、常量,其語法格式如下:

數(shù)字/字符串/變量/參數(shù)/方法/常量 [+][-][*][/] 數(shù)字/字符串/變量/參數(shù)/方法/常量 [+][-][*][/] 數(shù)字/字符串/變量/參數(shù)/方法/常量 ...

在條件右邊值當中,可(kě)以使用括号來(lái)實現加、減、乘、除運算(suàn)優先級,依照條件右邊值語法格式,上(shàng)面條件左邊值格式為(wèi)不合法的示例,在條件右邊值中都是合法的。在條件左值當中,我們可(kě)不以使用常量,但(dàn)在條件右值當中就可(kě)以使用常量,下面是幾個(gè)合法的條件右邊值定義示例:

合法的條件右邊值定義示例
員工.salary+10-(員工.level-2.11*(2+2.1))
MethodTest.判斷用戶名("張三")+員工.salary
員工.salary+員工.level+10
MethodTest.判斷用戶名("張三")+12*12
員工.salary+10-5*2/3*(2+1.11)
MethodTest.判斷用戶名("張三")
員工.salary+10-5*2/3
員工.salary-10
員工.salary-10
參數(shù).approve
參數(shù).amount+10
員工.salary+10
員工.salary*10
true
false
10
"yes"
$學曆.大(dà)專
10+20
20*0.08+30

多(duō)條件組合

在規則編寫過程當中,如果有(yǒu)多(duō)個(gè)條件,那(nà)麽可(kě)以采用“and”或“or”符号來(lái)對多(duō)個(gè)條件進行(xíng)連接組合,同時(shí)對于組合的條件,還(hái)可(kě)以添加括号來(lái)實現組件條件計(jì)算(suàn)的優先級,在未添加括号的多(duō)個(gè)組合條件之間(jiān),要使用相同連接符号,也就是說在未添加括号的多(duō)個(gè)組合條件之間(jiān),要麽使用“and”,要麽使用“or”。下面當前羅列了一些(xiē)常用的組合條件示例:

組合條件 描述
員工.level==1 or 員工.level==2 兩條件隻滿足一個(gè)條件即可(kě)
員工.salary>1000 and 員工.salary<10000 兩條件必須同時(shí)滿足
員工.salary>1000 and 員工.salary<10000 and (員工.level==1 or 員工.level==2 or (員工.學曆 == $學曆.大(dà)專 and 員工.salary>員工.level*1.5 and 員工.dept.id=="D21")) 前兩個(gè)條件滿足,括号內(nèi)前兩個(gè)條件與最後那(nà)括号內(nèi)條件必須要滿足其一
員工.salary>1000 and 員工.salary<10000 and (員工.level==1 or 員工.level==2) 前兩個(gè)條件必須同時(shí)滿足,同時(shí)後面兩個(gè)條件必須要有(yǒu)一個(gè)滿足
員工.學曆 == $學曆.大(dà)專 and 員工.salary>員工.level*1.5 and 員工.dept.id=="D21" 表示三個(gè)條件必須同時(shí)滿足

通(tōng)過上(shàng)面的例子可(kě)以看到,通(tōng)過“and”或“or”符号來(lái)對多(duō)個(gè)條件進行(xíng)連接組合以及添加括号或多(duō)層嵌套括号可(kě)以實現非常複雜的條件組合,從而滿足我們的業務需求。對于連接多(duō)個(gè)條件的“and”或“or”符号,在使用時(shí)還(hái)可(kě)以用“&&”或“||”來(lái)替換,程序員一定很(hěn)熟悉,“&&”或“||”在代碼中表示的就是“并且”“或者”,除此之外,我們還(hái)可(kě)以直接使用“并且”“或者”的中文來(lái)連接多(duō)個(gè)條件,如下面的截圖所示:

在腳本式規則中,條件定義的可(kě)讀性與向導式規則相比就很(hěn)差了,所以這也是我們不推薦使用腳本式規則的原因之一。

動作(zuò)定義部分

腳本式決策集中普通(tōng)規則的的動作(zuò)定義部分寫在“then”與“end”之間(jiān)或者是“else”與“end”之間(jiān),循環規則中除了循環體(tǐ)中可(kě)在上(shàng)述兩個(gè)地方添加動作(zuò)外,還(hái)可(kě)以在"loopStart"與“if”之間(jiān)或"loopEnd"與"end"之間(jiān)添加動作(zuò),動作(zuò)可(kě)有(yǒu)一個(gè)或多(duō)個(gè),每個(gè)動作(zuò)以“;”或回車(chē)結束。可(kě)執行(xíng)的動作(zuò)有(yǒu)三種類型,那(nà)就是為(wèi)變量或參數(shù)賦值、執行(xíng)方法、執行(xíng)自定義函數(shù)以及控制(zhì)台內(nèi)容輸出。我們首先來(lái)看看針對變量或參數(shù)的賦值操作(zuò)。

賦值操作(zuò)

賦值操作(zuò)的語法格式如下:

變量或參數(shù) = 數(shù)字/字符串/變量/參數(shù)/方法/常量 [+][-][*][/] 數(shù)字/字符串/變量/參數(shù)/方法/常量 [+][-][*][/]數(shù)字/字符串/變量/參數(shù)/方法/常量 ...

可(kě)以看到,針對變量或參數(shù)的賦值,首先要寫出具體(tǐ)的變量或參數(shù)名,然後是“=”符号,接下來(lái)在“=”右邊是一個(gè)簡單或複雜的賦值表達式。在這裏賦值表達式與條件的右邊值格式完全相同,所以這裏不再贅述。

執行(xíng)方法

在做(zuò)執行(xíng)方法操作(zuò)時(shí),我們需要導入定義目标方法的動作(zuò)庫,一旦導入,我們通(tōng)過ALT+"/"鍵代碼提示中就可(kě)以看到當前文件中可(kě)用的方法,選擇好一個(gè)方法後,如果這個(gè)方法中包含參數(shù),那(nà)麽我們還(hái)要根據在方法定義時(shí)指定的參數(shù)類型,為(wèi)方法填充适當的參數(shù),對于方法參數(shù),它也支持類型條件右邊值那(nà)種複雜的語法格式,執行(xíng)方法的語法格式如下:

方法名([參數(shù)1,參數(shù)2...])

執行(xíng)自定義函數(shù)

所謂執行(xíng)自定義函數(shù)是指執行(xíng)在當前規則文件當中定義的自定義函數(shù),關于自定義函數(shù)見後面內(nèi)容描述,執行(xíng)自定義函數(shù)的格式如下:

函數(shù)名([參數(shù)1,參數(shù)2...])

控制(zhì)台內(nèi)容輸出

在URule Pro當中,內(nèi)置了一個(gè)名為(wèi)out的向控制(zhì)台內(nèi)容輸出內(nèi)容的函數(shù),其語法格式如下:

out(數(shù)字/字符串/變量/參數(shù)/方法/常量 [+][-][*][/] 數(shù)字/字符串/變量/參數(shù)/方法/常量 [+][-][*][/] 數(shù)字/字符串/變量/參數(shù)/方法/常量 ... )

從格式中可(kě)以看到,它以“out”開(kāi)頭,後面的括号中就是我們需要輸出的內(nèi)容,對于輸出內(nèi)容格式,與條件的右邊值格式完全相同。

對中文的支持

在規則編寫當中,無論是普通(tōng)規則還(hái)是循環規則,所有(yǒu)的關鍵字可(kě)以使用對應的中文來(lái)進行(xíng)替代,具體(tǐ)見下表:

關鍵字 對應的中文關鍵字
rule 規則
loopRule 循環規則
loopTarget 循環對象
loopStart 開(kāi)始前動作(zuò)
loopEnd 結束後動作(zuò)
if 如果
then 那(nà)麽
end 結束
and 并且
or 或者
> 大(dà)于
< 小(xiǎo)于
>= 大(dà)于等于
<= 小(xiǎo)于等于
== 等于
!= 不等于
EndWith 結束于
NotEndWith 不結束于
StartWith 開(kāi)始于
NotStartWith 不開(kāi)始于
In 不集合中
NotIn 不在集合中
Match 匹配
NotMatch 不匹配
EqualsIgnoreCase 忽略大(dà)小(xiǎo)寫等于
NotEqualsIgnoreCase 忽略大(dà)小(xiǎo)寫不等于

下面的截圖中是一個(gè)用英文關鍵字編寫的普通(tōng)規則

對應的中文規則如下:

下圖中是一個(gè)用中英文關鍵字混合的規則:

在腳本式決策集中,可(kě)通(tōng)過//來(lái)添加單行(xíng)備注,多(duō)行(xíng)備注用/..備注內(nèi)容../實現

盡管在腳本式規則集中提供了與向導式規則集一樣的功能,但(dàn)由于其需要手寫的特點,決定了它的編寫過程中出現錯誤的可(kě)能性,同時(shí),腳本式規則中多(duō)條件的組合可(kě)讀性相比向導式規則中圖形化展現方式也要差很(hěn)多(duō),所以我們還(hái)是推薦大(dà)家(jiā)使用向導式規則集。在URule Pro中,所有(yǒu)的功能點都可(kě)以通(tōng)過向導配置的方式完成,完全不需要手寫任何腳本。

results matching ""

    No results matching ""