林家偉 胡俊生 賴順福
摘要:在許多推理系統(tǒng)中,業(yè)務(wù)規(guī)則與代碼緊耦合制約的系統(tǒng)應(yīng)對(duì)業(yè)務(wù)變更的能力。因此,業(yè)務(wù)規(guī)則需要獨(dú)立于系統(tǒng)。另一方面,系統(tǒng)在變更升級(jí)時(shí),業(yè)務(wù)規(guī)則也要能快速地更改,需要有一定的依賴關(guān)系。獨(dú)立關(guān)系與依賴關(guān)系構(gòu)成了矛盾,該研究提出了一種依據(jù)對(duì)象的反射信息生成業(yè)務(wù)規(guī)則的方法。
關(guān)鍵詞:推理;業(yè)務(wù)規(guī)則;反射
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2015)35-0136-02
Abstract: In many of the reasoning system, business rules and codes are closely coupled with the ability of the system to cope with the business changes. Therefore, business rules need to be independent of the system. On the other hand, when the system changes, the business rules can be quickly changed, the need to have a certain dependence. This paper presents a method for generating business rules based on the object's reflection information..
Key words: reasoning; business rules; reflection
業(yè)務(wù)規(guī)則是業(yè)務(wù)在運(yùn)行過程中的控制策略與方式。業(yè)務(wù)規(guī)則可以使用產(chǎn)生式[1]:IF P THEN Q的方式進(jìn)行表示。在業(yè)務(wù)穩(wěn)定的流程中,這種規(guī)則可直接寫在代碼中。但在實(shí)際環(huán)境中,業(yè)務(wù)的變更是頻繁的。例如視頻企業(yè)有:“在活動(dòng)期所有觀眾可以任意點(diǎn)播本公司的免費(fèi)視頻”。此時(shí)前提P有三方面的限制,即時(shí)間=“活動(dòng)期”、觀眾=“任意”、視頻=“免費(fèi)視頻”,而結(jié)論Q則為點(diǎn)播。此時(shí)的主體為觀眾、客體對(duì)象及行為分別為視頻、點(diǎn)播。然而這種業(yè)務(wù)規(guī)則是經(jīng)常變化的,活動(dòng)期不是一成不變的,而且觀眾類型、視頻類型今后也有可能隨商業(yè)活動(dòng)的進(jìn)行而動(dòng)態(tài)調(diào)整。因此業(yè)務(wù)邏輯需要與系統(tǒng)分離。但另一方面,業(yè)務(wù)規(guī)則最終需要被系統(tǒng)所解析,并能用于流程的控制、數(shù)據(jù)訪問等操作。因此業(yè)務(wù)規(guī)則又需要與系統(tǒng)存在一定的應(yīng)對(duì)關(guān)系,存在一定的耦合。
這種分離與耦合構(gòu)成了一對(duì)矛盾。本研究使用反射技術(shù)來解決這一問題。通過對(duì)系統(tǒng)已有對(duì)象的反射,得到各種類與其成員的詳細(xì)信息,然后再根據(jù)這些信息生成業(yè)務(wù)規(guī)則。從而使得業(yè)務(wù)規(guī)則與系統(tǒng)存在緊密的應(yīng)對(duì)關(guān)系。另一方面,這些業(yè)務(wù)規(guī)則又可以以XML格式存儲(chǔ)于外部,便于動(dòng)態(tài)修改。
1 假設(shè)前提
首先,應(yīng)用程序中數(shù)據(jù)類的設(shè)計(jì)以O(shè)RM[2]思想為指導(dǎo),類與其屬性均與實(shí)際的實(shí)體一致。這種規(guī)范使得系統(tǒng)中類易于被規(guī)則的制訂者所理解。這種方式也使得能通過反射技術(shù)從系統(tǒng)的EXE或DLL文件中讀取系統(tǒng)所具有的類型,便于生成業(yè)務(wù)規(guī)則。
其次業(yè)務(wù)規(guī)則的表示以產(chǎn)生式方式表示。其中后件Q具體表示為TargetType.Method。其中TargetType是客體對(duì)象,而Method則為客體對(duì)象的方法。產(chǎn)生式的前件由簡單條件或復(fù)合條件組成。簡單條件可寫為 <對(duì)象、運(yùn)算符、比較值>的三元組。例如User.Age >= 18 。即User.Age表示對(duì)象,而>=為運(yùn)算符,18為進(jìn)行比較的值。而復(fù)雜條件,則由其他復(fù)雜條件、簡單條件與Not、And、Or等關(guān)系組成而成。
在上述的復(fù)雜條件示例,是一個(gè)OR形式的條件,該條件又有兩子條件,一為And復(fù)雜條件,另一個(gè)則為簡單條件。代表的條件為“主體的年齡在18到30歲之間,或客體的類型為FREE”。
另外,對(duì)于簡單條件又有一定的約束。簡單條件的Object部分需要預(yù)留一部分關(guān)鍵字,如分別用Subject、Object代表主體、客體。此外,該關(guān)鍵字還需要能進(jìn)一步擴(kuò)展,用于代表其他事實(shí),如系統(tǒng)配置等。對(duì)于有多層級(jí)的事實(shí),采用“.”分割各層級(jí)。如用戶類型下有角色Roles這一屬性,而角色下又有權(quán)限Permissons屬性,則可表示為Subject.Roles.Permissions。用RBAC形式表示“擁有管理員權(quán)限的用戶可以刪除視頻”,則該規(guī)則可表示為:
考慮到實(shí)際情況,在生成業(yè)務(wù)規(guī)則時(shí),還需要包含其他的信息,首先是DLL或EXE的版本信息,這些信息將用于驗(yàn)證后續(xù)的應(yīng)用程序版本與業(yè)務(wù)規(guī)則版本是否一致。如果業(yè)務(wù)規(guī)則所需的類型來源于多個(gè)DLL或EXE,則這些文件版本均需要被記錄。
采用反射技術(shù)[3]得到類型、屬性等需要較大的性能開銷。為了在對(duì)業(yè)務(wù)規(guī)則進(jìn)行解析時(shí)提升性能??梢栽谟涗洏I(yè)務(wù)規(guī)則的XML文件中保存這些類型的信息。
2 規(guī)則生成方法
2.1 類型的加載
類型的加載使用反射機(jī)制,通過查詢程序集的元素?fù)?jù)將程序集中的數(shù)據(jù)讀出。本研究中將其讀取后保存于XML文件上。其流程用以下的偽碼表示:
1)獲得所有程序集
2)對(duì)于每一個(gè)程序集,查找該程序集中所有的類型
3)對(duì)于每一個(gè)類型,只要不是基本數(shù)據(jù)類型,分別查找其各屬性與行為,并生成XML節(jié)點(diǎn)
4)對(duì)于屬性,如果不是基本數(shù)據(jù)類型,繼續(xù)查找其各屬性與行為,生成XML節(jié)點(diǎn),并嵌入當(dāng)前類型。
上述的3,4步驟是遞歸進(jìn)行的,但是,這一流程會(huì)遇到無限循環(huán)的情況,例如教師類有對(duì)應(yīng)的授課班級(jí),而班級(jí)類則有對(duì)應(yīng)的指導(dǎo)教師。此時(shí)教師與班級(jí)就存在相互引用的情況。由于類的成員之間相互引用情況復(fù)雜,這種鏈?zhǔn)降囊藐P(guān)系是很普遍的。因此在類型加載時(shí)要對(duì)這種情況進(jìn)行處理。
因此可以結(jié)合動(dòng)態(tài)規(guī)劃與遞歸算法。首先建立一個(gè)類型表。將所有的類型(除去基本數(shù)據(jù)類型)保存于類型表中。當(dāng)對(duì)某類型進(jìn)行解析時(shí),如果發(fā)現(xiàn)屬性是一個(gè)未出現(xiàn)過的類型,則將當(dāng)前屬性的類型記錄到類型表中。
2.2 規(guī)則的內(nèi)存表示
規(guī)則在內(nèi)存中以樹型結(jié)點(diǎn)的方式表示,每一個(gè)規(guī)則均對(duì)應(yīng)一棵二叉樹。左子樹為前提,而右子樹為結(jié)論。而前提根據(jù)之前的假設(shè),有Not、And、Or與Simple四種。
其中前提C={c|c∈Complex or c=Simple},即前提由一個(gè)復(fù)雜條件或一個(gè)簡單條件構(gòu)成。
而復(fù)雜條件則由運(yùn)算符與其他條件(簡單條件或復(fù)合條件)聚合而成。
如圖1所示,業(yè)務(wù)規(guī)則Rule由兩個(gè)成員Condition與Result組成,用于表示二叉樹。而Condition則是一個(gè)抽象類,該類中有一個(gè)抽象方法,用于判斷當(dāng)前的事實(shí)環(huán)境下該條件的真假情況。由Condition派生出簡單條件、And條件、Or條件、Not條件等子條件。Not條件中包含一個(gè)抽象的Condition,在運(yùn)行時(shí),可以用一個(gè)Not、And、Or及簡單條件代替。而And、Or條件中則包含了Condition抽象類型的集合。最后的簡單條件則由條件左部、操作符、比較值三個(gè)部分組成。
2.3 業(yè)務(wù)規(guī)則的生成
在圖1中,Rule與Condition均使用了IToXML接口,因此均需實(shí)現(xiàn)ToXML的方法,該方法的出現(xiàn)將使得業(yè)務(wù)規(guī)則的生成分散到各個(gè)部分分批實(shí)現(xiàn),減少了復(fù)雜度。
例如,對(duì)于簡單條件,則需生成包含條件左部、操作符、比較值屬性的XML節(jié)點(diǎn)即可。
在圖2中,可以通過菜單加載程序集,并顯示出所有的類型。這些類型與業(yè)務(wù)數(shù)據(jù)關(guān)聯(lián)。通過雙擊相關(guān)屬性以及生成器右側(cè)的控件,可分別生成規(guī)則、復(fù)合條件及簡單條件。最終可保存生成所需的業(yè)務(wù)規(guī)則。該規(guī)則獨(dú)立于判斷邏輯,也易于維護(hù),也易于被系統(tǒng)解析。
3 結(jié)束語
在基于ORM的原則下,使用反射技術(shù)進(jìn)行類及屬性的獲取,可獲得獨(dú)立于系統(tǒng)的業(yè)務(wù)規(guī)則。該規(guī)則易于生成與維護(hù)。由于規(guī)則中的類型與系統(tǒng)中的類名一致,也能易于被系統(tǒng)解析執(zhí)行。但該系統(tǒng)還存在一些不足,如系統(tǒng)的類名習(xí)慣用英文方式表示,而用戶習(xí)慣閱讀中文,此時(shí)類型名與顯示名還需要進(jìn)行一定的轉(zhuǎn)換。對(duì)于一些屬性是集合類型是,可能需要執(zhí)行篩選操作。以上這些也是后續(xù)改進(jìn)的重點(diǎn)。
參考文獻(xiàn):
[1] 劉培奇, 李增智, 趙銀亮, 等.擴(kuò)展產(chǎn)生式規(guī)則知識(shí)表示方法[J]. 西安交通大學(xué)學(xué)報(bào), 2004,38(6): 587-590.
[2] 吳衛(wèi)平, 王麗芳, 蔣澤軍, 等. 基于ORM的數(shù)據(jù)持久層框架研究[J]. 微電子學(xué)與計(jì)算機(jī), 2008,25(7):188-190, 193.
[3] 朱有產(chǎn), 李玉凱, 李自強(qiáng), 等. 基于.NET反射技術(shù)的規(guī)約插件實(shí)現(xiàn)原理[J]. 繼電器, 2006,34(22):60-63, 83.