吳華,李湉,張世貴,李心靈,楊滔
(1.中國(guó)航發(fā)成都發(fā)動(dòng)機(jī)有限公司,成都 610503;2.西南石油大學(xué)機(jī)電工程學(xué)院, 成都 610500)
為了實(shí)現(xiàn)我國(guó)由制造大國(guó)向制造強(qiáng)國(guó)的轉(zhuǎn)變,云制造、智能制造等先進(jìn)的制造模式相繼被提出[1-3]。它們是面向產(chǎn)品全生命周期的數(shù)字化、網(wǎng)絡(luò)化、智能化制造系統(tǒng)。要實(shí)現(xiàn)這些先進(jìn)的制造模式,實(shí)現(xiàn)產(chǎn)品信息建模方法標(biāo)準(zhǔn)化是十分重要的基礎(chǔ)性研究之一[4]。
產(chǎn)品模型數(shù)據(jù)交互規(guī)范(Standard for the Exchange of Product Model Data,STEP)是國(guó)際標(biāo)準(zhǔn)化組織(ISO)制定的描述整個(gè)產(chǎn)品生命周期內(nèi)產(chǎn)品信息的標(biāo)準(zhǔn),它提供了一種獨(dú)立于任何特定系統(tǒng)、能夠描述產(chǎn)品數(shù)據(jù)的中性機(jī)制[5]。
EXPRESS語(yǔ)言是產(chǎn)品描述性語(yǔ)言,不是一種實(shí)現(xiàn)語(yǔ)言,因此需要通過(guò)語(yǔ)言映射來(lái)實(shí)現(xiàn)對(duì)產(chǎn)品信息模型的利用。已有映射研究中,周受欽[4]認(rèn)為要完成集成CAD系統(tǒng)的信息,EXPRESS與應(yīng)用開(kāi)發(fā)語(yǔ)言C++/Java之間映射關(guān)系是基礎(chǔ),并簡(jiǎn)述了映射的兩個(gè)關(guān)鍵點(diǎn),數(shù)據(jù)類(lèi)型的映射和數(shù)據(jù)關(guān)系的映射。趙繼政[6]認(rèn)為EXPRESS語(yǔ)言和Java語(yǔ)言存在描述能力和計(jì)算能力的對(duì)比差距,但EXPRESS作為一種描述性語(yǔ)言,并不具備計(jì)算能力。此外,由于未建立一般的映射方法,部分研究者存在映射不正確、不準(zhǔn)確、不完整的情況(例如:EXPRESS的REAL數(shù)據(jù)類(lèi)型不需要考慮精度的問(wèn)題; 未定義表達(dá)式及關(guān)鍵操作符如:=:、IN、LIKE等)。這使得在面向大量的EXPRESS描述的產(chǎn)品信息模型,實(shí)現(xiàn)映射的通用性、正確性難以保證。大多數(shù)CAx系統(tǒng)采用的是C/S模式,研究映射的目標(biāo)語(yǔ)言多為C++語(yǔ)言。相比EXPRESS語(yǔ)言到C++語(yǔ)言的映射研究[7-10],建立EXPRESS到Java的映射研究較少[11]。要加快STEP的產(chǎn)品信息模型的快速應(yīng)用,對(duì)于采用Java語(yǔ)言用于開(kāi)發(fā)的研究者來(lái)說(shuō),建立一種通用性強(qiáng)的EXPRESS到Java的映射方法是必要的。
EXPRESS語(yǔ)言符合傳統(tǒng)設(shè)計(jì)語(yǔ)言,又在此基礎(chǔ)上吸收了面向?qū)ο蟮募夹g(shù)特性,這使其兼具了較強(qiáng)的語(yǔ)言表達(dá)力和描述優(yōu)勢(shì)。EXPRESS語(yǔ)言對(duì)Java語(yǔ)言的映射可實(shí)施性較強(qiáng),總體的映射復(fù)雜度相對(duì)較小。
本文在總結(jié)EXPRESS和Java的特點(diǎn)的基礎(chǔ)上,將映射方法分類(lèi)為一致映射、簡(jiǎn)易映射、預(yù)定義映射、功能改進(jìn)映射、功能置換映射。依據(jù)上述具體情況說(shuō)明所對(duì)應(yīng)的映射方法,將EXPRESS語(yǔ)言的所有元素依據(jù)層級(jí)關(guān)系建立了到Java映射的總體框架,如圖1所示。
圖1 EXPRESS到Java映射總體框架
EXPRESS中的SCHEMA與Java中的包package進(jìn)行簡(jiǎn)易映射,映射方法和總體框架的關(guān)鍵內(nèi)容映射在后文做進(jìn)一步說(shuō)明。
EXPRESS語(yǔ)言的數(shù)據(jù)類(lèi)型有簡(jiǎn)單數(shù)據(jù)類(lèi)型、聚合數(shù)據(jù)類(lèi)型、命名數(shù)據(jù)類(lèi)型、構(gòu)造數(shù)據(jù)類(lèi)型、廣義數(shù)據(jù)類(lèi)型。大部分簡(jiǎn)單數(shù)據(jù)類(lèi)型和聚合數(shù)據(jù)類(lèi)型的定義于與Java語(yǔ)言常見(jiàn)數(shù)據(jù)類(lèi)型是一致的,但在相對(duì)復(fù)雜的數(shù)據(jù)類(lèi)型有較大差距,如表1所示。
表1 數(shù)據(jù)類(lèi)型的映射表
2.1.1 簡(jiǎn)單數(shù)據(jù)類(lèi)型
簡(jiǎn)單數(shù)據(jù)類(lèi)型有數(shù)字型(NUMBER)、實(shí)型(REAL)、整型(INTEGER)、字符串型(STRING)、布爾型(BOOLEAN)、邏輯型(LOGICAL)和二進(jìn)制型(BINARY)。Java中存在雙精度浮點(diǎn)數(shù)double、整數(shù)類(lèi)型int、字符串類(lèi)型String、布爾類(lèi)型boolean、enum(自定義)、二進(jìn)制數(shù)類(lèi)型byte與之映射。
2.1.2 聚合數(shù)據(jù)類(lèi)型
聚合數(shù)據(jù)類(lèi)型包括數(shù)組(ARRAY)、列表(LIST)、包(BAG)和集合(SET)。除BAG以外,在Java中存在Arrays類(lèi)、ArrayList類(lèi)、Set類(lèi)與之映射。前兩者為簡(jiǎn)易映射,只是聲明的關(guān)鍵詞不同,后者的SET聲明的關(guān)鍵詞相同,因此是一致映射。由于Java中不存在與BAG功能相近的類(lèi),需要預(yù)定義映射。BAG數(shù)據(jù)結(jié)構(gòu)的特點(diǎn)是:1)允許出現(xiàn)重復(fù)的元素;2)元素的集合是一個(gè)無(wú)序的集合;3)包內(nèi)的元素?cái)?shù)量是可變的。
2.1.3 命名數(shù)據(jù)類(lèi)型
命名數(shù)據(jù)類(lèi)型是指那些可以在形式化規(guī)范中說(shuō)明的數(shù)據(jù)類(lèi)型,是EXPRESS語(yǔ)言最基本、最重要的元素,包括實(shí)體數(shù)據(jù)類(lèi)型和定義數(shù)據(jù)類(lèi)型。
實(shí)體數(shù)據(jù)類(lèi)型需用戶(hù)賦值一個(gè)實(shí)體標(biāo)識(shí)符,通過(guò)該標(biāo)識(shí)符實(shí)現(xiàn)引用。實(shí)體映射的關(guān)鍵點(diǎn)有屬性、局部規(guī)則、子類(lèi)和超類(lèi)和抽象實(shí)體數(shù)據(jù)類(lèi)型等。
1)屬性。屬性在EXPRESS語(yǔ)言中是描述實(shí)體的本質(zhì)特征、特點(diǎn)和特性,這與Java中用成員變量描述實(shí)例的狀態(tài)是類(lèi)似的。屬性主要分為顯示屬性、導(dǎo)出屬性和反向?qū)傩?。盡管ENTITY數(shù)據(jù)類(lèi)型的屬性與Java類(lèi)的成員變量有共同之處,但在導(dǎo)出屬性和反向?qū)傩陨先匀恍枰δ苤脫Q映射,其映射到Java屬性的處理過(guò)程及示例如表2所示。
表2 屬性映射表
屬性映射過(guò)程中,需要注意的是導(dǎo)出屬性需定義導(dǎo)出函數(shù),并將該函數(shù)放置于構(gòu)造函數(shù)與相關(guān)屬性的set函數(shù)中的尾部。從而達(dá)到EXPRESS導(dǎo)出屬性的功能。
2)局部規(guī)則。局部規(guī)則分為唯一性規(guī)則和定義域規(guī)則。唯一性規(guī)則在所給實(shí)體數(shù)據(jù)類(lèi)型的所有實(shí)例之間控制屬性值的唯一性。定義域規(guī)則對(duì)給定實(shí)體數(shù)據(jù)類(lèi)型的每個(gè)實(shí)例的屬性值或這些值之間的其他約束條件進(jìn)行描述。
唯一性規(guī)則的映射為功能置換映射。主要是約束實(shí)體的所有實(shí)例的某個(gè)屬性的值不能相等,在Java中不存在約束成員變量的值唯一性的規(guī)則,因此需要功能置換映射。具體實(shí)現(xiàn)方法是先定義一個(gè)與約束規(guī)則對(duì)應(yīng)的類(lèi)變量的數(shù)組,以及監(jiān)測(cè)該數(shù)組是否有重復(fù)元素的唯一性函數(shù)。唯一性函數(shù)要求放置于構(gòu)造函數(shù)和相關(guān)屬性的set函數(shù)中的尾部。當(dāng)數(shù)組有重復(fù)的值,唯一性函數(shù)將會(huì)有提示,從而實(shí)現(xiàn)唯一性規(guī)則。
定義域規(guī)則的映射也為功能置換映射,需要定義一個(gè)私有變量作為是否滿(mǎn)足定義域規(guī)則的狀態(tài)變量,同時(shí)需要定義一個(gè)定義域函數(shù)來(lái)判斷屬性是否屬于定義域內(nèi),若不在定義域內(nèi),則提示。與唯一性規(guī)則一樣,定義域函數(shù)應(yīng)放置于構(gòu)造函數(shù)和相關(guān)屬性的set函數(shù)中的尾部。
3)其它。子類(lèi)與超類(lèi):EXPRESS的子類(lèi)與超類(lèi)與Java是一致的,是簡(jiǎn)易映射。EXPRESS 通過(guò)SUPERTYPE、和SUBTYPE的關(guān)鍵字進(jìn)行超類(lèi)和子類(lèi)的聲明,Java則采用extends關(guān)鍵字。EXPRESS的子類(lèi)和超類(lèi)聲明在ENTITY和ENDENTITY之間,而Java則在類(lèi)定義的頭部。
抽象實(shí)體數(shù)據(jù)類(lèi)型:EXPRESS允許聲明不能直接被實(shí)例化而僅可通過(guò)其子類(lèi)實(shí)例化的ENTITY數(shù)據(jù)類(lèi)型-抽象實(shí)體數(shù)據(jù)類(lèi)型。這與Java的抽象類(lèi)的功能是一致的,可以通過(guò)抽象類(lèi)的方法簡(jiǎn)易映射達(dá)到抽象實(shí)體數(shù)據(jù)類(lèi)型的功能。
定義數(shù)據(jù)類(lèi)型的映射:定義數(shù)據(jù)類(lèi)型是定義某個(gè)數(shù)據(jù)類(lèi)型的變量聲明操作,可與Java中變量和類(lèi)實(shí)例的初始化映射。
表達(dá)式由操作符、操作數(shù)及函數(shù)調(diào)用組合而成,并且要對(duì)它們進(jìn)行運(yùn)算以產(chǎn)生一個(gè)結(jié)果值。EXPRESS語(yǔ)言對(duì)操作符進(jìn)行了定義并規(guī)定了與每一種操作符一起使用的操作數(shù)的數(shù)據(jù)類(lèi)型,實(shí)現(xiàn)操作符的優(yōu)先級(jí)映射和操作符的映射亦是模式映射的主要內(nèi)容之一。
EXPRESS語(yǔ)言的操作運(yùn)算符分為組件引用、一元操作符、取冪運(yùn)算、乘法/除法運(yùn)算、加法/減法運(yùn)算、關(guān)系運(yùn)算,共6個(gè)優(yōu)先級(jí)。Java語(yǔ)言的操作符分為后綴、一元、乘性、加性、移位、關(guān)系、相等、按位與、按位異或、按位或、邏輯與、邏輯或、條件、賦值、逗號(hào),共15個(gè)優(yōu)先級(jí)。映射過(guò)程中,有以下3個(gè)注意點(diǎn):
1)在Java中取冪、實(shí)例比較、成員操作、相似操作符在Java中沒(méi)有直接操作符與之對(duì)應(yīng),因此需要一定的處理以完成映射。對(duì)于取冪運(yùn)算,采用Math.pow進(jìn)行替代,對(duì)于實(shí)例比較、相似操作、賦值操作符的功能則需自定義映射,在Java中設(shè)計(jì)全局靜態(tài)函數(shù)實(shí)現(xiàn)其功能。
2)在映射過(guò)程中,部分操作符的優(yōu)先級(jí)順序發(fā)生改變。例如或運(yùn)算符及異或運(yùn)算符的優(yōu)先級(jí)低于了等號(hào)運(yùn)算符和不等號(hào)運(yùn)算符。又如取冪函數(shù)Math.pow的優(yōu)先級(jí)上升到最高的0優(yōu)先級(jí)。對(duì)于運(yùn)算優(yōu)先級(jí)上的改變,本文的解決方案是對(duì)于映射過(guò)程中只要存在運(yùn)算符是帶有下劃線(xiàn)的操作符,一律加花括號(hào)( ),以保證運(yùn)算先后順序的正確性。
3)當(dāng)操作符是同一優(yōu)先級(jí)別時(shí),就需要考慮操作符的結(jié)合性,EXPRESS語(yǔ)言一律采用從左至右,部分操作符與Java操作符不同,這也影響這運(yùn)算的順序。為了保證映射正確性,同樣采用花括號(hào)( )避免映射結(jié)合性的秩序問(wèn)題。
此外,EXPRESS語(yǔ)言操作符中還存在實(shí)例比較、成員操作、相似操作三種操作符,需要在Java中預(yù)定義映射。實(shí)例比較操作符的映射:數(shù)字型、邏輯型、字符串型、二進(jìn)制型及枚舉數(shù)據(jù)類(lèi)型的實(shí)例比較,等價(jià)于對(duì)應(yīng)的值比較操作符。因此Java映射對(duì)于上述類(lèi)型采用值比較操作符進(jìn)行返還結(jié)果值。EXPRESS的聚合實(shí)例和實(shí)體實(shí)例的比較操作符,需定義對(duì)應(yīng)功能的全局靜態(tài)函數(shù)實(shí)現(xiàn)自定義映射。
成員操作符的映射:成員操作符的功能主要是判斷某個(gè)元素是否存在于某個(gè)聚合數(shù)據(jù)類(lèi)型中,為真則返還TRUE,否則返還FALSE。實(shí)現(xiàn)方法同實(shí)例比較操作符。相似比較符的映射:相似比較符用于兩字符串的匹配。如果對(duì)應(yīng)的任何字符不存在,則匹配失敗,結(jié)果為FALSE,匹配成功返還TRUE。在Java存在Pattern類(lèi)可以實(shí)現(xiàn)這個(gè)匹配功能。
現(xiàn)有一個(gè)EXPRESS模式,SCHEMA s。有4個(gè)實(shí)體數(shù)據(jù)類(lèi)型:person、teacher、student、graduate。person實(shí)體含有屬性身份證ss_no(整型)、出生日期date(日期型)、編號(hào)id(String字符串型)。teacher實(shí)體繼承了person,將person中的id重寫(xiě)為INTEGER整型,同時(shí)有定義域約束年齡小于21。student實(shí)體繼承person,定義域約束年齡大于5,選的課程需為定義的course枚舉數(shù)據(jù)類(lèi)型的范圍中。graduate實(shí)體繼承student和teacher,定義域約束GRAD LEVEL IN teachers。定義course枚舉數(shù)據(jù)類(lèi)型。利用上述映射方法,從EXPRESS模式到Java模式的映射結(jié)果如圖2所示。
圖 2 EXPRESS模式到Java模式的映射
本文將映射方法總結(jié)并歸類(lèi)為一致映射、簡(jiǎn)易映射、預(yù)定義映射、功能改進(jìn)映射和功能置換映射,構(gòu)建了從EXPRESS語(yǔ)言到Java語(yǔ)言的總體框架。詳細(xì)論述了EXPRESS的數(shù)據(jù)類(lèi)型、表達(dá)式等元素到Java的映射具體實(shí)現(xiàn)方法。依據(jù)該一般化映射方法實(shí)現(xiàn)了對(duì)SCHEMA s的EXPRESS模式到Java模式的映射。文中建立的一般化映射方法,適用于STEP標(biāo)準(zhǔn)中EXPRESS語(yǔ)言描述的信息模型的Java映射。大量現(xiàn)有的信息模型標(biāo)準(zhǔn)知識(shí),為基于Java語(yǔ)言開(kāi)發(fā)的CAD、CAPP、STEP-NC等系統(tǒng)提供了可借鑒的標(biāo)準(zhǔn)。