專利名稱:傳統(tǒng)數(shù)據(jù)結(jié)構(gòu)的對象特性元模型仿真器的制作方法
相關(guān)申請的交叉參考本申請要求1998年7月24日申請的美國臨時申請60/094,107的利益。
但是,許多比較老的軟件程序是用非面向?qū)ο笳Z言編寫的??梢园堰@些程序稱為“傳統(tǒng)(legacy)”程序,并且可以用諸如Fortran,Basic,和C語言之類的語言編寫。許多這些傳統(tǒng)程序包括需要以新的面向?qū)ο蟮恼Z言方式使用的數(shù)據(jù)結(jié)構(gòu)和代碼結(jié)構(gòu)。重建這些數(shù)據(jù)結(jié)構(gòu)以便使它們能夠與面向?qū)ο笳Z言兼容要用大量的時間和花費高昂的代價。因此,希望有一種方式把這些傳統(tǒng)數(shù)據(jù)結(jié)構(gòu)與新的面向?qū)ο蟮拇a連接在一起。
根據(jù)上述原因,需要有一種連接傳統(tǒng)軟件應(yīng)用程序和面向?qū)ο蟮能浖?yīng)用程序的方法和系統(tǒng)。
發(fā)明綜述本發(fā)明的一個實施例是一種包裝傳統(tǒng)數(shù)據(jù)結(jié)構(gòu)從而使面向?qū)ο蟪绦蚰軌蚍路鹚鼈兪翘匦砸粯拥夭僮魉鼈兊淖侄蔚姆椒?。在一個實施例中,為每個要操作的偽特性定義一個接口類。圍繞實現(xiàn)抽象偽特性類中定義的接口的每個傳統(tǒng)數(shù)據(jù)結(jié)構(gòu)建立一個C++包裝。
詳細(xì)說明本發(fā)明的一個實施例是一種包裝傳統(tǒng)數(shù)據(jù)結(jié)構(gòu)從而使該數(shù)據(jù)結(jié)構(gòu)能夠以面向?qū)ο蟪绦蚍绞绞褂貌⑶乙粋€單一的特性頁能夠操作包含在所有可用數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)的方法。在一個實施例中,為每個要操作的偽特性定義一個接口類。圍繞每個實現(xiàn)在抽象偽特性類中定義的接口的傳統(tǒng)數(shù)據(jù)結(jié)構(gòu)建立一個C++包裝。
圖1是說明從一個具有數(shù)據(jù)結(jié)構(gòu)的“傳統(tǒng)”應(yīng)用程序輸出的示例的示意圖。為了說明本專利申請,傳統(tǒng)應(yīng)用程序是一個用諸如Fortran,Basic或C語言之類的非面向?qū)ο蟮能浖幊陶Z言編寫的應(yīng)用程序。
圖1的傳統(tǒng)程序是一個包括一個圖形接口10的事務(wù)處理應(yīng)用程序。傳統(tǒng)程序示出了事務(wù)處理過程并且存儲事務(wù)處理過程的每個方面的數(shù)據(jù)和數(shù)據(jù)結(jié)構(gòu)。
在圖1所示的示例中,示出了一個“清洗狗”的處理過程。接口10包括不同的構(gòu)件。例如,接口10包括方框12-14,每個方框代表一種活動。方框12代表洗滌狗的活動,方框13代表漂洗狗的活動,方框14代表干燥狗的活動。
接口10進(jìn)一步包括箭頭20至23。每個箭頭代表活動之間的關(guān)系,包括輸入和輸出信息。箭頭20表示把一個臟狗輸入到活動12中,箭頭21表示將一個擦了肥皂的狗從活動12輸出并且輸入到活動13。此外,箭頭22表示將一個濕狗從活動13輸出并且輸入到活動14,箭頭23表示從活動14輸出了一個干凈的狗。
接口10也包括一個表示在活動12和13中使用了一個浴盆的屬性30。接口10還可以包括一個實體構(gòu)件,和許多圖1中未示出的其它類型的構(gòu)件。
用戶可以選擇和編輯接口10的每個可見構(gòu)件。例如,用戶可以點擊活動13,或箭頭20。如果與接口10結(jié)合的程序是用C++之類的面向?qū)ο蟮恼Z言編寫的,那么就可以把每個構(gòu)件看成是一個“類”。但是,在C之類的非面向?qū)ο笳Z言中,它們被認(rèn)為是數(shù)據(jù)結(jié)構(gòu)。當(dāng)選擇一個要進(jìn)行編輯的構(gòu)件時,出現(xiàn)每個構(gòu)件的獨立的對話。
接口10的每個構(gòu)件具有一個或更多的與之相關(guān)的屬性或特性。屬性包含在數(shù)據(jù)結(jié)構(gòu)中。屬性的例子包括用戶可以附加到每個構(gòu)件上的附注,構(gòu)件名稱,構(gòu)件定義,構(gòu)件的活動持續(xù)時間,等等。
一個屬性或特性一般可以是與接口10的一個構(gòu)件相關(guān)的任何值,或與接口10相關(guān)的字典中的一項,或一個列表中的一項,或任何數(shù)據(jù)結(jié)構(gòu)中的一個字段。關(guān)于面向?qū)ο筌浖?,具體化與一個對象相關(guān)的屬性和特性的概念是眾所周知的,并且被稱為“對象特性元模型”。
接口10和與之相關(guān)的傳統(tǒng)程序存在的一個問題是,在傳統(tǒng)編碼中每個構(gòu)件(例如,箭頭,活動,等等)是以實質(zhì)上不同的方式表示的。例如,如上所述,每個構(gòu)件可以具有一個附注屬性。用程序建模的用戶可以注釋一個活動、一個箭頭、一個數(shù)據(jù)存儲、等等,以建立一個以后參考的附注。但是,傳統(tǒng)編碼包含每個構(gòu)件的一個獨立的對話例程。因此,傳統(tǒng)編碼需要編寫一個把數(shù)據(jù)放在箭頭上的第一對話,把數(shù)據(jù)放在活動上的第二對話,把數(shù)據(jù)放在數(shù)據(jù)存儲上的第三對話,等等。編碼獨立的對話以編輯每個構(gòu)件是要花費許多時間和高昂代價的。
本發(fā)明的一個實施例允許用戶開發(fā)一個把一個附注放在任何一個構(gòu)件上,然后從其扇出到活動、數(shù)據(jù)存儲、實體、屬性、等等的單一特性頁。例如,一個特性頁可以允許用戶建立有關(guān)任意一個構(gòu)件的附注和定義特性。這使得用戶能夠重復(fù)使用一個公共特性頁設(shè)置任何一個支持它們的構(gòu)件的特性。在一個實施例中,使用了C++中的繼承和動態(tài)類型轉(zhuǎn)換來完成這一工作。
圖2是一個與圖1中所示的用C語言編寫的程序這樣的傳統(tǒng)程序連接的本發(fā)明的構(gòu)造圖。傳統(tǒng)程序40包含多個以無規(guī)則方式散開的數(shù)據(jù)結(jié)構(gòu)41-45。每個數(shù)據(jù)結(jié)構(gòu)具有諸如名稱、說明之類的共同特性。但是,利用C語言這樣的傳統(tǒng)編程語言無法將數(shù)據(jù)結(jié)構(gòu)之間的共同特性鏈接到一起。本發(fā)明能夠使這些共同特性連接到一起。
將一個包裝模塊50連接到傳統(tǒng)程序40。包裝模塊50是一個用諸如C++之類的面向?qū)ο笳Z言編寫的包裝對象。與包裝對象連接的是每個特性的對象51-53,例如,名稱對象51,說明對象52,和價格對象53。包裝模塊50和特性頁60合作使用運行時類型標(biāo)識符命令向傳統(tǒng)程序40的數(shù)據(jù)結(jié)構(gòu)發(fā)布命令。
將一個特性頁或頁60連接于包裝對象50。特性頁是用C++之類的面向?qū)ο笳Z言編寫的。
接口模塊70包括本發(fā)明的其余功能。接口模塊70包括一個執(zhí)行在程序40的接口10中選中一個構(gòu)件時進(jìn)行的步驟的命中處理程序。
一般,本發(fā)明結(jié)合一個用于操作一個值的固定集的單一特性頁,并且無論這些值發(fā)生在何處,都使用這個單一特性頁來操作它們。因此,例如,將操作定義文本和輔助文本的特性頁用于任何具有這種特性的對象。
實際上,本發(fā)明模擬一個對象/特性元模型。這種技術(shù)將特性值與包含它們的對象隔離。不是包含一個名稱值,而是把一個具有一個“名稱”特性的對象與“名稱”特性類的一個實例結(jié)合。當(dāng)系統(tǒng)需要一個對象的名稱時,它向?qū)ο笳埱笏摹懊Q”特性的值。對象掃描它的特性列表,以查找“名稱”特性的一個實例,并且如果找到一個實例,那么它返回它的值。否則,它返回一個失敗指示。這種過程通用于任何基本類型的任何特性。
本發(fā)明定義了一個基本包裝類。新的特性頁經(jīng)過來源于基本包裝的類與傳統(tǒng)數(shù)據(jù)結(jié)構(gòu)相互作用。這使得特性頁的實現(xiàn)能夠與傳統(tǒng)數(shù)據(jù)結(jié)構(gòu)的細(xì)節(jié)分離,并且提供了偽特性的操作的公共接口。
本發(fā)明進(jìn)一步為系統(tǒng)中每個特性定義了一個策略類(一個基本特性類)。這些類定義了操作特性的值的方法,但是并不實現(xiàn)這些方法。對于像“附注”這樣的簡單特性,基本特性類規(guī)定了取得和設(shè)置特性的值的方法。一些特性值需要確認(rèn);這種特性的策略類定義必須公布確認(rèn)方法。對于列表特性,基本特性類定義了提供接入遍歷和操作特性值的迭代程序的方法。這些迭代程序本身被指定為最大靈活性的策略類。
當(dāng)一個程序員要利用本發(fā)明操作與圖1的接口10的一個構(gòu)件結(jié)合的特性時,程序員要如下操作1.確定操作會影響哪些傳統(tǒng)數(shù)據(jù)結(jié)構(gòu)。在一些場合,屏幕上的構(gòu)件是用多種數(shù)據(jù)結(jié)構(gòu)表示的。
2.確定使哪些特性與要操作的圖形構(gòu)件結(jié)合和匯編或創(chuàng)建必要的偽特性策略接口類。
3.定義一個構(gòu)件包裝類。這個類是從基本包裝類(以便能夠接入特性頁框架)和與需要操作的每個特性結(jié)合的策略類繼承的。
4.實現(xiàn)在上一個步驟中定義的構(gòu)件包裝類。實現(xiàn)的細(xì)節(jié)取決于潛在傳統(tǒng)數(shù)據(jù)結(jié)構(gòu)的性質(zhì)。
5.匯編(或?qū)崿F(xiàn),如果需要的話)操作希望的特性的特性頁。
特性頁如下操作包裝的傳統(tǒng)數(shù)據(jù)結(jié)構(gòu)·提取和顯示特性值;·確認(rèn)用戶編輯(即,新的或改變的特性值);和·把新特性值列入到包裝的傳統(tǒng)數(shù)據(jù)結(jié)構(gòu)。
為了達(dá)到這一目的,程序員利用本發(fā)明的一個實施例實現(xiàn)特性頁中的以下方法。
方法 目的LoadFrom()從包裝的傳統(tǒng)數(shù)據(jù)結(jié)構(gòu)提取數(shù)據(jù)并將它們顯示在屏幕上。Validate()確認(rèn)所有用戶編輯(即,新輸入的或改變的特性值)。SaveTo() 將所有用戶改變列回到包裝的傳統(tǒng)數(shù)據(jù)結(jié)構(gòu)。
每個方法接收一個指向一個基本包裝對象的指針,并且必須經(jīng)過這個指針提取操作的特性值。它們利用一種動態(tài)類型轉(zhuǎn)換技術(shù)將基本包裝指針轉(zhuǎn)換成一個指向希望特性的策略類的指針來達(dá)到這一目的。如果類型轉(zhuǎn)換成功(即,返回一個非零結(jié)果),那么特性頁確保接入它的希望的特性。如果類型轉(zhuǎn)換失敗,那么特性頁采取適當(dāng)?shù)膭幼鳌?br>
本發(fā)明使用了這種C++動態(tài)類型轉(zhuǎn)換語句,以查詢包裝是否存在一個偽特性。這是在傳統(tǒng)“C”數(shù)據(jù)結(jié)構(gòu)的操作過程中模擬對象/特性元模型(其中特性值與它們的擁有對象分離存儲)的新方式。這種技術(shù)可以用支持運行時類型標(biāo)識符的任何面向?qū)ο笳Z言(例如,SMALLTALK,Java,EIFFEL,等等)實現(xiàn)。
以下的流程說明包裝模塊50,特性頁60和接口模塊70的組合功能。
圖3是根據(jù)本發(fā)明的一個實施例的,在用戶選擇圖1的接口10顯示的一個構(gòu)件時執(zhí)行的步驟的流程圖。
在步驟100,確定選擇的構(gòu)件的類型(例如,箭頭,行為,等等)。如果可以通過接口10顯示多種類型的圖,那么也在步驟100確定選擇的圖的類型。在一個實施例中,接口10可以顯示三種圖類型中的一種。
在步驟110,將在步驟100中確定的信息轉(zhuǎn)到一個方法論登記對象。登記對象是一個知道如何處理不同構(gòu)件和圖類型的代碼集。這個類正確地具有系統(tǒng)中的一個實例。
在步驟120,方法論登記對象查找基于適當(dāng)方法論用戶接口(“UI”)的處理程序?qū)ο?,以處理事件。每個圖類型具有一個獨特的處理程序?qū)ο蟆?br>
在步驟130,確定適當(dāng)?shù)拿谐绦虺绦虻奈恢谩D中用戶可以選擇的每種類型的構(gòu)件或?qū)ο缶哂幸粋€命中程序程序。構(gòu)件的例子包括與一個行為結(jié)合的方框,垂直或水平線段,等等。
在步驟140,將事件數(shù)據(jù)傳送到步驟130定位的命中處理程序。將構(gòu)件類型從事件數(shù)據(jù)中剝除,因為命中處理程序已經(jīng)知道構(gòu)件類型。命中處理程序是專用于用戶選擇的構(gòu)件的。
在步驟150,命中處理程序整編命中將影響的傳統(tǒng)程序40的數(shù)據(jù)結(jié)構(gòu)。這隨處理的構(gòu)件類型而改變。
在步驟160,命中處理程序建立一個圍繞整編的數(shù)據(jù)結(jié)構(gòu)的包裝。每個可能命中或由用戶選擇的對象和每個圖類型具有一個專用的包裝。因此,例如,一個處理圖中的方框具有與數(shù)據(jù)流圖中的方框不同的包裝結(jié)構(gòu)。
在步驟170,命中處理程序創(chuàng)建應(yīng)用于活動構(gòu)件的特性頁。這些頁可以包括名稱、狀態(tài)、定義等的頁。特性頁一般顯示為一個全部特性表的圖形“標(biāo)簽(tab)”。
在步驟180,命中處理程序創(chuàng)建一個包含特性頁的特性表。特性表構(gòu)造將表結(jié)合到包裝結(jié)構(gòu)。
在步驟190,命中處理程序?qū)⑻匦皂摻Y(jié)合到特性表。結(jié)合的順序確定顯示的標(biāo)簽順序。
在步驟200,命中處理程序通過調(diào)用“顯示和執(zhí)行更新”方法,命令特性表執(zhí)行更新。這個步驟在特性頁與接口10之間發(fā)生相互作用處進(jìn)行。
最后,在步驟210,命中處理程序執(zhí)行任何需要的后處理。命中處理程序也放棄所有特性頁和特性表以及用于處理選擇的構(gòu)件的包裝結(jié)構(gòu)。
以下的流程提供了特性頁如何執(zhí)行有關(guān)包裝模塊50的功能的細(xì)節(jié)。每個特性頁邏輯被從標(biāo)準(zhǔn)窗口事件中分離出來。處理的主要事件是1)OnInit Dialog——建立特性頁顯示;2)OnApply——確認(rèn)和存儲數(shù)據(jù);和3)OnCancel——取消編輯。
其它事件管理幫助顯示和顯示狀態(tài)(外貌)。
特性頁開始是未初始化的。當(dāng)用戶顯示特性頁時,它們被初始化??蚣芎雎晕闯跏蓟捻?。
圖4是為OnInitData事件執(zhí)行的步驟的流程圖。在步驟300,一個特性頁接收到一個OnInitData事件。當(dāng)在圖1的接口10選擇了一個構(gòu)件,或選擇了一個特性表標(biāo)簽時,執(zhí)行步驟300。OnInitData事件告訴特性頁,它要被第一次顯示,和它應(yīng)當(dāng)執(zhí)行一個建立。
在步驟310,特性頁框架執(zhí)行初始化,并且調(diào)用一個專用的LoadFrom方法。這個方法對于每個特性頁都是不同的。
在步驟320,為了顯示每個特性值,執(zhí)行運行時類型標(biāo)識。在一個實施例中,這是在C++中通過將包裝指針類型轉(zhuǎn)換成希望的特性類型實現(xiàn)的。將包裝指針變成LoadFrom調(diào)用。類型轉(zhuǎn)換經(jīng)過一種動態(tài)類型轉(zhuǎn)換操作,并且如果希望的偽特性不屬于包裝則失敗。屬于要經(jīng)過多重繼承。
在步驟330,確定類型轉(zhuǎn)換是否成功。如果類型轉(zhuǎn)換成功,那么在步驟340,提取特性值(即,名稱、附注、定義等等),并且將特性值列入到特性頁顯示。
如果在步驟330失敗,那么在步驟350如果需要進(jìn)行改正行動,則進(jìn)行改正行動。
圖5是在接收到Apply消息和存儲數(shù)據(jù)時執(zhí)行的步驟的流程圖。Apply消息指示系統(tǒng)應(yīng)當(dāng)取得任何改變的值,并把它應(yīng)用到潛在的系統(tǒng)(即,存儲數(shù)據(jù))。
在步驟400,由于用戶按下了特性表上的OK或Apply,接收到一個Apply消息。
在步驟410,接收特性頁將事件傳遞到包含特性表,以進(jìn)行處理。
在步驟420,對于特性表中的每個特性頁,確定頁是否是活動的。如果是,那么在步驟430要求頁確認(rèn)它的所有編輯。
在步驟450,確定是否發(fā)生錯誤。如果發(fā)生了錯誤,那么在步驟460將具有錯誤的頁停留在帶有標(biāo)簽的對話前。
如果在步驟450沒有發(fā)生錯誤,那么為其中發(fā)生了編輯的系統(tǒng)中的每個初始化的顯示,存儲用戶改變了的特性。
圖6是在根據(jù)本發(fā)明的一個實施例確認(rèn)數(shù)據(jù)時執(zhí)行的步驟的流程圖。最初,將指向基本包裝的指針轉(zhuǎn)到調(diào)用。
在步驟500,為每個與需要確認(rèn)的特性頁結(jié)合的特性,使用動態(tài)類型轉(zhuǎn)換提取指向特性的指針。
在步驟510,確定類型轉(zhuǎn)換是否成功。如果不成功,那么在步驟520執(zhí)行錯誤處理,否則,在步驟530調(diào)用特性頁的確認(rèn)方法。最后,在步驟540返回操作狀態(tài)。
圖7是在存儲特性頁時執(zhí)行的步驟的流程圖。在步驟710,為頁操作的每個特性(例如,名稱、定義,等等),經(jīng)過運行時類型標(biāo)識(即,動態(tài)類型轉(zhuǎn)換)提取一個指針。
在步驟730,確定類型轉(zhuǎn)換是否成功。如果不成功,那么在步驟740執(zhí)行錯誤處理。否則,在步驟750通過調(diào)用特性類中的適當(dāng)方法存儲新的特性值。
如上所述,本發(fā)明提供了一種能夠以面向?qū)ο蟪绦蚍绞绞褂脗鹘y(tǒng)數(shù)據(jù)結(jié)構(gòu)的方法。因此,例如,一個單一的特性頁可以存取全部傳統(tǒng)數(shù)據(jù)結(jié)構(gòu)中的有關(guān)屬性。這使得舊的傳統(tǒng)編碼能夠具有某些面向?qū)ο缶幋a的優(yōu)點。
在這里顯示和/或說明了本發(fā)明的幾個特定實施例。但是,應(yīng)當(dāng)知道上述說明和附屬權(quán)利要求的范圍內(nèi)包括本發(fā)明的修改和變化,而不脫離本發(fā)明的精神和范圍。
權(quán)利要求
1.一種操作傳統(tǒng)數(shù)據(jù)結(jié)構(gòu)的屬性的方法,所述方法包括(a)接收一個指向一個結(jié)合于傳統(tǒng)數(shù)據(jù)結(jié)構(gòu)的包裝對象的指針;(b)定義一個構(gòu)件包裝類;(c)查詢包裝類是否存在一個偽特性;和(d)創(chuàng)建一個可以接入偽特性的對象。
2.根據(jù)權(quán)利要求1所述的方法,其中步驟(c)包括執(zhí)行運行時類型標(biāo)識。
3.根據(jù)權(quán)利要求1所述的方法,其中步驟(c)包括執(zhí)行一個動態(tài)類型轉(zhuǎn)換。
4.根據(jù)權(quán)利要求1所述的方法,其中數(shù)據(jù)結(jié)構(gòu)是用C語言編寫的。
5.根據(jù)權(quán)利要求1所述的方法,其中所述對象是用C++語言編寫的。
6.根據(jù)權(quán)利要求1所述的方法,其中所述對象是用Java語言編寫的。
7.根據(jù)權(quán)利要求1所述的方法,其中所述對象是一個特性頁。
8.一種操作傳統(tǒng)數(shù)據(jù)結(jié)構(gòu)的屬性的方法,所述方法包括(a)定義一個基本包裝類;(b)為被操作的每個屬性類型定義偽特性策略類;(c)為要操作的傳統(tǒng)數(shù)據(jù)結(jié)構(gòu)的每個獨特集定義一個或更多的包裝類;(d)以基本包裝類為基礎(chǔ)建立每個包裝類;(e)以偽特性策略類為基礎(chǔ)建立每個包裝類;(f)重復(fù)使用偽特性策略類以代表獨特數(shù)據(jù)結(jié)構(gòu)中的相關(guān)屬性;(g)創(chuàng)建一個操作基本包裝類的對象;(h)查詢包裝類是否存在偽特性;和(i)經(jīng)過實現(xiàn)在一個包裝對象中的偽特性操作數(shù)據(jù)結(jié)構(gòu)中的屬性。
全文摘要
一種包裝(50)傳統(tǒng)數(shù)據(jù)結(jié)構(gòu)以使能夠以面向?qū)ο蟪绦蚍绞绞褂脭?shù)據(jù)結(jié)構(gòu),和使一個單一對象能夠接入多個傳統(tǒng)數(shù)據(jù)結(jié)構(gòu)(40)中的有關(guān)屬性的方法。在一個實施例中,為每個要代表的偽特性定義一個接口類(70)。圍繞每個傳統(tǒng)數(shù)據(jù)結(jié)構(gòu)建立一個實現(xiàn)在抽象偽特性類中定義的接口的C++包裝(50)。
文檔編號G06F9/44GK1371499SQ00812267
公開日2002年9月25日 申請日期2000年7月21日 優(yōu)先權(quán)日1999年7月23日
發(fā)明者埃里克·明茨 申請人:聯(lián)合想象計算機(jī)公司