<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    guangnian0412's BLOG

    Java in my life

    常用鏈接

    統(tǒng)計(jì)

    積分與排名

    我關(guān)注的Blog

    最新評(píng)論

    JBoss Rules 學(xué)習(xí)(六): Drools規(guī)則語(yǔ)言詳解(上)

    Drools 規(guī)則語(yǔ)言詳解(上)

    1.? 概述:

    Drools 3 采用了原生的規(guī)則語(yǔ)言,那是一種非 XML 文本格式。在符號(hào)方面,這種格式是非常輕量的,并且通過(guò)“ expanders ”支持符合你問(wèn)題域的 Domain Specific Language DSL )。這一章把焦點(diǎn)放在了 Drools 原生的規(guī)則格式。如果你想從技術(shù)上了解規(guī)則語(yǔ)言的機(jī)制,可以參考“ drl.g ”源文件,這是用 Antlr3 語(yǔ)法來(lái)描述規(guī)則語(yǔ)言。如果你使用 Rule Workbench ,內(nèi)容助手將會(huì)為你完成大量的規(guī)則結(jié)構(gòu),例如輸入“ ru ”,然后按 ctrl space ,會(huì)為你建立規(guī)則結(jié)構(gòu)。

    1.1??? 規(guī)則文件

    一個(gè)規(guī)則文件通常是一個(gè)以 .drl 擴(kuò)展名結(jié)尾的文件。在一個(gè) drl 文件中,你可以有多條 rules , functions 等等。盡管如此,你也可以將你的規(guī)則分布在多個(gè)文件中,這有利于管理大量的規(guī)則。一個(gè) DRL 文件是一個(gè)簡(jiǎn)單的文本文件。

    1.2 規(guī)則的結(jié)構(gòu)

    一個(gè)規(guī)則結(jié)構(gòu)大致如下:

    rule? " name "
    ????ATTRIBUTES
    ????when
    ????????LHS
    ????then
    ????????RHS
    end

    可以看到,這是非常簡(jiǎn)單的。通常的標(biāo)點(diǎn)符號(hào)都是不需要的,甚至連“ name ”的雙引號(hào)都是不需要的。 ATTRIBUTES 是簡(jiǎn)單的,也是可選的,來(lái)提示規(guī)則的行為方式。 LHS 是規(guī)則的條件部分,需要按照一定的語(yǔ)法來(lái)寫(xiě)。 RHS 基本上是一個(gè)允許執(zhí)行 Java 語(yǔ)法的代碼的塊(以后將會(huì)支持 groovy C #)。任何在 LHS 中使用的變量都可以在 RHS 中使用。

    注意:每行開(kāi)始的空格是不重要的,除非在 DSL Domain Specific Language )語(yǔ)言中有特別的指明。

    1.3?? Domain Specific Language

    Domain Specific Language 是對(duì)原生規(guī)則語(yǔ)言的加強(qiáng)。它們使用“ expander ”機(jī)制。 Expander 機(jī)制是一種可擴(kuò)展的 API 。你可以使用 .dsl 文件,來(lái)提供從域或自然語(yǔ)言到規(guī)則語(yǔ)言和你的域?qū)ο蟮挠成?。你可以?/span> .dsl 文件看成是對(duì)你的域模型的映射。 DSL 提供了更高的規(guī)則可讀性,你可以選擇使用你自己創(chuàng)建的 DSL ,或者是原生的規(guī)則語(yǔ)言。

    1.4 保留字

    在規(guī)則語(yǔ)言中存在一些保留字。你應(yīng)該避免使用這些保留字,來(lái)命名規(guī)則文本中的域?qū)ο螅瑢傩?,方法,功能。保留字如下?/span> when , then , rule , end contains matches , and , or , modify retract , assert , salience function , query exists eval agenda-group no-loop , duration , -> , not auto-focus 。

    2. ? 注釋

    2.1 單行注釋?zhuān)?/span>

    Figure?2.1.?Single line comment

    2.2 多行注釋?zhuān)?br />

    Figure?2.2.?Multi line comment


    3. ??? Package

    一個(gè)包是 rule 和其他相關(guān)結(jié)構(gòu),像 import global 的集合。 Package 的成員之間通常都是相關(guān)聯(lián)的。一個(gè) Package 代表了一個(gè)命名空間( namespace ),用來(lái)使給定的規(guī)則組之間保持唯一性。 Package 的名字本身就是命名空間,并且與文件或文件夾并無(wú)關(guān)聯(lián)。

    可以將來(lái)自不同規(guī)則源的規(guī)則裝配在一起,前提是這些規(guī)則必須處在同一個(gè)命名空間中。盡管如此,一個(gè)通常的結(jié)構(gòu)是將處于同一個(gè)命名空間中的所有規(guī)則都放在同一個(gè)相同的文件中。

    下面的 rail-road 圖顯示了組成一個(gè) Package 的所有組件。注意:一個(gè) package 必須有一個(gè)命名空間,并且采用 Java 包名的約定。在一個(gè)規(guī)則文件中,各組件出現(xiàn)的位置是任意的,除了“ package ”和“ expander ”語(yǔ)句必須出現(xiàn)在任何一個(gè)規(guī)則之前,放在文件的頂部。在任何情況下,分號(hào)都是可選的。


    Figure?3.1.?package
    3.1 import

    Figure?3.2.?import

    Import 語(yǔ)句的使用很像 Java 中的 import 語(yǔ)句。你需要為你要在規(guī)則中使用的對(duì)象,指定完整的路徑和類(lèi)名。 Drools 自動(dòng)從相同命名的 java 包中引入所需的類(lèi)。

    3.2 expander

    Figure?3.3.?expander

    expander 語(yǔ)句是可選的,是用來(lái)指定 Domain Specific Language 的配置(通常是一個(gè) .dsl 文件)。這使得解析器可以理解用你自己的 DSL 語(yǔ)言所寫(xiě)的規(guī)則。

    3.3 global


    Figure?3.4.?global

    Global 就是全局變量。如果多個(gè) package 聲明了具有相同標(biāo)識(shí)符的 global ,那么它們必需是相同的類(lèi)型,并且所有的引用都是相同的。它們通常用來(lái)返回?cái)?shù)據(jù),比如 actions 的日志,或者為 rules 提供所需的數(shù)據(jù)或服務(wù)。 global 并不是通過(guò) assert 動(dòng)作放入 WorkingMemory 的,所有當(dāng) global 發(fā)生改變時(shí),引擎將不會(huì)知道。所以, global 不能作為約束條件,除非它們的值是 final 的。將 global 錯(cuò)誤的使用在約束條件中,會(huì)產(chǎn)生令人驚訝的錯(cuò)誤結(jié)果。

    注意: global 只是從你的 application 中傳入 WorkingMemory 的對(duì)象的命名實(shí)例。這意味著你可以傳入任何你想要的對(duì)象。你可以傳入一個(gè) service locator ,或者是一個(gè) service 本身。

    下面的例子中,有一個(gè) EmailService 的實(shí)例。在你調(diào)用規(guī)則引擎的代碼中,你有一個(gè) EmailService 對(duì)象,然后把它放入 WorkingMemory 。在 DRL 文件中,你聲明了一個(gè)類(lèi)型為 EmailService global ,然后將它命名為“ email ”,像這樣: global EmailService email ;。然后在你的規(guī)則的 RHS 中,你可以使用它,像這樣: email.sendSMS(number,message) 等等。

    4. Function


    Figure?4.1.?function

    Function 是將代碼放到你的規(guī)則源中的一種方法。它們只能做類(lèi)似 Helper 類(lèi)做的事(實(shí)際上編譯器在背后幫你生成了 Helper 類(lèi))。在一個(gè) rule 中使用 function 的主要優(yōu)勢(shì)是,你可以保持所有的邏輯都在一個(gè)地方,并且你可以根據(jù)需要來(lái)改變 function (這可能是好事也可能是壞事)。 Function 最有用的就是在規(guī)則的 RHS 調(diào)用 actions ,特別是當(dāng)那個(gè) action 需要反復(fù)調(diào)用的時(shí)候。

    一個(gè)典型的 function 聲明如下:

    function?String?calcSomething(String?arg)?{
    return ? " hola?! " ;
    }

    注意:“ function ”關(guān)鍵字的使用,它并不真正是 Java 的一部分。而 function 的參數(shù)就像是一個(gè)普通的 method (如果不需要參數(shù)就不用寫(xiě))。返回類(lèi)型也跟普通的 method 一樣。在一條規(guī)則(在它的 RHS 中,或可能是一個(gè) eval )中調(diào)用 function ,就像調(diào)用一個(gè) method 一樣,只需要 function 的名字,并傳給它參數(shù)。

    function 的替代品,可以使用一個(gè) Helper 類(lèi)中的靜態(tài)方法: Foo.doSomething() ,或者以 global 的方式傳入一個(gè) Helper 類(lèi)或服務(wù)的實(shí)例: foo.doSomething() foo 是一個(gè)命名的 global 變量)。


    posted on 2006-06-09 01:16 guangnian 閱讀(14278) 評(píng)論(7)  編輯  收藏 所屬分類(lèi): JBoss Rules(Drools)

    評(píng)論

    # re: JBoss Rules 學(xué)習(xí)(六): Drools規(guī)則語(yǔ)言詳解(上) 2006-12-06 17:48 yolanda[匿名]

    寫(xiě)得好,辛苦了.
    真應(yīng)該多些這樣的文章啊.  回復(fù)  更多評(píng)論   

    # re: JBoss Rules 學(xué)習(xí)(六): Drools規(guī)則語(yǔ)言詳解(上) 2007-02-12 06:58 tt

    :) 不錯(cuò),謝謝  回復(fù)  更多評(píng)論   

    # re: JBoss Rules 學(xué)習(xí)(六): Drools規(guī)則語(yǔ)言詳解(上) 2007-06-14 11:33 gcr

    真不錯(cuò) 最近項(xiàng)目中正使用,加油!共勉!  回復(fù)  更多評(píng)論   

    # re: JBoss Rules 學(xué)習(xí)(六): Drools規(guī)則語(yǔ)言詳解(上) 2007-07-20 09:34 萬(wàn)里

    欣賞中……  回復(fù)  更多評(píng)論   

    # re: JBoss Rules 學(xué)習(xí)(六): Drools規(guī)則語(yǔ)言詳解(上) 2007-07-20 10:57 萬(wàn)里

    GOOD  回復(fù)  更多評(píng)論   

    # re: JBoss Rules 學(xué)習(xí)(六): Drools規(guī)則語(yǔ)言詳解(上) 2008-01-18 16:10 ePim

    這世界還是牛經(jīng)多啊~,呵呵  回復(fù)  更多評(píng)論   

    # re: JBoss Rules 學(xué)習(xí)(六): Drools規(guī)則語(yǔ)言詳解(上) 2008-11-02 23:55 14

    復(fù)制粘貼而已有什么炫耀的啊  回復(fù)  更多評(píng)論   

    主站蜘蛛池模板: 最近高清国语中文在线观看免费| 亚洲伊人精品综合在合线| 四虎在线视频免费观看| 免费国产99久久久香蕉| a一级毛片免费高清在线| 亚洲欧美日韩一区二区三区在线| 蜜芽亚洲av无码精品色午夜| 亚洲人成无码网站久久99热国产| 女人18毛片免费观看| 黄色网址免费大全| 99xxoo视频在线永久免费观看| 两个人www免费高清视频| 十八禁的黄污污免费网站| 亚洲AV噜噜一区二区三区| 在线观看日本亚洲一区| 亚洲一区二区三区久久久久| 久久精品国产亚洲av水果派| 久久亚洲国产成人亚| 国产亚洲成AV人片在线观黄桃| 亚洲日韩中文在线精品第一| 国产一区二区三区无码免费| 免费无码又爽又刺激高潮的视频| 亚洲人成电影网站免费| 18禁止观看免费私人影院| 成人免费福利视频| 免费在线观看h片| 免费国产成人高清在线观看网站| 亚洲免费视频播放| 精品国产无限资源免费观看| 91九色精品国产免费| 永久免费AV无码国产网站| 好先生在线观看免费播放| 毛片免费视频观看| 麻豆一区二区免费播放网站| 免费一本色道久久一区| 永久免费av无码网站大全| 国产免费看插插插视频| 亚洲国模精品一区| 亚洲乱码无码永久不卡在线 | 亚洲av日韩av激情亚洲| 亚洲高清国产拍精品26U|