Drools —— 什麼是規則

在這個章節,我們將會詳細講述業務規則:

  • 業務規則的定義和構成
  • 業務規則對於開發生命週期的重要性
  • drools等開發技術的使用以及其爲組織中的開發人員和其他所有人能提供的工具

什麼是規則

生活中我們每天都在被規則驅動。在開車的時候每當遇到紅燈我們就會停下來,我們這樣做就是在遵循當紅燈亮時我們就要停下來的規則。同時我們也都知道這個規則,即當我們到達某個指定的年齡時便可以通過考試來獲得駕照。

即使我們像膽大妄爲的開發者,不遵守這些規則,但我們也會受到自然規則的限制。比如,如果你不呼吸,就會窒息;如果你跳起來,正如物理規則所規定的那樣,引力會把你往下拉,最終你也將會落回地面。這些被深入研究過的規則(比如引力),可以使用簡單的數學公式將它們表達出來。然而對於日常生活中我們認爲是常識的規則,我們通常使用簡單的結構來表達:當檢測到一組條件的時候,我們將會做指定的動作。

when conditions  
do  actions     

隨着處理的場景的複雜度的增長,這些結構的分類對於組織將會是非常重要。 這些場景由大量獨立的簡單的決策構成,這些決策協同工作以提供全方位的綜合評估。這個綜合評估開始先以簡單的評估來決定我們調用推理的環境的本質。這些推理可能和其他的數據或推理產生交叉,直到可以實現和理解該領域的複雜視圖,並且實現組織目的的行爲可以被執行。                                     

這些存在組織的系統中的隱晦的規則,長期以來都是一個靜態的結構。從一些大型的應用開始,隨着時間的推移,web應用、中間件、服務的發展,這些解決方案通常跟系統的一部分高度耦合在一起。另一方面,業務規則應該允許以特定的、易於閱讀和拆分的結構的方式來定義,這樣對組織中的不同組都有意義——而不僅僅是隻適合開發人員——可以快速自動的實現和更新。

規則基本結構

每個規則引擎都有特定的語法,且都有點小小的不同。儘管如此,這些原始的結構對於所有規則引擎都是通用的,它們看起來跟下面表示的都很相識:

when (a condition is found to be true )
then (an action is executed)

我們還可以在上面的結構中加很多我們能想到的語法糖。規則的基礎結構就是這樣由一系列的條件和動作組成。condition就是一條約束或者過濾器。這些過濾器將可以看到領域中的有用的信息,進而去嘗試發現符合定義標準的數據。一旦獲取到符合匹配條件的一組數據,就會將匹配數據作爲參數,並計劃執行後續動作。

condition的工作原理類似於query,通過特定的過濾器把指定領域中的數據不斷縮小。這也意味着規則只能在特定的領域有意義:如果你的規則的設計爲了過濾蘋果,而你只向規則提供橘子,那麼在這些規則中將永遠匹配不到爲真的condition。

這個結構大概就這麼簡單,它是所有規則的基礎,我們也將會在這本書中看到它。由於這個結構,業務規則系統在複雜的場景比傳統的代碼具備巨大的優勢。下個章節,我們將會解釋那些優勢。

聲明式方法

業務規則系統是基於稱爲聲明式編程的編程模式。這種編程模式支持你表達程序的邏輯,且無需明確的指定所要遵循的指令流。由於condition像filter一樣工作,當數據被引入到有匹配condition的規則引擎中,規則或規則組就會被執行。也就是說,流程的控制既不是通過規則的順序,也不是數據進入的順序,而是規則聲明的condition決定的。這種聲明式方法允許被寫出的很多規則不需要擔心它們到底應該需要寫在什麼特定的地方。

命令式和聲明式的實現

命令式編程是對我們平常生活中的編程模式的命名。這種編程模式一般都會使用Java、C#或其他的語言。它通過指令流的控制來定義的,我們明確的清楚每行代碼何時會被執行。

另一方面,聲明式方式不允許讓程序員直接控制順序流,而是由數據引導規則的執行。首先,這對語言來說,大概很難被掌握或者被認爲是比較有用的特性。但是,我們將要看到Drools如何在基於Drools規則的聲明性實現和基於Java的命令式實現之間實現非常有用的聯合。

當然這些drools規則將要運行在java應用中,它在順序流的什麼位置以及什麼時候被執行取決於代碼。爲了實現它,Drools規則引擎將業務規則轉換了樹,如下圖所示:

正如你看到的圖片中顯示的那樣,每條規則condition都被分爲了一個小塊,並用過樹形結構進行連接和重用。每當數據提供給規則引擎,都會有跟這個類似的樹進行評估,並最終會到達Action,此時將其標記爲執行特定的規則做準備的數據。這種從業務規則到決策樹的轉化是可以實現的,因爲規則結構很適合將它們自己標記爲數據。也就是說規則代碼可以很快的被轉換成高效的決策樹結構,並且可以在運行時進行改變和更新。能做到這些,正是因爲通過更新樹的結構可以輕鬆的實現Condition的更新、移除和增加。

小貼士:值得一提的是,上面的圖只是一個簡單的示例。真實的決策樹會有更復雜的topic,我們將在下面的章節中給大家講解。上面的圖只是簡單描述了決策樹的意圖。

下一個章節,我們將會討論這些結構在複雜系統中對性能、穩定性、協作性非常有用的原因。

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