使用規則引擎實現業務邏輯

 

使用規則引擎可以通過降低實現複雜業務邏輯的組件的複雜性,降低應用程序的維護和可擴展性成本。這篇文章展示如何使用VisualRules規則引擎讓 Java™ 應用程序更適應變化。VisualRules有一個本地規則表達式語言和一個規則編輯器插件,使 VisualRules的應用更加簡單快捷

 

要求施加在當今軟件產品上的大多數複雜性是行爲和功能方面的,從而導致組件實現具有複雜的業務邏輯。實現 J2EE J2SE 應用程序中業務邏輯最常見的方法是編寫 Java 代碼來實現需求文檔的規則和邏輯。在大多數情況下,該代碼的錯綜複雜性使得維護和更新應用程序的業務邏輯成爲一項令人畏懼的任務,甚至對於經驗豐富的開發人員來說也是如此。任何更改,不管多麼簡單,仍然會產生重編譯和重部署成本。

 

規則引擎試圖解決(或者至少降低)應用程序業務邏輯的開發和維護中固有的問題和困難。可以將規則引擎看作實現複雜業務邏輯的框架。大多數規則引擎允許您使用聲明性編程來表達對於某些給定信息或知識有效的結果。您可以專注於已知爲真的事實及其結果,也就是應用程序的業務邏輯。

 

有多個規則引擎可供使用,其中包括商業和開放源碼選擇。商業規則引擎通常允許使用專用的類似英語的語言來表達規則。其他規則引擎允許使用腳本語言(比如 Groovy Python)編寫規則。本文爲您介紹 VisualRules規則引擎,並使用示例程序幫助您理解如何使用 VisualRules作爲 Java 應用程序中業務邏輯層的一部分。

 

 

VisualRules版本及特點描述

 

VisualRules是用 Java 語言編寫的商業規則引擎。VisualRules允許使用聲明方式表達業務邏輯。可以使用獨有的本地語言編寫規則,從而便於學習和理解。並且,還可以將 Java 代碼直接嵌入到規則文件中,這令 VisualRules的學習更加吸引人。VisualRules還具有其他優點:

 

  • 非常健全的技術支持
  • 易用
  • 快速的執行速度
  • 規則編譯爲Java代碼,跨平臺
  • 超過10年的專注研發投入
  • 商業化的售後服務,使產生問題得到更好的處理

 

當前VisualRules版本

 

在編寫本文之際,VisualRules規則引擎的最新版本是 4.0.7。這是一個更好的版本,它加入更多的功能和更簡單的使用。例如,用於遠程規則的部署和管理。

 

本文展示如何使用VisualRules作爲示例 Java 應用程序中業務邏輯層的一部分。

 

 

 

設置虛擬場景

 

下列假設爲應用程序解決的虛構問題設置了場景:

 

  • 名爲 XYZ 的公司構建兩種類型的計算機機器:Type1 Type2。機器類型按其架構定義。
  • XYZ 計算機可以提供多種功能。當前定義了四種功能:DDNS ServerDNS ServerGateway Router
  • 在發運每臺機器之前,XYZ 在其上執行多個測試。
  • 在每臺機器上執行的測試取決於每臺機器的類型和功能。目前,定義了五種測試:Test1Test2Test3Test4 Test5
  • 當將測試分配給一臺計算機時,也將測試到期日期分配給該機器。分配給計算機的測試不能晚於該到期日期執行。到期日期值取決於分配給機器的測試。
  • XYZ 使用可以確定機器類型和功能的內部開發的軟件應用程序,自動化了執行測試時的大部分過程。然後,基於這些屬性,應用程序確定要執行的測試及其到期日期。
  • 目前,爲計算機分配測試和測試到期日期的邏輯是該應用程序的已編譯代碼的一部分。包含該邏輯的組件用 Java 語言編寫。
  • 分配測試和到期日期的邏輯一個月更改多次。當開發人員需要使用 Java 代碼實現該邏輯時,必須經歷一個冗長乏味的過程。

 

因爲在對爲計算機分配測試和到期日期的邏輯進行更改時,公司會發生高額成本,所以XYZ 主管已經要求軟件工程師尋找一種靈活的方法,用最少的代價將對業務規則的更改至生產環境。於是VisualRules走上舞臺了。工程師決定,如果它們使用規則引擎來表達確定哪些測試應該執行的規則,則可以節省更多時間和精力。他們將只需要更改規則文件的內容,然後在生產環境中替換該文件。對於他們來說,這比更改已編譯代碼並在將已編譯代碼部署到生產環境中時進行由組織強制的冗長過程要簡單省時得多。

 

目前,在爲機器分配測試和到期日期時必須遵循以下業務規則:

 

  • 如果計算機是 Type1,則只能在其上執行 Test1Test2 Test5
  • 如果計算機是 Type2 且其中一個功能爲 DNS Server,則應執行 Test4 Test5
  • 如果計算機是 Type2 且其中一個功能爲 DDNS Server,則應執行 Test2 Test3
  • 如果計算機是 Type2 且其中一個功能爲 Gateway,則應執行 Test3 Test4
  • 如果計算機是 Type2 且其中一個功能爲 Router,則應執行 Test1 Test3
  • 如果 Test1 是要在計算機上執行的測試之一,則測試到期日期距離機器的創建日期 3 天。該規則優先於測試到期日期的所有下列規則。
  • 如果 Test2 是要在計算機上執行的測試之一,則測試到期日期距離機器的創建日期 7 天。該規則優先於測試到期日期的所有下列規則。
  • 如果 Test3 是要在計算機上執行的測試之一,則測試到期日期距離機器的創建日期 10 天。該規則優先於測試到期日期的所有下列規則。
  • 如果 Test4 是要在計算機上執行的測試之一,則測試到期日期距離機器的創建日期 12 天。該規則優先於測試到期日期的所有下列規則。
  • 如果 Test5 是要在計算機上執行的測試之一,則測試到期日期距離機器的創建日期 14 天。

 

捕獲爲機器分配測試和測試到期日期的上述業務規則的當前 Java 代碼如清單 1 所示:

 

使用Java代碼實現業務邏輯

 

 

 

使用 if-else 語句實現業務規則邏輯

 

Machine machine = ...

 

                        // Assign tests

 

                        Collections.sort(machine.getFunctions());

 

                        int index;

 

                        if (machine.getType().equals("Type1")) {

 

                        Test test1 = ...

 

                        Test test2 = ...

 

                        Test test5 = ...

 

                        machine.getTests().add(test1);

 

                        machine.getTests().add(test2);

 

                        machine.getTests().add(test5);

 

                        } else if (machine.getType().equals("Type2")){

 

index = Collections.binarySearch(machine.getFunctions(), "Router");

 

                        if (index >= 0) {

 

                        Test test1 = ...

 

                        Test test3 = ...

 

                        machine.getTests().add(test1);

 

                        machine.getTests().add(test3);

 

                        }

 

                        index = Collections.binarySearch(machine.getFunctions(), "Gateway");

 

                        if (index >= 0) {

 

                        Test test4 = ...

 

                        Test test3 = ...

 

                        machine.getTests().add(test4);

 

                        machine.getTests().add(test3);

 

                        }

 

                        ...

 

                        }

 

                        // Assign tests due date

 

                        Collections.sort(machine.getTests(), new TestComparator());

 

                        ...

 

                        Test test1 = ...

 

                        index = Collections.binarySearch(machine.getTests(), test1);

 

                        if (index >= 0) {

 

                        // Set due date to 3 days after Machine was created

 

                        Timestamp creationTs = machine.getCreationTs();

 

                        machine.setTestsDueTime(...);

 

                        return;

 

                        }

 

                        index = Collections.binarySearch(machine.getTests(), test2);

 

                        if (index >= 0) {

 

                        // Set due date to 7 days after Machine was created

 

                        Timestamp creationTs = machine.getCreationTs();

 

                        machine.setTestsDueTime(...);

 

                        return;

 

                        }

 

                        ...

 

 

 

上述所示代碼不是太複雜,但也並不簡單。如果要對其進行更改,需要十分小心。一堆互相纏繞的 if-else 語句正試圖捕獲已經爲應用程序標識的業務邏輯。如果您對業務規則不甚瞭解,就無法一眼看出代碼的意圖。

 

使用VisualRules規則配置的方式表示上述定義的業務規則。它包含以下內容:

 

  1. VisualRules規則配置器。
  2. JDk1.6
  3. Tomcat5
  4. VisualRules核心引擎

 

如圖所示:

1.VisualRules
規則配置器



 

JDKTomcat,核心引擎將不做展示,使用即可

 

2.創建規則工程



 

打開規則配置器,點文件菜單,選擇新建規則工程,工程名爲:機器功能測試,存放路徑可自由選擇

 

規則工程創建完成後,我們再爲當前場景創建一個規則包,在規則工程上面點右鍵,選擇:新建規則包,並命名爲test



 

 

 

 

在規則包創建完成後,我們再把規則對象添加到該規則包的對象庫中

 

 

 

 

 

對象添加完成後,我們就可以來配置業務規則了



 

如上圖所示:我們按照測試項目的優先級來配置規則,一共有5個測試項目

 

在規則配置完成以後,按照業務邏輯可以在規則中進行單元測試,例如:我們設定計算機爲:type2,測試功能爲:DDNS Server,機器創建日期爲:2013-05-14,那麼在規則執行完成後,我們可以得到如下的測試結果



 

 

從測試的結果可以看出:

 

針對type2這臺機器我們需要進行2個測試

 

1:在2013-05-07對它進行test2測試

 

2:在2013-05-04對它進行test3測試

 

 

 

VisualRules規則文件

 

如上面我們看到的規則配置,VisualRules規則文件可以包含一個或多個規則集或者規則。每個規則集或者規則中又可以包含一條或多條規則。

 

結束語

 

使用規則引擎可以顯著降低實現 Java 應用程序中業務規則邏輯的組件的複雜性。使用規則引擎以聲明方法表達規則的應用程序比其他應用程序更容易維護和擴展。正如您所看到的,VisualRules是一種功能強大的靈活的規則引擎產品。使用VisualRules的特性和能力,您可以靈活的配置應用程序的複雜業務邏輯。VisualRules採用中文化的規則配置方式使得學習和使用VisualRules規則引擎產品對業務人員來說變得相當容易。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章