專利名稱:分層結(jié)構(gòu)的控制信息編輯器的制作方法
技術(shù)領(lǐng)域:
本發(fā)明針對的是一種系統(tǒng)和方法,其在使用了圖形用戶界面的目標(biāo)語言中,用來對源代碼的模板進(jìn)行編輯。說得再具體一點(diǎn),本發(fā)明針對的是一種系統(tǒng)和方法,程序員可在其中借助應(yīng)用域來對帶有上下文元數(shù)據(jù)的目標(biāo)代碼做參數(shù)化。程序員確定代碼的反復(fù)和嵌套結(jié)構(gòu),該結(jié)構(gòu)清晰直觀,容易維護(hù)且完全一致。
背景技術(shù):
按通常的說法,面向?qū)ο蟮募夹g(shù)較傳統(tǒng)技術(shù)更為貼近現(xiàn)實(shí)世界,且?guī)缀踅钥拷9ぞ邅碜龀?。在搭建一個(gè)復(fù)雜系統(tǒng)時(shí),軟件程序員和客戶之間容易建立起共同的標(biāo)準(zhǔn),這有助于他們高效地提煉系統(tǒng)需求。面向?qū)ο蟮募夹g(shù)還有助于他們搭建一個(gè)容易擴(kuò)展的系統(tǒng),尤其是當(dāng)使用框架的時(shí)候。
程序員和分析員們用建模工具來邏輯地描繪應(yīng)用程序的商業(yè)用途,這種邏輯描繪是對具體編程語言、應(yīng)用程序藉以運(yùn)行的操作系統(tǒng)和硬件的“具體實(shí)現(xiàn)”的抽像化。
面向?qū)ο蟮木幊讨杂l(fā)流行,原因之一是軟件的反復(fù)使用變得愈發(fā)重要了。開發(fā)新系統(tǒng)的成本不匪,而維護(hù)他們的成本則更高。新近,由全國標(biāo)準(zhǔn)局的Wilma Osborne,所進(jìn)行的一項(xiàng)調(diào)查顯示,用于系統(tǒng)維護(hù)的開支占到了軟件總成本的60%到85%(Ware Meyers.采訪Wilma Osborne.,IEEE軟件5(3)104-105,1988年)。
傳統(tǒng)上,程序員要靠“裁剪粘貼”來實(shí)現(xiàn)反復(fù)或近似反復(fù)的方法。有種模板是一塊目標(biāo)源代碼,在有改動(dòng)的地方做了注解,保存在公共位置并由程序員靠人工干預(yù)來反復(fù)使用。創(chuàng)建該目標(biāo)源代碼塊的程序員或別的程序員把適當(dāng)?shù)拇a行拷貝和粘貼到自己編寫的代碼中,并按特定用途做出適當(dāng)?shù)母膭?dòng),從而反復(fù)使用這些代碼行。這種方法難免要出錯(cuò),還很費(fèi)時(shí),因?yàn)槌绦騿T不僅要(有時(shí)是反復(fù)地)拷貝所需的代碼行,還得把所有適當(dāng)?shù)慕M件名替換成他們相應(yīng)的等效值。這正是所謂用帶有注解的源代碼模板來編程。
有些軟件生成工具為程序員提供了文本生成模板,其包括參數(shù)化源代碼行,用來新建運(yùn)算或組件。這些文本生成模板不僅允許程序員使用被上下文變量所參數(shù)化的目標(biāo)源代碼來定義完整的運(yùn)算法則,還允許程序員使用過濾變量,從而指定所選的他們藉以生成代碼的組件。代碼生成器把組件和屬性過濾變量作為選擇標(biāo)準(zhǔn),用于過濾來自建模工具的信息,并移植于建模工具的動(dòng)態(tài)生成文本中。上下文變量表示被代碼生成器替換成實(shí)際特征值的組件或?qū)傩蕴卣髅?。這些實(shí)際特征值與當(dāng)前組件或動(dòng)態(tài)文本中的屬性關(guān)聯(lián)。
上述代碼生成器被用來傳遞生成時(shí)刻的控制和定制,以此來整合框架和組件,這些組件是用如今的建模工具和編程語言來開發(fā)的。文本生成模板是以程序員的指令來創(chuàng)建的,程序員的指令使用刻板的語法而寫成,并被源代碼生成器用來替換所給的參數(shù)化源代碼中的任何上下文變量。例如,某行代碼可以是“Persistence Schema=newPersistence Schema(″%001″);with(&class name)”,其中的“%001”是參數(shù)符,表示生成器要在此填入上下文變量的值,例如上下文變量“<class name>”的值。程序員只能使用這些參數(shù)符方可創(chuàng)建文本生成模板,程序員在命名組件時(shí),為求保持一致,必須在腦海中建立一個(gè)參數(shù)符列表,尤其是當(dāng)從%001到%999需要分別與上下文變量關(guān)聯(lián)的參數(shù)符超過一個(gè)時(shí)。一個(gè)參數(shù)符可以不止一次地出現(xiàn)在參數(shù)化源代碼中,因?yàn)樗偱c相同的上下文變量關(guān)聯(lián)。這些參數(shù)符不像在非參數(shù)化形式中那樣,他們不允許程序員鍵入代碼,從這個(gè)意義上說,他們不是方便用戶的。再有,必須在代碼行內(nèi)定義參數(shù)符,以確保生成器能正確翻譯。在上述例子中,只有加上“with(&class name)”指令方可命令生成器參數(shù)符要被替換成上下文變量的當(dāng)前值,該上下文變量與生成器的動(dòng)態(tài)上下文中的當(dāng)前類關(guān)聯(lián)。而且,當(dāng)代碼的某部份被不止一次地替換成對過濾變量所提供的選擇標(biāo)準(zhǔn)進(jìn)行尋址的組件的屬性時(shí),只有包括類型指令“repeatForEach &attribute private instanceusing(&attribute name;&attribute attributeClassName;”方可確保近似反復(fù)的運(yùn)算。在此情形中,代碼生成器會把模板變換成源代碼,這種變換使用了系統(tǒng)和過濾變量的模型說明,定義該過濾變量意在指定某一組件須用何模板。
程序員也可不用這種有賴關(guān)鍵字(例如,%001)和關(guān)鍵字定義(例如,repeatForEach...using...or with...)的語法,而是考慮把所給編程語言的算法所執(zhí)行的指令與參數(shù)化代碼鏈接起來,像在授予Lindsey的美國專利號No.5,675,801里所教導(dǎo)的那樣,該軟件會用別的運(yùn)算結(jié)果來求解參數(shù)形式的表達(dá)式。說得再具體一點(diǎn),例如,以C語言所寫的說明源代碼模板,用于面向數(shù)據(jù)的對象,也即NumericData-ItemObject,還用來表示名為“IDNumber”的C變量,在該例中使用了類型指令“int<self VarName>;”,其中的“int”和“;”是該源代碼模板的一段源代碼,而生成器的指示則是“<selfVarName>”。該例中的“<”和“>”是任意的界定符,標(biāo)明生成器的起始。在此情形中,對象識別符是記號“self”,表示它是被請求自我生成的對象,即其變量名“IDNumber”;消息識別符是記號“VarName”,即被發(fā)送到對象“self”的消息。該消息命令“self”對象當(dāng)被用于變量說明時(shí),返回代表它自己的字串。在Lindsey的這一示范中,名為“IDNumber”的NumericDataltemObject會返回字串“IDNumber”。由此得出的目標(biāo)語言源代碼段是“int IDNumber”,它是C語言的源代碼段。
顏色和畫面已被用于源代碼編輯器中,以增進(jìn)對算法流程的了解,但卻從未用來說明所提供的信息的結(jié)構(gòu),比如反復(fù)和/或嵌套的上下文塊。例如,在if-then-else語句中使用不同顏色表示其條件表達(dá)式、基于條件表達(dá)式的結(jié)果而執(zhí)行的真表達(dá)式和假表達(dá)式。畫面從未被用來闡釋這一事實(shí)即,同一if-then-else表達(dá)式對于各符合選擇標(biāo)準(zhǔn)集的屬性在所給的組件算法內(nèi)反復(fù)使用。
發(fā)明梗概于是,本發(fā)明旨在提供一種編輯器,使程序員能創(chuàng)建清晰直觀而高效的模板。
本發(fā)明還旨在提供一種編輯器,其中反復(fù)和嵌套的代碼清晰可辨。
本發(fā)明還旨在提供一種用于創(chuàng)建源代碼模板的編輯器,它以最少的程序員人工干預(yù)來獲得想要的模板。
本發(fā)明又旨在提供一種模板編輯器,以滿足編輯模板源代碼之需。該模板編輯器適用于各種環(huán)境,比如基于萬維網(wǎng)的服務(wù)器,框架環(huán)境,代碼生成及其它。
本發(fā)明亦旨在使用編輯器來生成腳本模板。
為在計(jì)算環(huán)境中達(dá)到上述意圖,并根據(jù)在此處所強(qiáng)調(diào)的發(fā)明目的,提供了一種系統(tǒng),用于編輯基于組件的源代碼模板。該系統(tǒng)包括上下文編輯器,用來鍵入源代碼和參數(shù)化時(shí)的上下文變量。上下文變量代表了組件和屬性特征名,屬性特征名在生成時(shí)被生成器替換成其實(shí)際特征值。源代碼其實(shí)是被捕入能相互嵌套的上下文塊里的,他們代表了常數(shù)型、條件型或反復(fù)型上下文塊,在反復(fù)型上下文塊的情形中條件表達(dá)式用于確定是否生成了上下文塊和上下文塊出現(xiàn)的次數(shù)。
還提供了另一方法,用于創(chuàng)建源代碼模板、上下文捕獲控制信息,并以視覺效果來代表上下文變量和上下文塊。這當(dāng)中,視覺效果包括顏色、特殊字體、修正的光標(biāo)形狀或乃至音效。
為綜觀本發(fā)明而提供了兩個(gè)獨(dú)特的實(shí)施例,它們皆涉及對分層結(jié)構(gòu)的控制信息的操縱。第一過程使人能高效創(chuàng)建、修正控制信息并使之可視化;第二過程可使該控制信息經(jīng)確定性變換而成為機(jī)器可懂的格式。
第一過程提供了對上下文敏感的編輯器,用于創(chuàng)建、修正和顯示分層結(jié)構(gòu)的控制信息。該編輯器呈示出適合于當(dāng)前上下文的動(dòng)作選項(xiàng),以此來簡化用戶操縱協(xié)議。因?yàn)榫庉嬈骼斫馍舷挛闹g的關(guān)系和多態(tài)性,所以其圖形用戶界面代表了上下文塊的反復(fù)性和條件性,而毋需借助腳本語言。編輯器根據(jù)關(guān)聯(lián)上下文的呈示規(guī)則顯示出控制信息,該呈示清晰地區(qū)分出了大段文本、文本的結(jié)構(gòu)和參數(shù)化要素。編輯器把所謂的元控制信息顯示為信息,從而高效地操縱元控制信息。
根據(jù)本發(fā)明的優(yōu)選實(shí)施例,提供了一種方法和系統(tǒng),用于顯示分層結(jié)構(gòu)數(shù)據(jù)。該方法和系統(tǒng)包括指定關(guān)于分層結(jié)構(gòu)數(shù)據(jù)參數(shù)要素的控制信息;為分層結(jié)構(gòu)數(shù)據(jù)編輯模板并指定數(shù)據(jù)的非參數(shù)要素;指定上下文參數(shù)作為數(shù)據(jù)的參數(shù)要素;為至少一塊分層結(jié)構(gòu)數(shù)據(jù)指定過濾選項(xiàng),該分層結(jié)構(gòu)數(shù)據(jù)包括至少一個(gè)非參數(shù)要素和一個(gè)參數(shù)要素;把顯示特性與各過濾選項(xiàng)逐一關(guān)聯(lián)起來;使用顯示特性把所識別的分層結(jié)構(gòu)數(shù)據(jù)給顯示出來。
第二過程提供了一種方法,可把控制信息系統(tǒng)地變換成機(jī)器可懂的格式。
根據(jù)本發(fā)明的另一優(yōu)選實(shí)施例,提供了一種方法,用于把分層結(jié)構(gòu)數(shù)據(jù)變換成代碼生成器的腳本數(shù)據(jù)。該方法包括為分層結(jié)構(gòu)數(shù)據(jù)的有關(guān)參數(shù)要素指定控制信息;為分層結(jié)構(gòu)數(shù)據(jù)編輯模板和指定數(shù)據(jù)的非參數(shù)要素;指定上下文參數(shù)作為數(shù)據(jù)的參數(shù)要素;為至少一塊分層結(jié)構(gòu)數(shù)據(jù)指定過濾選項(xiàng),該分層結(jié)構(gòu)數(shù)據(jù)包括至少一個(gè)非參數(shù)要素和一個(gè)參數(shù)要素;使用控制信息、模板、過濾選項(xiàng)和想要的源代碼語言的上下文參數(shù)來生成代碼生成器的腳本數(shù)據(jù)。
簡述附圖至此已概述了發(fā)明的內(nèi)容;下面將參考附圖來說明優(yōu)選實(shí)施例。在圖中
圖1是分層結(jié)構(gòu)數(shù)據(jù)編輯器的類原理圖;圖2是新模板的示范;圖3是把模板譯成腳本語言的示范;圖4是由腳本語言生成源代碼的示范;圖5是顯示和翻譯系統(tǒng)的框圖;圖6是顯示分層結(jié)構(gòu)數(shù)據(jù)的方法的步驟流程圖;圖7是把分層結(jié)構(gòu)數(shù)據(jù)翻譯成腳本語言的方法的步驟流程圖;圖8示出了新運(yùn)算署名工具;圖9示出了在模板編輯器內(nèi)所創(chuàng)建的署名;圖10示出了在注釋中插入的上下文變量;圖11示出了算法的創(chuàng)建;圖12示出了在算法中插入的上下文變量;圖13示出了如何存取屬性級別;圖14示出了如何為屬性編寫遞歸運(yùn)算的代碼;圖15示出了如何在該屬性級別中插入上下文變量;和圖16示出了完整的模板。
細(xì)述優(yōu)選實(shí)施例為方便模板程序員編寫代碼的過程,創(chuàng)建了一種新的分層結(jié)構(gòu)的控制信息編輯器(下文謂之“模板編輯器”),該模板編輯器使用編輯器來顯示分層結(jié)構(gòu)和參數(shù)化代碼。
分層結(jié)構(gòu)的控制信息編輯器的主要目的是要使程序員以一種酷似生成輸出的直觀形式來創(chuàng)建和編輯生成模板,這樣,對于生成器的任何所給輸入,一眼就能看出會生成何種輸出。為使之成為可能,模板編輯器提供了圖形編輯器(參看圖2),程序員可在其中鍵入文本(24),插入上下文變量(25)或插入上下文塊(23)。用各種視覺效果,比如文本/背景顏色,光標(biāo)/文本形狀等等(看圖1的上下文呈示規(guī)則31),來顯示用戶所輸入的文本與各種上下文變量(25)或上下文塊(23)之間的區(qū)別。上下文變量(25)無法被修正,它們是只讀字串。對上下文變量的可能操作只有替換或刪除。
圖1示出了編輯器實(shí)現(xiàn)的統(tǒng)一建模語言(UML)模型。主要的類是上下文塊23、上下文變量25和文本字串24,隨后的文本將說明他們在圖形用戶界面(GUI)編輯和腳本語言翻譯中的作用。
文本字串24代表上下文塊23里的靜態(tài)數(shù)據(jù)(即字符集),文本的外觀會依上下文塊而變化。再有,各字符皆有自己的一套編輯手續(xù),當(dāng)程序員企圖改動(dòng)該字符時(shí)就要履行這些手續(xù)。文本字符24的各字符也有自己的一套行為特征。由于字符的行為特征往往是不自覺地反復(fù)變成許多連續(xù)的字符,故使用稀疏的代表以節(jié)省電腦內(nèi)存。
上下文變量25被其上下文塊23鏈接至模型對象,因而能代表該對象的各種特性。在模板編輯器20中,上下文變量25的各字符皆與文本字符24的字符結(jié)構(gòu)相同,模板編輯器20不允許編輯代表,以此來保持上下文變量25的完整性。
上下文塊23含有文本字串24和/或上下文變量25和/或別的嵌套上下文塊23,上下文塊23的作用根據(jù)附加是根據(jù)附加條件反復(fù)地或有條件地產(chǎn)生其內(nèi)容。對于需要反復(fù)的上下文塊23來說,程序員必須提供選擇標(biāo)準(zhǔn)(即,條件和過濾變量),這是確定反復(fù)次數(shù)所不可或缺的。程序員通過使用標(biāo)準(zhǔn)而控制每次反復(fù)的上下文塊排序。
當(dāng)提供了上下文塊23的過濾器或條件標(biāo)準(zhǔn)后,除非滿足了標(biāo)準(zhǔn),否則不生成塊。對于各符合選擇標(biāo)準(zhǔn)的對象,上下文塊23將被實(shí)例化。
上下文塊23有三種格式條件型(33),常數(shù)型(23)和反復(fù)型(32)。對于每個(gè)被其過濾器(即標(biāo)準(zhǔn))所捕獲的對象,皆會生成一個(gè)獨(dú)一無二的條件型上下文塊(33);常數(shù)型上下文塊(23)像是條件永遠(yuǎn)為真的條件型上下文塊(33);反復(fù)型上下文塊(32)則對于每個(gè)被上下文塊條件(例如,類中各目標(biāo)的作用)所捕獲的項(xiàng)目在對象中反復(fù)生成。反復(fù)型上下文塊(32)還能在塊的每次反復(fù)之間插入用戶定義的界定文本,比如后面跟著一個(gè)空格的逗號。
在以面向?qū)ο蟮恼Z言所開發(fā)的實(shí)際應(yīng)用中,文本(24)的組成為一個(gè)字串對象和一個(gè)與字串大小相等的陣列對象。文本的陣列對象代表文本的行為特征。對于字串對象中的各字符,皆有一個(gè)對象在相應(yīng)的陣列位置上,該對象含有字符的圖形代表的信息,比如顏色、字號、加粗或斜體特征。該行為特征還存儲了字符的類型,無論是上下文變量25還是文本字串24。這些特性包括行為特征,并把熒幕上的文本與模板編輯類原理圖中的對象鏈接起來。
下面解釋如何把鍵入到模板編輯器中去的生成模板譯成腳本語言的格式。如類原理圖(圖1)所示,生成模板是上下文塊23的一個(gè)序列。上下文塊含有文本字串24的一個(gè)序列、上下文變量25和上下文塊23。
文本字串24代表靜態(tài)字符,像在腳本語言格式中所代表的那樣。
上下文變量被置于腳本語言格式中,在該處形象地顯示出該變量的值。在腳本語言格式中,這是通過一個(gè)前面帶‘%’的數(shù)字(如%001)來顯示的。上下文變量的值取決于使用它的上下文。
當(dāng)譯成腳本語言格式時(shí),依一個(gè)標(biāo)準(zhǔn)集把上下文塊寫入腳本語言格式中去。在反復(fù)型上下文塊的情形中,寫入腳本語言格式以代表上下文塊的反復(fù)。示范下面通過一個(gè)示范來幫助說明本發(fā)明的優(yōu)選實(shí)施例。該示范將示出如何定義上下文層次(參看圖1)和各層次的某些呈示規(guī)則(參看表1)、如何使用表2定義的控制信息數(shù)據(jù)、如何定義代表Java方法(圖2)的模板、如何生成模板并獲得腳本、如何使用已公布的題為“與組件研發(fā)關(guān)聯(lián)的源代碼模板生成器”(PCT專利申請?zhí)朩O00/22517)的系統(tǒng)來執(zhí)行該腳本,以獲得Java源代碼(圖4)。
下面的上下文層次說明了表2、3和圖2、3、4中所使用的可能的上下文。示范中所使用的所有對象皆屬于層次的某個(gè)級別,并獲得與該級別關(guān)聯(lián)的上下文特征。
下表定義了各上下文。對于各上下文,還定義了可能的上下文變量、子上下文和對象可用的特征。此定義使模板編輯器(20)可以顯示不同上下文塊(23)的子菜單、字體和顏色。
表1.層次的呈示規(guī)則表2示出了(來自UML模型的)用于驅(qū)動(dòng)模板實(shí)例化的信息。
表2.從UML模型獲得的信息圖2示出了在分層結(jié)構(gòu)的控制信息編輯器中的模板,該示范是基于各類而實(shí)例化的。
示出了類原理圖和示范之間的關(guān)系。生成模板的示例對應(yīng)于該模板,該示例包括上下文塊,它表示類上下文;該上下文塊包括
表3.上下文塊的內(nèi)容使用下面的注釋會更好地理解圖234.這些塊是基于各類而實(shí)例化的,各類皆要對所有控制信息(文本段、上下文變量或從屬塊)實(shí)例化一次。
35.這些是上下文變量,在未被實(shí)例化時(shí),他們形如被“<”和“>”括起來的特征名。
36.該塊是基于各屬性而實(shí)例化的,由于包含它的塊是基于各類而實(shí)例化的,故該塊可以在各類的實(shí)例化中任意次地反復(fù)。優(yōu)選地,該反復(fù)次數(shù)可以是任何大于或等于零的整數(shù)(若類中有反復(fù)次數(shù)為零的屬性,則跳過該塊)。
37.各類的各屬性皆要對這些上下文變量實(shí)例化一次。
通過把表2中所說明的控制數(shù)據(jù)傳遞給圖2所示的模板,則生成了圖3所示的腳本代碼。
參考圖2和圖3,創(chuàng)建模板的過程如下所述生成模板的示例標(biāo)出了已知信息,該已知信息合起來即構(gòu)成模板的序言,序言提供了模板名、過濾器(在此情形中,過濾器是“所有類”)和模板特性(在此情形中,模板創(chuàng)建了一個(gè)Java運(yùn)算)。
<pre listing-type="program-listing"><![CDATA[templateName^!setPropObjectData!definedAs^(&class) generate^(operation^public^instance^(!setPropObjectData!)definedAs^(]]></pre>
接著,由模板的類上下文塊來負(fù)責(zé)腳本。在腳本上下文中,按下面的格式嵌入上下文塊(!<block contents>!)于是,該塊為模板序言寫入了如下腳本(!這之后,由它的各個(gè)下級來繼續(xù)負(fù)責(zé)腳本。第一個(gè)下級是文本字串,文本字串按它在腳本中所出現(xiàn)的那樣生成,于是,第一文本字串被寫成/** *Take Properties result set received from database,and populate *下一要素是上下文變量。在腳本語言中,如前所述,上下文變量必須寫入對于對象的引用。在腳本中,按上下文變量出現(xiàn)的次序來引用參數(shù)。該次序由上下文塊來確定,上下文塊賦予各變量一個(gè)序號,從而注冊了自己的上下文變量列表。
在此情形中,對于一個(gè)類名有上下文變量。上下文變量向其上下文塊查詢自己的出現(xiàn)次序。
由于該上下文變量是第一個(gè)變量,它獲得了自己的次序并寫入%001對于所有的塊要素,皆反復(fù)執(zhí)行相同的過程,即得出了下面的腳本文本′s Data fields.*@param resultSet The data used in populating the%001′s Datafields*/public void setPropObjectData(java.util.Properties resultSet){然后由上下文塊來負(fù)責(zé)腳本,上下文塊知道只有用驚嘆號(!)方可結(jié)束自己。若上下文塊不是反復(fù)性的,且至少包括一個(gè)上下文變量,則會寫入!with^要是上下文塊是反復(fù)性的(像對于屬性的情形那樣),則本該寫入repeatForEach^attributeOrTargetRoleFilterExpression^&attribute上述情形中沒有過濾器,但要是屬性為private,我們本該在&attribute后面寫入private的。
下一步,上下文塊請求各上下文變量寫入自己的初始行為特征。于是上下文塊寫入(各上下文變量再依次寫入自己。類名上下文變量寫入了&class name^
由于不再有別的上下文變量了,故上下文塊為參數(shù)加上反括號,并接著為自己也加上反括號))對于當(dāng)前生成模板所屬的附加塊,依此類推地繼續(xù)生成腳本,直到以腳本語言完整地生成了模板。
圖3中的粗體文本直接源自圖2模板中的文本,下劃線文本涉及上下文變量,而其它文本則涉及腳本語言的結(jié)構(gòu)代碼。
需要注釋下面幾點(diǎn)75.主塊是基于各類而實(shí)例化的;各類皆要對所有控制信息——文本段、上下文變量或從屬塊實(shí)例化一次。
各類皆要對上下文變量76和77替換一次。
76.于此處接收被替換的上下文變量。
77.這是驅(qū)動(dòng)上下文變量替換的指令。
78.該塊是基于各屬性而實(shí)例化的,由于包含它的塊是基于各類而實(shí)例化的,故該塊可以在各類的實(shí)例化中任意次地反復(fù)。優(yōu)選地,該反復(fù)次數(shù)可以是任意大于或等于零的整數(shù)(若類中有反復(fù)次數(shù)為零的屬性,則跳過該塊)。
各類的各屬性皆要對上下文變量79和80實(shí)例化一次。
79.于此處接收被替換的上下文變量。
80.這是驅(qū)動(dòng)上下文變量替換的指令。
圖4包括所生成的代碼,其以目標(biāo)語言(在此情形中是Java語言)寫成。該代碼只不過是用圖2所示的模板生成代碼的一個(gè)示例罷了。圖2所示的用戶界面不言而喻地適用于所有可能的示例。
需要注釋下面幾點(diǎn)81.選擇基于各類而生成的代碼。
82.上下文變量<Class Name>被替換成“cityifno”。
83.以來自示例的數(shù)據(jù)來替換上下文變量;參考表2和圖2以弄清是如何進(jìn)行替換的。
在各屬性的區(qū)域中84.由Country屬性所生成的上下文塊。
85.由Population屬性所生成的上下文塊。
86.由Name屬性所生成的上下文塊。
下面將使用框圖5和流程圖6、7來詳細(xì)說明本發(fā)明的優(yōu)選實(shí)施例。
圖5是系統(tǒng)框圖,該系統(tǒng)是用于分層結(jié)構(gòu)數(shù)據(jù)的,并用于生成代碼生成器的腳本數(shù)據(jù)。編輯器120用來鍵入并修正模板。編輯器使用上下文定義符121來引入上下文變量和參數(shù)要素。接著,上下文定義符121使用分層信息定義符122來獲得有關(guān)模板上下文的信息,該上下文可從(例如)UML建模工具獲得。編輯器120還使用過濾定義符123來為生成源代碼而定義過濾選項(xiàng)。上下文定義符121還與上下文識別符125通訊,從而為各上下文變量分配顯示特性。最后,編輯器120把模板發(fā)送到顯示器126上顯示出來。顯示器126使用顯示特性124來顯示模板的各參數(shù)和非參數(shù)要素。作為選擇,系統(tǒng)還有代碼生成器的腳本生成器127,它使用編輯器120的模板、過濾定義選項(xiàng)123和上下文定義符121的上下文參數(shù)來生成代碼生成器的腳本數(shù)據(jù)。
圖6是根據(jù)本發(fā)明優(yōu)選實(shí)施例的方法的步驟流程圖。步驟130指定分層信息;步驟131編輯模板;步驟132指定上下文參數(shù);步驟133還要指定過濾選項(xiàng);步驟134把顯示特性與上下文參數(shù)關(guān)聯(lián)起來;最后,步驟135把數(shù)據(jù)顯示給用戶。
圖7是根據(jù)本發(fā)明優(yōu)選實(shí)施例的另一方法的流程圖。步驟140指定分層信息;步驟141編輯模板;步驟142指定上下文參數(shù);步驟143還要指定過濾選項(xiàng);接著步驟145使用模板、上下文參數(shù)和過濾選項(xiàng)生成代碼生成器的腳本數(shù)據(jù)。
固然,從本發(fā)明的優(yōu)選實(shí)施例中得知,代碼生成器的腳本數(shù)據(jù)是一個(gè)單獨(dú)的文件,其包括代碼生成器的所有相關(guān)信息并使允許代碼生成器以目標(biāo)語言來產(chǎn)生源代碼;但是也要明白,代碼生成器的腳本數(shù)據(jù)可能不止包括一個(gè)被代碼生成器用來以目標(biāo)語言產(chǎn)生源代碼的數(shù)據(jù)文件。例如,代碼生成器的腳本數(shù)據(jù)可以包括第一文件,它獨(dú)立于上下文,并含有要生成的方法和類;還包括第二文件,它含有取決于上下文的信息,如模型的細(xì)節(jié)。代碼生成器的腳本數(shù)據(jù)也可只包括獨(dú)立于上下文的數(shù)據(jù),而代碼生成器則另覓別的能提供取決于上下文的信息的來源。
下面給出了一個(gè)具體的示范,其中從熒幕上抓拍了用戶界面,它是根據(jù)本發(fā)明的優(yōu)選實(shí)施例而創(chuàng)建的。
圖8示出了新運(yùn)算署名工具38。模板名40須與運(yùn)算的可見性41、承襲性43和運(yùn)算是否為靜態(tài)42一起給出。返回類型須由其類名44和其分組45來定義。運(yùn)算名于46處鍵入。完成上述信息后,按OK按鈕39。
圖9示出了帶有方才所創(chuàng)建的運(yùn)算的署名52的模板編輯器50。該文本無法直接修正,因?yàn)樗怯山M織器來管理的。為進(jìn)行修正,可以雙擊署名字串并重新彈出運(yùn)算署名工具。為表明該文本是由運(yùn)算署名工具所創(chuàng)建的,它以不同的視覺效果而顯示。在附圖中,由于附圖是黑白的,故字體和背景的顏色皆是灰色陰影;不過,可以使用任何視覺特性以突出模板中不同性質(zhì)的文本的區(qū)別。例如,署名可以用藍(lán)色的背景來顯示,表示程序員只有通過雙擊方可改動(dòng)該字串里包括的內(nèi)容。空間53是留給為運(yùn)算編寫代碼用的,用不同于署名的背景顏色來顯示它,表示程序員可以向該空間填寫內(nèi)容。若(假如)程序員有視力障礙,則熒幕上的視覺效果可替換成音效。事實(shí)上可以使用任何手段,只要能標(biāo)明代碼部份的不同特性即可。指定處理類過濾器51以確定哪個(gè)/些組件是要由該圖形生成模板來生成的(附圖中未示出這些步驟)。
圖10示出了如何在運(yùn)算中創(chuàng)建注釋??梢?,在注釋中可以加入上下文變量59,比如屬性名60。圖11示出了完成后的注釋65和一些由程序員所鍵入的目標(biāo)源代碼。如圖12所示,使用如圖10所說明的過程,在指令的代碼71中加入了上下文變量“attribute name”。
圖13示出了如何創(chuàng)建單名運(yùn)算。同樣地,用不同的背景顏色來代表署名95。其中有注釋96,而在97處為運(yùn)算編寫代碼。若需要為組件的一些或所有屬性而反復(fù)執(zhí)行該運(yùn)算的一部分代碼,則可能鍵入屬性級別98并創(chuàng)建一個(gè)循環(huán)。圖14示出了為某些屬性而反復(fù)的代碼行104,圖中,為代碼的循環(huán)部份使用了不同的背景顏色103。同樣地,可能在屬性級別處插入上下文變量109,例如屬性名110(圖15)。最后,在圖16中完整地創(chuàng)建了模板。若保存了該模板,則代碼生成器(比如上文提到的PCT公開號WO 00/22517)即可使用該模板和模型說明來創(chuàng)建源代碼。
本發(fā)明可用于不同環(huán)境中,下面將對某些使用環(huán)境加以說明。
本發(fā)明的用途之一是通過創(chuàng)建模板的代碼行而隱藏來自開發(fā)者的腳本語言,從而用生成工具來生成代碼,這樣的生成工具例如已轉(zhuǎn)讓的與本申請一起待審的題為“與組件研發(fā)關(guān)聯(lián)的源代碼模板生成器”(PCT專利申請?zhí)朩O 00/22517)所述的生成工具。在此情形中,使用模板來為組件生成近似反復(fù)或反復(fù)的源代碼,這些組件符合生成模板的選擇標(biāo)準(zhǔn),而且是在建模工具或集成開發(fā)環(huán)境中的。
當(dāng)程序員鍵入將被用于系統(tǒng)所有類中的上下文塊時(shí),只消鍵入生成代碼時(shí)他要用到的方法即可。他可以在欲寫入類名的地方,用滑鼠右擊上下文編輯器,從所有可能的上下文變量列表中選擇他想要的上下文變量。在此情形中,他會選擇“<class name>”。參考現(xiàn)有技術(shù)一節(jié)所述的示范,新一行代碼即成為PersistenceSchema=new PersistenceSchema(″<class name>″);一旦在滑鼠右擊彈出的菜單中選擇了上下文變量“<classname>”以后,編輯器就自動(dòng)把它加入到代碼中去了。
當(dāng)某些上下文塊需要在同一算法中反復(fù)一次以上時(shí),必須使用過濾變量來創(chuàng)建循環(huán)。過濾變量確定參與循環(huán)的項(xiàng)目的選擇標(biāo)準(zhǔn),這些項(xiàng)目例如組件、組件子類、超類、或?qū)傩蕴卣?。在上述示范中,程序員只有為循環(huán)定義指令方可覆蓋所有屬性。在新的模板編輯器中,用視覺特性來識別對于所有屬性皆緊密相關(guān)的塊上下文。
例如,可以用不同的背景顏色來識別上下文塊,接著便自然要鍵入代碼行了,并通過滑鼠右擊來引入上下文變量。既然編輯器很明白對于所有屬性皆要復(fù)制這些代碼行,故在滑鼠右擊時(shí)彈出的上下文菜單中的上下文變量的選擇勢必不同于前面的菜單。這些上下文變量不盡屬于同一種類的上下文變量,例如,上下文變量“<class name>”可位于反復(fù)性上下文塊中,該上下文塊在當(dāng)前組件的屬性級別上迭代;或可位于內(nèi)部上下文塊中,該上下文塊在所給的外部特征名上迭代,該外部特征名涉及生成器動(dòng)態(tài)上下文中當(dāng)前類的當(dāng)前屬性。這是因?yàn)?,生成器要從外層級別到合適的級別遞歸地查詢,以獲取特征值??偸怯靡曈X特性來識別循環(huán),這樣就突出了編程的外觀。務(wù)必注意到甚至是在屬性級別上編寫代碼時(shí)也可能插入(例如)表示類的上下文變量。這就帶來了極大的靈活性,因?yàn)槌绦騿T可以使用所有上下文變量來為在屬性級別所需的運(yùn)算而編寫代碼。
在另一環(huán)境中,編輯器被用于可反復(fù)使用的代碼行庫。例如,可以用模板來創(chuàng)建個(gè)人或聯(lián)網(wǎng)的可反復(fù)使用的代碼。在此情形中,由于模板已被參數(shù)化了,故程序員毋需對代碼行做任何修正即可用于自己的工程了。該方法替程序員省卻了大量的工作。
使用這些模板的又一示范是面向萬維網(wǎng)的。迄今為止,超文本標(biāo)記語言(HTML)的開發(fā)者們只能使用正確信息的指針或記號來編寫網(wǎng)頁代碼。他們想引入的HTML代碼可以處理頁面的呈示,并包括用于存取服務(wù)器數(shù)據(jù)庫中的合適信息的代碼。同樣地,插入他的網(wǎng)頁編輯工具中的模板編輯器使程序員能創(chuàng)建網(wǎng)頁的視覺外觀,而毋需費(fèi)神考慮藉以存取數(shù)據(jù)庫數(shù)據(jù)的代碼了。程序員可以用傳統(tǒng)的HTML語言來編寫網(wǎng)頁代碼并加入上下文變量,該上下文變量反映出當(dāng)需要為特定頁面生成特定代碼時(shí),對來自數(shù)據(jù)庫的所需信息的說明。例如,當(dāng)程序員創(chuàng)建頁面以使顧客能存取他們的帳戶結(jié)余時(shí),可以使用模板編輯器創(chuàng)建一個(gè)HTML模板,并為實(shí)際結(jié)余使用參數(shù)化組件,比如<accountbalance>。當(dāng)生成該代碼時(shí),生成器會為所有顧客單獨(dú)地把<accountbalance>替換成正確的量。于是該網(wǎng)頁在觀察者看來就是完全相同的了,除了幾乎毋需程序員一方編程的帳戶結(jié)余以外。本發(fā)明可提供用于該環(huán)境中的圖形用戶界面,而不改變本發(fā)明的本質(zhì)。
按相同方式,模板編輯器的改進(jìn)版允許程序員將源代碼衍變?yōu)槟0?。程序員毋需以參數(shù)化的語法來書寫代碼了,他可以把他的源代碼保存為一個(gè)文件。當(dāng)他想起可以反復(fù)利用該代碼時(shí),他可以指定以何組件、何框架在使用該代碼的場合中生成。生成器由于清楚被建模系統(tǒng)的所有組件和所有要素之間的關(guān)系,故可以提取關(guān)于如何開發(fā)代碼的信息。弄清了模型的類名和屬性名并辨認(rèn)出了代碼的近似反復(fù)塊,編輯器方可把原始文件變換成模板的參數(shù)化源代碼,它既可以被顯示出來以征求程序員的同意,也可以自動(dòng)生成并存盤。然后,生成器即可使用該代碼并為新應(yīng)用而產(chǎn)生代碼。程序員毋需書寫實(shí)際的參數(shù)化代碼了。
而且,還可以使用嵌入在字處理應(yīng)用中的模板編輯器來產(chǎn)生模板,從而生成文本文件,比如參數(shù)化的郵寄列表,其帶有姓名、地址的記號和客戶的賬戶代表。
事實(shí)上,幾乎可以使用模板編輯器來生成任何東西,只要有了想要生成的東西的信息即可。可以使用擴(kuò)展標(biāo)記語言(XML)的模板編輯器。模板編輯器可以使用XML協(xié)議來提取想要生成的東西的信息。可以使用XML文檔類型定義(dtd)來把模板編輯器所使用的元數(shù)據(jù)定義為上下文變量,并可以使用XML的dtd樹結(jié)構(gòu)定義來了解參數(shù)化源文本的不同級別(也即,用來在兼容XML文檔的各嵌套級別上定義合適的過濾變量)??梢允褂帽粚懭隭ML的數(shù)據(jù)時(shí)間定義(dtd)文件,而非以建模工具而搭建的模型說明。在此情形中,XML的dtd可以取代對于代碼生成所不可或缺的模型說明,因?yàn)樗f明了被處理的數(shù)據(jù)。若兩個(gè)文件皆使用同一dtd文件,則可互換他們的數(shù)據(jù)文件,因?yàn)閿?shù)據(jù)具有相同的組織,并導(dǎo)致模板也具有相同的行為。
盡管具體地參考所述的實(shí)施例而說明了本發(fā)明,但是應(yīng)該理解對本領(lǐng)域的技術(shù)人員還會出現(xiàn)許多修正。相應(yīng)地,以上說明書和附圖應(yīng)作為對本發(fā)明的說明,而無限制之意。
權(quán)利要求
1.一種用于顯示分層結(jié)構(gòu)數(shù)據(jù)的系統(tǒng),該系統(tǒng)包括分層信息定義符,用來指定關(guān)于所述分層結(jié)構(gòu)數(shù)據(jù)參數(shù)要素的分層信息;編輯器,用來為所述分層結(jié)構(gòu)數(shù)據(jù)編輯模板并指定所述數(shù)據(jù)的非參數(shù)要素;上下文定義符,用來指定上下文參數(shù)作為所述數(shù)據(jù)的參數(shù)要素;上下文識別符,用來把顯示特性與各所述過濾選項(xiàng)逐一關(guān)聯(lián)起來;過濾定義符,用來為至少一塊所述分層結(jié)構(gòu)數(shù)據(jù)指定過濾選項(xiàng),該分層結(jié)構(gòu)數(shù)據(jù)包括至少一個(gè)所述非參數(shù)要素和一個(gè)所述參數(shù)要素;和顯示器,用來使用所述顯示特性把所識別的所述分層結(jié)構(gòu)數(shù)據(jù)給顯示出來。
2.權(quán)利要求1的系統(tǒng),其中,所述顯示特性是字體格式。
3.權(quán)利要求1和2之一的系統(tǒng),其中,所述顯示特性是背景顏色。
4.權(quán)利要求1,2和3之一的系統(tǒng),其中,用于分層結(jié)構(gòu)數(shù)據(jù)的所述模板包括基于組件的源代碼。
5.權(quán)利要求1,2,3和4之一的系統(tǒng),其中,所述至少一塊所述分層結(jié)構(gòu)數(shù)據(jù)是常數(shù)型、條件型和反復(fù)型代碼塊中的一種。
6.權(quán)利要求1,2,3,4和5之一的系統(tǒng),其中,所述分層信息定義符使用分層信息,它來自統(tǒng)一建模語言的建模應(yīng)用程序。
7.一種用于顯示分層結(jié)構(gòu)數(shù)據(jù)的方法,包括的步驟有指定關(guān)于所述分層結(jié)構(gòu)數(shù)據(jù)參數(shù)要素的分層信息;為所述分層結(jié)構(gòu)數(shù)據(jù)編輯模板并指定所述數(shù)據(jù)的非參數(shù)要素;指定上下文參數(shù)作為所述數(shù)據(jù)的參數(shù)要素;把顯示特性與各所述過濾選項(xiàng)逐一關(guān)聯(lián)起來;為至少一塊所述分層結(jié)構(gòu)數(shù)據(jù)指定過濾選項(xiàng),該分層結(jié)構(gòu)數(shù)據(jù)包括至少一個(gè)非參數(shù)要素和一個(gè)參數(shù)要素;以及使用所述顯示特性把所識別的所述分層結(jié)構(gòu)數(shù)據(jù)給顯示出來。
8.權(quán)利要求7的方法,其中,為所述分層結(jié)構(gòu)數(shù)據(jù)編輯模板包括在文本窗內(nèi)輸入代碼。
9.權(quán)利要求7和8之一的方法,其中,指定上下文參數(shù)包括使用上下文參數(shù)定義符來定義所述參數(shù)要素的參數(shù)特性,并在所述數(shù)據(jù)中插入所述上下文參數(shù)的符號代表。
10.權(quán)利要求9的方法,其中,使用上下文參數(shù)定義符包括從所述分層信息獲得關(guān)于所述數(shù)據(jù)的對上下文敏感的信息,并提供所指定的可用上下文參數(shù)的列表。
11.權(quán)利要求7,8,9和10之一的方法,其中,所述指定分層信息包括使用統(tǒng)一建模語言的建模應(yīng)用程序來指定所述分層信息。
12.權(quán)利要求7,8,9,10和11之一的方法,其中,所述顯示特性是字體格式。
13.一種方法,用于把分層結(jié)構(gòu)數(shù)據(jù)變換成代碼生成器的腳本數(shù)據(jù),包括的步驟有指定關(guān)于所述分層結(jié)構(gòu)數(shù)據(jù)參數(shù)要素的分層信息;為所述分層結(jié)構(gòu)數(shù)據(jù)編輯模板并指定所述數(shù)據(jù)的非參數(shù)要素;指定上下文參數(shù)作為所述數(shù)據(jù)的參數(shù)要素;為至少一塊所述分層結(jié)構(gòu)數(shù)據(jù)指定過濾選項(xiàng),該分層結(jié)構(gòu)數(shù)據(jù)包括至少一個(gè)非參數(shù)要素和一個(gè)參數(shù)要素;以及使用所述分層信息、所述模板、所述過濾選項(xiàng)和想要的源代碼語言的所述上下文參數(shù)來生成代碼生成器的腳本數(shù)據(jù)。
14.權(quán)利要求13的方法,進(jìn)一步包括以下步驟指定翻譯數(shù)據(jù),其包括與所述要素相關(guān)的源代碼表達(dá)式。
15.權(quán)利要求13和14之一的方法,其中,所述代碼生成器的腳本數(shù)據(jù)被代碼生成器用來生成源代碼,其包括在所述想要的源代碼語言中的反復(fù)、嵌套和近似反復(fù)的源代碼中的至少一種。
16.一種系統(tǒng),用于把分層結(jié)構(gòu)數(shù)據(jù)變換成代碼生成器的腳本數(shù)據(jù),包括分層信息定義符,用來指定關(guān)于所述分層結(jié)構(gòu)數(shù)據(jù)參數(shù)要素的分層信息;編輯器,用來為所述分層結(jié)構(gòu)數(shù)據(jù)編輯模板并指定所述數(shù)據(jù)的非參數(shù)要素;上下文定義符,用來指定上下文參數(shù)作為所述數(shù)據(jù)的參數(shù)要素;過濾定義符,用來為至少一塊所述分層結(jié)構(gòu)數(shù)據(jù)指定過濾選項(xiàng),該分層結(jié)構(gòu)數(shù)據(jù)包括至少一個(gè)非參數(shù)要素和一個(gè)參數(shù)要素;和腳本生成器,用來使用所述分層信息、所述模板、所述過濾選項(xiàng)和想要的源代碼語言的所述上下文參數(shù)來生成代碼生成器的腳本數(shù)據(jù)。
17.權(quán)利要求16的系統(tǒng),進(jìn)一步包括翻譯數(shù)據(jù)定義符,用來指定翻譯數(shù)據(jù),其包括與所述要素相關(guān)的源代碼表達(dá)式。
18.權(quán)利要求16和17之一的系統(tǒng),其中,所述代碼生成器的腳本數(shù)據(jù)被代碼生成器用來生成源代碼,其包括在所述想要的源代碼語言中的反復(fù)、嵌套和近似反復(fù)的源代碼中的至少一種。
全文摘要
第一過程提供了對上下文敏感的編輯器,用于創(chuàng)建、修正和顯示分層結(jié)構(gòu)的控制信息。該編輯器提供適合于當(dāng)前上下文的動(dòng)作選項(xiàng),以此來簡化用戶操縱協(xié)議。因?yàn)榫庉嬈骼斫馍舷挛闹g的關(guān)系和多態(tài)性,所以其編輯器和顯示器代表了上下文塊的反復(fù)性和條件性,而毋需借助腳本語言。編輯器根據(jù)關(guān)聯(lián)上下文的顯示規(guī)則顯示出控制信息,該呈示清晰地區(qū)分出了大段文本、文本的結(jié)構(gòu)和參數(shù)化要素。編輯器把所謂的元控制信息顯示為信息,從而高效地操縱元控制信息。第二過程提供了一種方法,可把控制信息系統(tǒng)地變換成機(jī)器可懂的格式,比如代碼生成器的腳本數(shù)據(jù)。
文檔編號G06F9/44GK1364259SQ00810757
公開日2002年8月14日 申請日期2000年7月24日 優(yōu)先權(quán)日1999年7月23日
發(fā)明者米歇爾·布賴沙德, 鮑利斯·申佳羅夫 申請人:加拿大柯達(dá)根技術(shù)公司