1. 程式人生 > >drools 7.x 領域語言dsl詳細語法

drools 7.x 領域語言dsl詳細語法

1 領域特定語言(DSL)

我們將要討論的第一個關於DRL的抽象是領域特定的語言,或者僅僅是DSL。

DSL是為特定上下文定製DRL的一種很好的方法。

Drools DSL背後的概念很簡單。建立一個包含面向業務的概念的字典檔案,並將其翻譯成DRL。領域專家僅需要在編寫規則時,要了解面向業務的概念,而不必擔心DRL的技術方面。

定義業務概念和DRL之間的轉換的字典檔案簡單地稱為Drools中的DSL。包含使用業務概念定義的規則的檔案稱為DSLR。當技術團隊負責建立和維護dictionary檔案(DSL)時,SME負責業務規則的建立和維護(DSLR)。 DSL是由Drools支援的;沒有特殊的依賴項,在我們開始使用它之前,不需要任何配置。

2. 字典檔案(即DSL)

字典檔案(或DSL)是一個包含DSL條目的文字檔案(帶有一個.dsl拓展名)。

  1. 該檔案以開括號“[”開始的行被認為是一個DSL條目,都被認為是DSL條目。
  2. 以井號“#”開頭的行被認為是註釋。
  3. 從一個既不是括號“[”也不是“#”號開始的行,被認為是前一個DSL條目的一部分

DSL條目的格式如下:

[<scope>][<type definition>]<dsl expression>=<replacement text>

<scope>部分目前支援四種類型:

  1. [when]或者[condition]
    :這個DSL條目只被用於LHS,即規則的條件部分
  2. [then]或者[consequence]:這個DSL條目僅對於規則的RHS有用,就是規則的動作和結果。
  3. [*]:這個DSL條目在規則的條件和操作部分都是有效的
  4. [keyword]:這個DSL條目在DSLR檔案的任何部分都是有效的,甚至在規則定義之外也是有效的。
  5. <type definition >部分不是強制的(我們可以省略它,或者使用空的括號[] ),被用於作為編輯器的提示,比方說KIE-Workbench。在 <type definition>之後就是 <dsl expression> ,這是將在DSLR檔案中匹配和替換的文字。
  6. 一個 <dsl expression>包括一個java正則表示式任意數量的嵌入式變數定義。變數定義包含在括號中("{“和”}"),它包含一個變數名和兩個可選部分,由冒號“:”分隔開。如果只存在一個可選部分,則將其作為正則表示式來匹配將分配給該變數的文字;如果有兩個可選部分,第一個是作為一個編輯器的提示(比如說是KIE-Workbench),第二個是正則表示式。一個<dsl expression>通常以等號結尾(=)在等號之後.
  7. <replacement text>將會被用於替換DSLR中的任何與 <dsl expression>相匹配的部分。在 <dsl expression>部分定義的變數可以在這部分中使用,就像命名正則表示式匹配組一樣,通過使用帶括號內的變數的名稱。可選地,變數名後面可能會有一個感嘆號“!”以及一個變換函式。支援的轉換函式在下面的表中詳細說明。
Name Description
ul 把所有字母轉換成大寫字母。
lc 把所有字母轉換成小寫字母。
ucfirst 把第一個字母轉換成大寫字母,所有其他字母都轉換成小寫字母
num 從字串中提取所有的數字。如果字串的最後兩個數字在(.)或者(,)之前,那麼就會插入一個十進位制的標識
a?b/c (其實就是三元運算子)將字串與字串a進行比較,如果它們是相等的,則將其替換為b,否則用c代替。但是c可以是另一個三元組a、b、c,這樣整個結構實際上是一個轉換表。

一個典型的(非常簡單的)DSL條目可能看起來像下面這樣:

[when]There is a Customer=Customer()

上面的這個DSL條目講的是我們會加DSLR中的所有的“There is a Customer”文字都替換為Customer()表示式。