??? 程序生成器可以加快程序編碼產(chǎn)生的速度,產(chǎn)生規(guī)范和正確的代碼,編寫(xiě)一個(gè)程序生成器,它意味著不僅僅是寫(xiě)一個(gè)程序,而是要寫(xiě)一個(gè)可以寫(xiě)出許多程序的程序。在用戶(hù)界面、數(shù)據(jù)庫(kù)、中間件、語(yǔ)法分析" title="語(yǔ)法分析">語(yǔ)法分析和詞法分析等方面,程序生成器是其開(kāi)發(fā)環(huán)境中的重要部分。程序生成器的思想已經(jīng)使用了很多年了。比如:
. 語(yǔ)法分析器:語(yǔ)法分析器讀入一個(gè)標(biāo)記序列,并且創(chuàng)建一個(gè)稱(chēng)為語(yǔ)法樹(shù)的描述信息的數(shù)據(jù)
結(jié)構(gòu)。典型的為UNIX使用程序yacc,它讀入一個(gè)語(yǔ)言的形式描述(用某種語(yǔ)法表示)連同看
作是語(yǔ)法規(guī)則的動(dòng)作,然后輸出一個(gè)語(yǔ)法分析器程序。
. 有限狀態(tài)機(jī):可以用顯示不同狀態(tài)、事件及狀態(tài)轉(zhuǎn)移的表和(或)圖對(duì)程序進(jìn)行描述和說(shuō)明。
典型的為UNIX實(shí)用程序lex,就是一個(gè)有限狀態(tài)機(jī)的程序生成器,并且用yacc來(lái)解析語(yǔ)言
的標(biāo)記。
. 用戶(hù)界面:現(xiàn)在大多數(shù)代碼都是由GUI構(gòu)造器和直觀的編程工具自動(dòng)生成。
. 數(shù)據(jù)庫(kù)中的程序生成器:給出數(shù)據(jù)表、關(guān)系、事務(wù)邏輯及報(bào)表模式的描述,就能生成依照指定的規(guī)格構(gòu)造的數(shù)據(jù)庫(kù)程序。如:報(bào)表生成器、菜單生成器、屏幕生成器等。
. Web頁(yè)面生成:Java服務(wù)器頁(yè)面JSP是一種在Web上創(chuàng)建動(dòng)態(tài)內(nèi)容的工具。
??? 而XML作為一種完全可移植的數(shù)據(jù)格式,將成為跨平臺(tái)的不同系統(tǒng)之間的數(shù)據(jù)交換及數(shù)據(jù)顯示、描述的標(biāo)準(zhǔn)。Java具有面向?qū)ο?、跨平臺(tái)、分布式、簡(jiǎn)捷、健壯、安全等特點(diǎn),功能強(qiáng)大且簡(jiǎn)單易學(xué),正在逐步成為新一代網(wǎng)絡(luò)編程的主要開(kāi)發(fā)語(yǔ)言,Java將是網(wǎng)絡(luò)上的“世界語(yǔ)”,今后所有用其它語(yǔ)言編寫(xiě)的軟件統(tǒng)統(tǒng)都要用Java語(yǔ)言來(lái)改寫(xiě)。XML和Java的結(jié)合對(duì)已有的程序生成器技術(shù)提供了新的應(yīng)用背景,并且兩者相互協(xié)調(diào)補(bǔ)充。以更簡(jiǎn)單而且優(yōu)雅的風(fēng)格、可靠的性能,提高程序生成器的開(kāi)發(fā)效率。
2?程序生成器的結(jié)構(gòu)
??? 作為程序生成器的典型結(jié)構(gòu),它由獲取數(shù)據(jù)、分析/轉(zhuǎn)換數(shù)據(jù)、生成程序3個(gè)部分組成。規(guī)范程序生成器經(jīng)過(guò)如圖1所示三種約束時(shí)間,完成程序的生成。
3?域工程技術(shù)
??? 域工程是一個(gè)用于高效創(chuàng)建一個(gè)應(yīng)用(程序或軟件組件)族成員的過(guò)程。它是一個(gè)確定某個(gè)專(zhuān)業(yè)的重要組成與需求的系統(tǒng)方法,對(duì)如何高效地建立一個(gè)滿(mǎn)足用戶(hù)需要的程序生成器是非常必要的。程序的自動(dòng)創(chuàng)建依賴(lài)于對(duì)語(yǔ)法和期望目標(biāo)的精確描述,域工程技術(shù)將此概念延伸到時(shí)間基礎(chǔ)上分析一系列相關(guān)的程序,并能夠生成和修改它們。生成系統(tǒng)的構(gòu)造過(guò)程就是一個(gè)解決問(wèn)題產(chǎn)生軟件程序過(guò)程。因此,域既是一個(gè)有關(guān)聯(lián)的問(wèn)題的集合,也是一個(gè)有關(guān)的軟件應(yīng)用程序" title="應(yīng)用程序">應(yīng)用程序的集合。域工程分為兩個(gè)過(guò)程:域分析及域?qū)崿F(xiàn)。
??? 域分析:是一個(gè)用于確定域的術(shù)語(yǔ)、范圍、共性及變性的過(guò)程。
??? 域?qū)崿F(xiàn):是指在域中按照指定的要求高效構(gòu)造應(yīng)用及創(chuàng)建工具, 在域分析結(jié)束時(shí)即開(kāi)始。這其中包括程序生成器。
??? 任何開(kāi)發(fā)過(guò)程都要經(jīng)歷一系列的決策。在需求分析、軟件結(jié)構(gòu)、界面開(kāi)發(fā)、軟件設(shè)計(jì)(算法、數(shù)據(jù)結(jié)構(gòu)" title="數(shù)據(jù)結(jié)構(gòu)">數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)表示)、軟件編碼與測(cè)試以及軟件的使用過(guò)程中都需要做出決策。有關(guān)的最艱難的工作是做出決策而不是編碼。對(duì)于域工程,最困難的是判斷哪些是重要的決策,由誰(shuí)來(lái)制定,什么時(shí)候制定。并且要能區(qū)分其中的重要決策和不重要決策。決策的制定,要考慮域工程的過(guò)程中下列三種重要角色的作用及其作用時(shí)間(約束時(shí)間)。
??? 域工程師:定義并建立如程序生成器那樣的過(guò)程和工具。
??? 應(yīng)用工程師:利用如程序生成器那樣的工具創(chuàng)建應(yīng)用程序。
??? 應(yīng)用程序用戶(hù):使用應(yīng)用程序。
??? 域工程時(shí)間:由域工程師為每個(gè)應(yīng)用程序族做出決策的時(shí)間。包括:域分析時(shí)間,域執(zhí)行時(shí)間。
??? 約束時(shí)間:由應(yīng)用工程師為每個(gè)應(yīng)用程序做出決策的時(shí)間。包括:規(guī)劃時(shí)間,生成時(shí)間,編譯時(shí)間,設(shè)計(jì)時(shí)間,鏈接時(shí)間。
??? 運(yùn)行時(shí)間:由應(yīng)用程序用戶(hù)為每個(gè)特定的使用做出決策的時(shí)間。包括:安裝時(shí)間,初始化時(shí)間,真正運(yùn)行時(shí)間。
??? 決策分解是域?qū)崿F(xiàn)的基本概念,它簡(jiǎn)單地分解每個(gè)獨(dú)立的決策,并將其作為一個(gè)獨(dú)立元素或系統(tǒng)組件。如決策的物理分解可產(chǎn)生3種信息:域信息、用戶(hù)信息、應(yīng)用信息。有效的決策分解將產(chǎn)生一個(gè)既易于改變、又易于構(gòu)造的軟件結(jié)構(gòu)。決策分解基于抽象化。抽象化是一種使軟件更具有一般性、靈活性、可理解性和可重用性的主要技術(shù)。
??? 決策分解技術(shù)主要包括:
(1)?物理分解:如,應(yīng)用程序可以分解出不依賴(lài)于機(jī)器的部分和依賴(lài)于機(jī)器的部分。
(2)?典型過(guò)程的抽象化:如,子程序、宏及可重用軟件包的創(chuàng)建。
(3)?面向?qū)ο蟮某橄蠡喝?,隱含在對(duì)象中的隱藏決策。
(4)?繼承方法:公共關(guān)系在父類(lèi)和子類(lèi)中被共享使用。
(5)?應(yīng)用程序框架:可看作一個(gè)軟件重用的自頂向下的方法。
(6)?規(guī)范驅(qū)動(dòng)技術(shù):應(yīng)用規(guī)范層信息創(chuàng)建或直接執(zhí)行應(yīng)用程序
??? 域工程是創(chuàng)建應(yīng)用程序族的過(guò)程,因此,不僅要考慮單一的應(yīng)用會(huì)如何隨時(shí)間而改變,而且也要注意到域領(lǐng)域應(yīng)用的整個(gè)范圍,從而確定這些應(yīng)用之間的差別。這些差別稱(chēng)為域工程的可變性,它是域工程的核心。對(duì)于域工程需要理解一個(gè)應(yīng)用族中什么是不變的,什么是可變的。不變的成分稱(chēng)為共性,最困難的就是確定并組織一個(gè)域的所有共性與可變性。
共性:是一個(gè)在域工程期間關(guān)于什么是整個(gè)域的共同性問(wèn)題所做出的決策或假設(shè)。共性可以確定域的范圍、軟件的功能、與其它域的分界面、操作環(huán)境、軟件的限制標(biāo)準(zhǔn)以及應(yīng)用軟件公共部分實(shí)現(xiàn)的細(xì)節(jié)。共性和標(biāo)準(zhǔn)有許多共同點(diǎn)。標(biāo)準(zhǔn)是做某件事情的共同方法。許多為標(biāo)準(zhǔn)所做的努力根本上就是一個(gè)域分析。相反域分析工作附帶產(chǎn)生一些標(biāo)準(zhǔn),以幫助創(chuàng)建更大的將為一大群人所接受的共性集合。
??? 可變性:是一個(gè)在域分析期間確認(rèn)但直到建立或運(yùn)行時(shí)間才確定的決策。
共性和可變性經(jīng)常可以相互轉(zhuǎn)化。而使域分析保持平衡。如圖2所示
??? 可變性包括:建立時(shí)的可變性、運(yùn)行時(shí)的可變性,編譯時(shí)可變性、生成時(shí)可變性、預(yù)處
理時(shí)可變性。
??? ① 建立時(shí)的可變性
??? 表示程序族的全部程序中的差別是什么。建立時(shí)的可變性集合是為建立一個(gè)程序生成器所需要的信息中最重要的部分,它可以用于定義一個(gè)規(guī)范語(yǔ)言和一個(gè)支持可變性的結(jié)構(gòu)框架。
??? ②?運(yùn)行時(shí)的可變性
??? 是在運(yùn)行時(shí)間內(nèi)確定的決策。運(yùn)行時(shí)的可變性建立在應(yīng)用軟件的公共部分。由許多方法表示和控制。比如:
. 資源和配置文件:這些文件包含信息并在運(yùn)行時(shí)間內(nèi)讀入一般保存在一個(gè)外部文件
. 數(shù)據(jù)庫(kù):查詢(xún)數(shù)據(jù)庫(kù)獲得讀入信息
. 用戶(hù)界面:通過(guò)與用戶(hù)交互獲得信息。
. 動(dòng)態(tài)加載類(lèi):常見(jiàn)的變化可以被確定、創(chuàng)建、編譯,并且直接加載到一個(gè)正在運(yùn)行的Java程序中。
??? ③?編譯時(shí)可變性
??? 是在編譯時(shí)間確定決策??梢杂稍S多方式實(shí)現(xiàn)。比如:
. 編譯時(shí)的常量:可以利用好的編譯器來(lái)優(yōu)化程序。
. 面向?qū)ο蠹夹g(shù):基本類(lèi)定義共性,子類(lèi)提供可變性。特別是編譯時(shí)的可變性。
??? ④?生成時(shí)可變性
??? 信息通過(guò)一個(gè)創(chuàng)建定制程序的程序生成器讀入。
??? ⑤?預(yù)處理時(shí)可變性
??? 預(yù)處理發(fā)生在編譯時(shí)間前,預(yù)處理器用于擴(kuò)展宏功能。依據(jù)分開(kāi)的頭文件給程序構(gòu)造可變性。
??? 域工程經(jīng)常從應(yīng)用工程周期獲得適當(dāng)?shù)姆答伓粩嗾归_(kāi)。形成域工程周期。應(yīng)用工程周期和域工程周期的關(guān)系如圖3所示。
4?程序生成器的實(shí)現(xiàn)方法
4.1 利用DOM生成程序
??? 使用XML文件和DOM構(gòu)建一個(gè)程序生成器如圖4所示。
??? 使用XML語(yǔ)法分析器讀入和存儲(chǔ)規(guī)范, 讀入XML文件并對(duì)其進(jìn)行語(yǔ)法分析,創(chuàng)建DOM對(duì)象。XML語(yǔ)法分析器需要三種分析和存儲(chǔ)規(guī)范的輸入方法:
. 由W3C提供的DOM接口的輸入(純DOM方法);
. 針對(duì)IBM的語(yǔ)法分析器的輸入(自定義DOM方法);
. 用于讀入文件的標(biāo)準(zhǔn)的Java輸入數(shù)據(jù)包(自定義SAX方法);
??? 以上三種分析和存儲(chǔ)規(guī)范方法的選擇可以結(jié)合下面的判定要求加以確定。
(1) 判定代碼生成器能否用自定義數(shù)據(jù)結(jié)構(gòu)獲得規(guī)范的信息,若不能,則使用純DOM方法;若能,則進(jìn)一步判定自定義數(shù)據(jù)結(jié)構(gòu)是否應(yīng)該從DOM中創(chuàng)建,若是,則使用自定義DOM方法。否則,使用自定義SAX方法;
(2)?根據(jù)性能要求確定。大的XML文檔上使用DOM數(shù)據(jù)結(jié)構(gòu)可能會(huì)花費(fèi)昂貴,尤其是當(dāng)僅僅使用文檔的一小部分生成程序時(shí)。這時(shí)將不得不創(chuàng)建自己的自定義數(shù)據(jù)結(jié)構(gòu),并且還將使用SAX。
(3)?如果使用DOM效率很低,也可以根據(jù)實(shí)際情況加以考慮。這種情況最有可能發(fā)生在程序的規(guī)范僅為大的XML文檔的一小部分的地方。使用SAX將允許忽略XML文檔中的大部分,而僅僅只為代碼生成器提取必要的信息。
??? 一旦XML文檔進(jìn)行過(guò)語(yǔ)法分析并且作為一個(gè)對(duì)象使用時(shí),就可以在該對(duì)象上執(zhí)行分析和判斷。分析包括:
. 檢錯(cuò):在規(guī)范中查找句法錯(cuò)誤。
. 警告:查找公共錯(cuò)誤或潛在的不明顯的錯(cuò)誤。
. 模型分析:分析規(guī)范更深層的語(yǔ)義。
. 性能分析:決定生成一個(gè)優(yōu)化程序結(jié)構(gòu)或代碼途徑的規(guī)范。
. 縮寫(xiě)的擴(kuò)展:規(guī)范中常提供縮寫(xiě)或快捷方式。
. 擴(kuò)展成標(biāo)準(zhǔn)形式:有些規(guī)范允許以各種方式說(shuō)明同一件事情。
. 優(yōu)化:轉(zhuǎn)換對(duì)象。
??? 一旦DOM數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)于內(nèi)存中,就可以把基于XML文檔的代碼用于分析和轉(zhuǎn)換結(jié)構(gòu),最終代碼生成器直接從DOM數(shù)據(jù)結(jié)構(gòu)中獲取信息。讀入XML文件并對(duì)其進(jìn)行語(yǔ)法分析的程序段如下:
import? com.ibm.xml.parser.Parser;
import? org.w3c.dom.*;
import? java.io.*;
public? class? DOM_Utill {
…
/** read? and? parse? an? XML? files */
public? static? Document? readDocument (String? filename)
throws Exception {
InputStream is=new FileInputStream(filename);
Parser parser=new Parser(filename);
Return Parser.readStream(is);
}
}
??? 使用DOM的程序生成器,首先要提供一個(gè)基本實(shí)用工具類(lèi),該類(lèi)定義利用DOM樹(shù)中信息的實(shí)用方法,如用于獲取與語(yǔ)法分析樹(shù)中的節(jié)點(diǎn)相關(guān)聯(lián)的數(shù)據(jù)的方法,用于獲取元素屬性值的方法,如果使用自定義DOM方法。這種方法是程序?qū)裍ML規(guī)范作為一個(gè)自定義的數(shù)據(jù)結(jié)構(gòu)讀入,然后將該規(guī)范轉(zhuǎn)換為一個(gè)自定義的數(shù)據(jù)結(jié)構(gòu),XML規(guī)范既可以在運(yùn)行時(shí)間讀入,也可以在生成時(shí)間讀入。標(biāo)準(zhǔn)的代碼生成器是一系列簡(jiǎn)單的打印語(yǔ)句,這些語(yǔ)句是具有重復(fù)代碼或條件代碼的控制語(yǔ)句的狀態(tài)流。
4.2 利用JSP(Java? Server? Pages)生成程序
??? JSP是普遍應(yīng)用于Internet中的重要的程序生成器。JSP是一種非常簡(jiǎn)單的規(guī)范語(yǔ)言,包含了輸出到Web頁(yè)面的靜態(tài)文本和調(diào)用基本實(shí)現(xiàn)語(yǔ)言的轉(zhuǎn)義符" title="轉(zhuǎn)義符">轉(zhuǎn)義符,它沒(méi)有高層次的抽象化并且不涉及語(yǔ)言結(jié)構(gòu)。轉(zhuǎn)義符提供很大的靈活性,同時(shí)又只產(chǎn)生最小的影響。JSP是一種既簡(jiǎn)單又強(qiáng)有力的技術(shù),用于在Web服務(wù)器端生成動(dòng)態(tài)的HTML頁(yè)面。JSP提供了一個(gè)非常簡(jiǎn)單的利用“模板”創(chuàng)建程序生成器的途徑。盡管JSP是用于設(shè)計(jì)和實(shí)現(xiàn)Web頁(yè)面的,但原則上可以傳送任何其它內(nèi)容,特別是它可以傳送Java程序。
一個(gè)簡(jiǎn)單的程序生成器是JSP翻譯器,JSP翻譯器是程序生成器廣泛使用的一個(gè)示例。它把一個(gè)JSP文件(規(guī)范)轉(zhuǎn)換成一個(gè)JAVA文件。從一個(gè)JSP文件到Java程序的轉(zhuǎn)換由Java服務(wù)器頁(yè)面規(guī)范來(lái)定義。過(guò)程示例如下:
Mydate.jsp
?
???
4.3 利用Xpath和XSLT生成程序
??? XSLT和Xpath能夠不利用任何Java代碼就可以創(chuàng)建程序生成器。
?? ?Xpath是一種用于從XML文檔提取信息的語(yǔ)言,用于在XSLT中選擇一個(gè)XML文檔的不同部分。
??? XSLT又稱(chēng)可擴(kuò)展的樣式表轉(zhuǎn)換語(yǔ)言,可以將XML文檔翻譯成其它不同結(jié)構(gòu)的XML文檔或純文本文件。XSLT提供了一種轉(zhuǎn)換和操作XML數(shù)據(jù)的機(jī)制。如圖5所示。
??? XML構(gòu)成了信息互交換標(biāo)準(zhǔn)的基礎(chǔ)。XML提供了信息構(gòu)成的結(jié)構(gòu),XSLT與Xpath(XML路徑語(yǔ)言)提供了提取、重建和熟練使用XML中信息的手段。Xpath使用一種簡(jiǎn)單的路徑語(yǔ)言來(lái)對(duì)XML文檔的各個(gè)部分進(jìn)行尋址,XML提供一系列的操作和操作方法。而Xpath保證了選擇和尋址的準(zhǔn)確度。
??? 利用Xpath和XSLT生成程序舉例
play.xml
?
???
???
?
???
???
?
?
???
???
?
?
???
?
?
???
???
?
???
???
???
?
play.dtd
play.xsl
import java.awt.*;
import java.awt.event.*;
class
/* The Props for
??? Button
????????????? = new Button("
/* The Events in the
??? class PropEvent implements ActionListener {
??????? public void actionPerformed(ActionEvent evt) {
??????????? Object prop = evt.getSource();
???????????
?????? } else
enterNewScene("
????????? } else {
??????????????? System.out.println("Invalid prop");
????????? }
????? }
?}
?/* Creating and starting up the
?String currentScene;
?public
??????? super("
?????????????????????????????
??????? setSize(
?????????????????????????????
??????? setLayout(new FlowLayout());
??????? // initialize props
??????? PropEvent a = new PropEvent();
???????
??????? // start scene
??????? enterNewScene("
? }
? public void enterNewScene(String scene) {
??????? removeAll();? // remove previous scene
??????? currentScene = scene;
???????????
?? } else
?
??????????????? add(
?????????? setBackground(Color.decode("
??????? } else {
??????????? System.out.println("Invalid scene: "+scene);
??????? }
??????? show();
??? }
??? public static void main(String[] args) {
??????? new
??? }
}
???????????????
?
?
?
?
?
4.4 模板語(yǔ)言
??? JSP和XSLT方法對(duì)于構(gòu)造程序生成器是合理而有效的,然而它們都不是專(zhuān)門(mén)為編寫(xiě)程序生成器而設(shè)計(jì)的,并且在做這方面的應(yīng)用時(shí)都有一些不足。
??? JSP的主要缺點(diǎn)如下:
(1)?服務(wù)器環(huán)境:JSP在服務(wù)器環(huán)境下工作,這對(duì)于大部分程序生成器來(lái)說(shuō)常常是不需要的,甚至?xí)幸恍┓恋K。如和其它系統(tǒng)構(gòu)建工具結(jié)合時(shí)就非常不便。
(2)?輸入不靈活:JSP的輸入來(lái)自請(qǐng)求參數(shù)而不是命令行或文件,能用請(qǐng)求參數(shù)代替命令行甚至文件。如果文件在其它機(jī)器上,讀入會(huì)非常不方便。DOM API能用于讀入XML文件。不只限于XML輸入,JSP對(duì)其它種類(lèi)的輸入也不能提供任何便利。
??? XSLT的主要缺點(diǎn)如下:
(1)?限制Java轉(zhuǎn)義符:XSLT不能提供對(duì)Java語(yǔ)言的直接轉(zhuǎn)義符來(lái)控制模板。
(2)?冗長(zhǎng)的模板控制:XSLT是一種比較繁瑣的語(yǔ)言,因此經(jīng)常會(huì)混淆生成程序的底層結(jié)構(gòu)。
(3)?實(shí)體引用:特殊字符必須適當(dāng)?shù)剞D(zhuǎn)義。最明顯的就是在程序生成器中經(jīng)常用的小于號(hào)。
??? XSLT和JSP都有很強(qiáng)大的功能。XSLT最強(qiáng)大的功能就是XPath,它提供了一種簡(jiǎn)明的方法供用戶(hù)從XML文檔中獲取精確的信息。JSP提供了簡(jiǎn)單有效的方法允許Java語(yǔ)言控制程序生成器的輸出。設(shè)計(jì)新的模板語(yǔ)言TL(Template? Language)就是僅可能結(jié)合JSP和XSLT的優(yōu)點(diǎn)而有避免它們的缺點(diǎn)??梢钥紤]用Java語(yǔ)言作為基本實(shí)現(xiàn)語(yǔ)言(但不必為輸出語(yǔ)言)的程序生成器模板,把XML作為輸入的規(guī)范語(yǔ)言。由于Xpath提供了達(dá)到目的所需要的一切,因此可以把Xpath作為新的模板語(yǔ)言所必須的一部分。為了把Xpath嵌入TL,需要規(guī)定Xpath表達(dá)式的計(jì)算值的關(guān)聯(lián)。需要一種方法來(lái)規(guī)定約束變量、關(guān)聯(lián)節(jié)點(diǎn)、大小和位置。Xpath還沒(méi)有用作把組件和其它工具及解決方案相結(jié)合的API,因而,只能使用自己編寫(xiě)的API。這種API需要一個(gè)新的類(lèi)和調(diào)用DOM樹(shù)、建立關(guān)聯(lián)、包含約束變量及計(jì)算Xpath表達(dá)式值的方法。
??? 新的模板語(yǔ)言的設(shè)計(jì)和基本原理應(yīng)具有以下設(shè)計(jì)目標(biāo):
. 具有簡(jiǎn)單強(qiáng)大的表達(dá)式語(yǔ)言,以此從XML文檔獲得信息。該語(yǔ)言應(yīng)該允許通過(guò)XML樹(shù)來(lái)選擇元素和屬性的特定子集。
. 具有一種把來(lái)自XML規(guī)范的信息插入到生成的輸出中的簡(jiǎn)潔方式,也應(yīng)該有重復(fù)規(guī)范中的元素的簡(jiǎn)潔方式,并且應(yīng)該具有條件語(yǔ)句生成部分。
. 具有表示復(fù)雜而獨(dú)特的重復(fù)以及其它控制流結(jié)構(gòu)的方式。
. 具有對(duì)Java的所有特征的完整而直接的端口。包括可以和其它組件和庫(kù)結(jié)合的能力。
. 提供與DOM API的接口。用于直接在XML樹(shù)上進(jìn)行轉(zhuǎn)換。
. 在不過(guò)分妨礙程序生成的情況下,允許進(jìn)行空白字符控制。
. 使程序設(shè)計(jì)" title="程序設(shè)計(jì)">程序設(shè)計(jì)語(yǔ)言中的轉(zhuǎn)義符達(dá)到最小。
. 在已用命令行自變量指定輸入輸出文件的命令行處理器下是可執(zhí)行的。使程序生成器像設(shè)計(jì)的那樣可以很容易的嵌入其它軟件設(shè)計(jì)工具。這種程序生成器對(duì)于其它Java對(duì)象也是可用的,特別是一個(gè)模板可以使用其它模板。
. 允許程序生成器有多重輸入輸出,這允許在多個(gè)文件中利用一個(gè)規(guī)范來(lái)組織這些文件,并且允許一個(gè)已生成的程序跨越多個(gè)文件。多重輸出對(duì)于生成無(wú)代碼文件,如文檔、測(cè)試腳本及其它文件是非常重要的。
. 能與XML進(jìn)行相互轉(zhuǎn)換,以便XML的所有工具可以被模板所使用。JSP的XML版本就是具有這個(gè)特征的一個(gè)示例。
. 允許選擇編譯或解釋模式。
??? 新TL的其它特征:
??? 記錄當(dāng)前的輸入行數(shù)和/或字符數(shù):這可提供精確的錯(cuò)誤信息并把行信息嵌入到生成代碼中,以便反過(guò)來(lái)所在范圍的特定部分。
??? 遍歷排序:XSLT提供了一個(gè)強(qiáng)大的排序功能來(lái)更新遍歷,這個(gè)功能可進(jìn)一步用在新TL中。
??? 記錄樹(shù)信息:為了提高程序生成器的效率,使用把語(yǔ)法樹(shù)的節(jié)點(diǎn)與信息結(jié)合起來(lái)存儲(chǔ)的方法。
??? 語(yǔ)言擴(kuò)展:允許建立新的特定標(biāo)記,在TL中加入新的特性會(huì)大大簡(jiǎn)化模板頁(yè)。
??? 分隔符:通常,在一列元素間加入分隔符是非常必要的。
??? 實(shí)用方法:對(duì)于通常的需要可以提供很多有效的實(shí)用方法。這包括引用規(guī)范。
??? 實(shí)現(xiàn)TL需要?jiǎng)?chuàng)建以下工具,除了在簡(jiǎn)單形式與XML形式間的兩個(gè)轉(zhuǎn)換器外,還要有一個(gè)從其中一種形式到Java程序的轉(zhuǎn)換器。它是一種獨(dú)特的程序生成器,因?yàn)樗傻某绦蚴瞧渌某绦蛏善?。所以,可以把轉(zhuǎn)換器看作一個(gè)程序生成器的生成器。
4.5 面向組件的程序設(shè)計(jì)
??? 大多數(shù)程序生成器可以生成組件,這些組件與其它組件相結(jié)合以產(chǎn)生軟件系統(tǒng)。組件以及它們?cè)谲浖到y(tǒng)中的構(gòu)成稱(chēng)為面向組件的程序設(shè)計(jì)。組件、接口和連接器是面向組件的程序設(shè)計(jì)的3個(gè)主要因素。程序生成器有時(shí)也作為產(chǎn)生組成系統(tǒng)的代碼的工具,即作為一個(gè)將系統(tǒng)關(guān)聯(lián)在一起的“膠合劑”。軟件組件是僅由協(xié)議特定的接口和明確的語(yǔ)境構(gòu)成的軟件單元。它既可以單獨(dú)使用也可以被第三方調(diào)用。JavaBeans模式是面向組件程序設(shè)計(jì)的一個(gè)示例。接口是組件和其它軟件元素間的一種交互。接口的語(yǔ)義描述組件的運(yùn)行時(shí)行為,接口描述語(yǔ)言(IDL)在語(yǔ)法層上描述組件的接口。模塊互連語(yǔ)言(MIL)也是一個(gè)描述一系列組件相互連接的IDL。兩個(gè)組件之間的連接有時(shí)叫做連接器。IDL描述組件和接口,MIL描述組件、接口和連接器。連接器將一個(gè)組件的導(dǎo)入與另一個(gè)組件的導(dǎo)出相連接。接口適配器通過(guò)調(diào)用組件和直接訪(fǎng)問(wèn)被調(diào)組件的適當(dāng)方法來(lái)實(shí)現(xiàn)接口。
程序生成器和面向組件的編程共同發(fā)展。組件和它們?cè)谙到y(tǒng)中的組合涉及到一些重要的問(wèn)題。如果軟件重用庫(kù)著眼于單個(gè)的組件而非組件族,要找到恰當(dāng)?shù)慕M件是很困難的。組件族可以通過(guò)利用設(shè)計(jì)時(shí)和運(yùn)行時(shí)特性來(lái)開(kāi)發(fā)。當(dāng)組件不足時(shí),生成時(shí)可變性可以用來(lái)為任何場(chǎng)合構(gòu)建專(zhuān)用組件設(shè)計(jì)程序生成器。
面向組件程序設(shè)計(jì)的第二個(gè)主要問(wèn)題是,設(shè)置并連接組件直到創(chuàng)建一個(gè)軟件系統(tǒng),在組件之間的連接可能需要復(fù)雜的接口適配器,它主要考慮諸如參數(shù)變換和可選參數(shù)的默認(rèn)、同步和異步的連接以及其它通信機(jī)制。編寫(xiě)這種接口代碼是MIL(模塊接口語(yǔ)言) 程序生成器編程人員的工作。
最后,創(chuàng)建這樣的工具和系統(tǒng)并不困難。設(shè)計(jì)一種好的語(yǔ)言或系統(tǒng)可能是困難的。
5?程序生成器的設(shè)計(jì)風(fēng)格
??? 程序生成器可以使用如下程序設(shè)計(jì)風(fēng)格:
?? ?面向?qū)ο蟮尿?qū)動(dòng)風(fēng)格:使用面向?qū)ο蠹夹g(shù)來(lái)組織程序的結(jié)構(gòu)。
??? 代碼驅(qū)動(dòng)風(fēng)格:在任何需要的地方生成代碼并直接嵌入數(shù)據(jù),不過(guò)多擔(dān)心程序結(jié)構(gòu),而只需將考慮的重點(diǎn)放在簡(jiǎn)單高效的代碼上。
??? 表驅(qū)動(dòng)風(fēng)格:將數(shù)據(jù)與代碼分離。規(guī)范信息存儲(chǔ)在專(zhuān)門(mén)設(shè)計(jì)的數(shù)據(jù)結(jié)構(gòu)中,并且代碼在適當(dāng)?shù)臅r(shí)候參照數(shù)據(jù)結(jié)構(gòu)恢復(fù)數(shù)據(jù)。
6?結(jié)束語(yǔ)
??? 程序生成器思想已產(chǎn)生許多年了,并且大多用C語(yǔ)言等純文本語(yǔ)言進(jìn)行實(shí)現(xiàn),而通過(guò)XML和JAVA等作為實(shí)現(xiàn)的技術(shù)并不多見(jiàn),隨著XML和JAVA技術(shù)的不斷成熟,以及在各個(gè)領(lǐng)域及各行各業(yè)的廣泛應(yīng)用,XML和JAVA給這些已有技術(shù)提供了新的應(yīng)用背景。XML可以用來(lái)生成獨(dú)立于應(yīng)用程序和平臺(tái)的數(shù)據(jù),JAVA技術(shù)可以用來(lái)實(shí)現(xiàn)獨(dú)立于應(yīng)用程序和平臺(tái)的事務(wù)邏輯。兩者相互協(xié)調(diào)補(bǔ)充。本文通過(guò)域分析的思想、方法,結(jié)合JAVA和XML技術(shù)提出了利用JAVA和XML開(kāi)發(fā)程序生成器的幾種方法,并對(duì)其進(jìn)行了比較分析??梢灶A(yù)見(jiàn),JAVA和XML技術(shù)必將使程序生成器的開(kāi)發(fā)變得更加通用、簡(jiǎn)捷和規(guī)范。
參考文獻(xiàn)
1.?Krzysztof Czarnecki和Ulrich Eisenecker,Generative Programing:Methods,Tools,and Applications,Addision-Wesly,2000.
2.?Jag Sodhi和Prince Sodhi,Software Reuse:Domain Analysis and Design Process,McGraw Hill,1999.
3.?J. W. Cooper,Java Design Patterns:A Tutorial,Addison-Wesley,2000.
4.?Charles F. Goldfarb和Paul Prescord,The XML Handbook,Prentice Hall,2001.
5.?H.Maruyama、K.Tamura和N.Uramoto,XML and Java、Developing Web applications,Addision-Wesley,1999.
6.?J.Craig Cleaveland,Janet A.Fertig,and george W.Newsome,“Dividing the Software Pie,”AT&T Technical?Journal,Vol.75,No.2,March 1996,pp.8-19.
7.?J.Craig Cleaveland,“Building Application Generators,”IEEE Software,July 1988;曾發(fā)表在Domain Analysis and Software System Modeling by Prieto-Diaz and Arango,1991.