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

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

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

    隨筆 - 19, 文章 - 93, 評論 - 17, 引用 - 0
    數據加載中……

    (六): Drools規則語言詳解(上)

    Drools 規則語言詳解(上)

    <!--[if !supportLists]--> 1.? <!--[endif]--> 概述:

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

    <!--[if !supportLists]--> 1.1??? <!--[endif]--> 規則文件

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

    1.2 規則的結構

    一個規則結構大致如下:

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

    可以看到,這是非常簡單的。通常的標點符號都是不需要的,甚至連“ name ”的雙引號都是不需要的。 ATTRIBUTES 是簡單的,也是可選的,來提示規則的行為方式。 LHS 是規則的條件部分,需要按照一定的語法來寫。 RHS 基本上是一個允許執行 Java 語法的代碼的塊(以后將會支持 groovy C #)。任何在 LHS 中使用的變量都可以在 RHS 中使用。

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

    <!--[if !supportLists]--> 1.3?? <!--[endif]--> Domain Specific Language

    Domain Specific Language 是對原生規則語言的加強。它們使用“ expander ”機制。 Expander 機制是一種可擴展的 API 。你可以使用 .dsl 文件,來提供從域或自然語言到規則語言和你的域對象的映射。你可以將 .dsl 文件看成是對你的域模型的映射。 DSL 提供了更高的規則可讀性,你可以選擇使用你自己創建的 DSL ,或者是原生的規則語言。

    1.4 保留字

    在規則語言中存在一些保留字。你應該避免使用這些保留字,來命名規則文本中的域對象,屬性,方法,功能。保留字如下: when , then , rule , end contains , matches and or modify , retract , assert , salience , function query , exists , eval , agenda-group , no-loop duration , -> not , auto-focus

    <!--[if !supportLists]--> 2. ? <!--[endif]--> 注釋

    2.1 單行注釋:

    Figure?2.1.?Single line comment

    2.2 多行注釋:

    Figure?2.2.?Multi line comment

    <!--[if !supportLists]-->

    3. ??? <!--[endif]--> Package

    一個包是 rule 和其他相關結構,像 import global 的集合。 Package 的成員之間通常都是相關聯的。一個 Package 代表了一個命名空間( namespace ),用來使給定的規則組之間保持唯一性。 Package 的名字本身就是命名空間,并且與文件或文件夾并無關聯。

    <!--[if !supportEmptyParas]-->

    可以將來自不同規則源的規則裝配在一起,前提是這些規則必須處在同一個命名空間中。盡管如此,一個通常的結構是將處于同一個命名空間中的所有規則都放在同一個相同的文件中。

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


    Figure?3.1.?package
    3.1 import

    Figure?3.2.?import

    Import 語句的使用很像 Java 中的 import 語句。你需要為你要在規則中使用的對象,指定完整的路徑和類名。 Drools 自動從相同命名的 java 包中引入所需的類。

    3.2 expander

    Figure?3.3.?expander

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

    3.3 global


    Figure?3.4.?global

    Global 就是全局變量。如果多個 package 聲明了具有相同標識符的 global ,那么它們必需是相同的類型,并且所有的引用都是相同的。它們通常用來返回數據,比如 actions 的日志,或者為 rules 提供所需的數據或服務。 global 并不是通過 assert 動作放入 WorkingMemory 的,所有當 global 發生改變時,引擎將不會知道。所以, global 不能作為約束條件,除非它們的值是 final 的。將 global 錯誤的使用在約束條件中,會產生令人驚訝的錯誤結果。

    <!--[if !supportEmptyParas]-->

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

    <!--[if !supportEmptyParas]-->

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

    4. Function


    Figure?4.1.?function

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

    <!--[if !supportEmptyParas]-->

    一個典型的 function 聲明如下:

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

    <!--[if !supportEmptyParas]-->

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

    <!--[if !supportEmptyParas]-->

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

    <!--[if !supportEmptyParas]-->

    posted on 2006-12-03 09:56 BPM 閱讀(811) 評論(0)  編輯  收藏 所屬分類: 規則引擎

    主站蜘蛛池模板: 国产精品成人免费福利| 十八禁无码免费网站| 影音先锋在线免费观看| 亚洲国产精品张柏芝在线观看| 亚洲成人免费在线观看| 亚洲精品高清国产麻豆专区| 8090在线观看免费观看| 亚洲色欲或者高潮影院| 免费阿v网站在线观看g| 亚洲 欧洲 视频 伦小说| 成年丰满熟妇午夜免费视频| 亚洲av无码成人影院一区| 免费一级毛片在级播放| aaa毛片免费观看| 一区二区三区亚洲| 成年美女黄网站18禁免费| 精品国产日韩亚洲一区91| 亚洲精品久久久www | 久久精品国产亚洲Aⅴ蜜臀色欲| 视频免费1区二区三区| 亚洲欧洲无码AV电影在线观看| 久久免费观看国产精品88av| 亚洲欧洲日韩综合| 日韩精品视频免费观看| 国产日韩精品无码区免费专区国产| 亚洲不卡中文字幕无码| 无人在线观看完整免费版视频| 精品久久久久久亚洲中文字幕 | 中文字幕的电影免费网站| 亚洲五月激情综合图片区| 最近最新中文字幕完整版免费高清 | 久久久久免费精品国产| 91亚洲视频在线观看| 四虎永久免费影院| 99在线观看视频免费| 亚洲欧美国产国产一区二区三区| 久久亚洲欧洲国产综合| 中文字幕免费在线看线人 | 免费一级特黄特色大片| 久久久亚洲欧洲日产国码aⅴ| 日本免费一区二区三区最新vr|