摘要:可配置的程序設(shè)計(jì)是為了解決面向?qū)ο蟮某绦蛟O(shè)計(jì)關(guān)于接口的局限性而提出來的一種程序設(shè)計(jì)方法,其優(yōu)勢(shì)體現(xiàn)在開發(fā)人員可以使用配置文件來更改設(shè)置,而不必重編譯應(yīng)用程序,使得業(yè)務(wù)邏輯分離出來。本文詳細(xì)介紹了一些應(yīng)用程序所使用的配置文件,從而體現(xiàn)出可配置的程序設(shè)計(jì)的優(yōu)勢(shì),程序設(shè)計(jì)必將沿著該技術(shù)路線發(fā)展下去。
關(guān)鍵詞:面向過程;面向?qū)ο?;可配置;程序設(shè)計(jì)
中圖分類號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2008)14-20880-03
1 引言
隨著計(jì)算機(jī)技術(shù)的發(fā)展,計(jì)算機(jī)應(yīng)用領(lǐng)域不斷擴(kuò)大,軟件的規(guī)模及結(jié)構(gòu)的復(fù)雜程度也不斷增加,為了滿足軟件生產(chǎn)在質(zhì)量和數(shù)量上的需求,軟件開發(fā)人員不斷尋求更好的軟件開發(fā)技術(shù),程序設(shè)計(jì)方法也在不斷發(fā)展。從最初的面向過程的程序設(shè)計(jì),到后來流行的面向?qū)ο蟮某绦蛟O(shè)計(jì),目前可配置的程序設(shè)計(jì)以其優(yōu)勢(shì)得到了越來越廣泛的應(yīng)用。
2 面向過程的程序設(shè)計(jì)
早期的計(jì)算機(jī)存儲(chǔ)器容量非常小,人們?cè)O(shè)計(jì)程序時(shí)首先考慮的問題是如何減少存儲(chǔ)器開銷,硬件的限制不容許人們考慮如何組織數(shù)據(jù)與邏輯,程序本身短小,邏輯簡(jiǎn)單,也無需人們考慮程序設(shè)計(jì)方法問題。隨著大容量存儲(chǔ)器的出現(xiàn)及計(jì)算機(jī)技術(shù)的廣泛應(yīng)用,程序編寫越來越困難,程序的大小以算術(shù)基數(shù)遞增,而程序的邏輯控制難度則以幾何基數(shù)遞增,人們不得不考慮程序設(shè)計(jì)的方法。
最早提出的方法是面向過程的程序設(shè)計(jì)方法,是一種自上而下的設(shè)計(jì)方法,即分析出解決問題所需要的步驟,然后用函數(shù)把這些步驟一步一步實(shí)現(xiàn),使用的時(shí)候一個(gè)一個(gè)依次調(diào)用就可以了。其考慮問題和解決問題的方法是:怎樣做(HOW)→怎樣做(HOW)→怎樣做(HOW)。
面向過程的程序設(shè)計(jì)的優(yōu)點(diǎn)是易于理解和掌握,這種逐步細(xì)化問題的設(shè)計(jì)方法和大多數(shù)人的思維方式比較接近。然而,過程式設(shè)計(jì)對(duì)于比較復(fù)雜的問題,或是在開發(fā)中需求變化比較多的時(shí)候,往往顯得力不從心。這是因?yàn)檫^程式的設(shè)計(jì)是自上而下的,這要求設(shè)計(jì)者在一開始就要對(duì)需要解決的問題有一定的了解。在問題比較復(fù)雜的時(shí)候,要做到這一點(diǎn)會(huì)比較困難,而當(dāng)開發(fā)中需求變化的時(shí)候,以前對(duì)問題的理解也許會(huì)變得不再適用。事實(shí)上,開發(fā)一個(gè)系統(tǒng)的過程往往也是一個(gè)對(duì)系統(tǒng)不斷了解和學(xué)習(xí)的過程,而過程式的設(shè)計(jì)方法忽略了這一點(diǎn)。
3 面向?qū)ο蟮某绦蛟O(shè)計(jì)
隨著信息系統(tǒng)的加速發(fā)展,應(yīng)用程序日趨復(fù)雜化和大型化。傳統(tǒng)的軟件開發(fā)技術(shù)難以滿足發(fā)展的新要求。20世紀(jì)80年代后,面向?qū)ο蟮某绦蛟O(shè)計(jì)技術(shù)日趨成熟并逐漸地為計(jì)算機(jī)界所理解和接受。面向?qū)ο蟮某绦蛟O(shè)計(jì)方法和技術(shù)是目前軟件研究和應(yīng)用開發(fā)中最活躍的一個(gè)領(lǐng)域。
面向?qū)ο笤O(shè)計(jì)自下而上的特性,允許開發(fā)者從問題的局部開始,在開發(fā)過程中逐步加深對(duì)系統(tǒng)的理解。這些新的理解以及開發(fā)中遇到的需求變化,都會(huì)再作用到系統(tǒng)開發(fā)本身,形成一種螺旋式的開發(fā)方式。在面向?qū)ο笤O(shè)計(jì)中,類封裝了數(shù)據(jù),而類的成員函數(shù)作為其對(duì)外的接口,抽象地描述了類。用類將數(shù)據(jù)和操作這些數(shù)據(jù)的函數(shù)放在一起,這可以說就是面向?qū)ο笤O(shè)計(jì)方法的本質(zhì)。
面向?qū)ο笫前褬?gòu)成問題事務(wù)分解成各個(gè)對(duì)象,建立對(duì)象的目的不是為了完成一個(gè)步驟,而是為了描敘某個(gè)事物在整個(gè)解決問題的步驟中的行為。其考慮問題和解決問題的方法是:有誰做(WHO)→誰是誰(WHO)→誰怎么做(HOW)。
可以明顯地看出,面向?qū)ο笫且怨δ軄韯澐謫栴},而不是步驟。如果把過去十年稱為“OO時(shí)代”,相信不會(huì)引起太多的異議。面向?qū)ο蠹夹g(shù)會(huì)如此受到廣泛的重視,主要是面向?qū)ο蟮乃枷虢咏诳陀^世界的實(shí)際和符合人們通常的思維方式從而易于為人們所接受。人們?cè)趥鹘y(tǒng)的OO三要素(封裝性,繼承性,多態(tài)性)的基層上發(fā)展了更多的新技術(shù),借以彌補(bǔ)OO的缺陷,使OO方法和技術(shù)能夠更好地解決軟件開發(fā)中的問題。
然而,OO技術(shù)存在一大局限性就是:它對(duì)軟件職責(zé)的劃分是“垂直”的。在一個(gè)標(biāo)準(zhǔn)的對(duì)象繼承體系中,每一繼承類主要是負(fù)責(zé)軟件系統(tǒng)中一個(gè)特定部分的功能,對(duì)象的行為是在編譯期間被決定的。OO技術(shù)的另一大問題是接口問題。在傳統(tǒng)的OO環(huán)境下,對(duì)象開發(fā)者沒有任何辦法確保使用者按照自己的要求來使用接口。由于OO技術(shù)的這些缺點(diǎn),按照事物發(fā)展的規(guī)律,必然促使新的程序設(shè)計(jì)方法出現(xiàn)來解決這些問題。
4 可配置的程序設(shè)計(jì)
由于面向?qū)ο蟮某绦蛟O(shè)計(jì)存在的局限性,軟件開發(fā)者為了彌補(bǔ)該缺陷,提出了可配置的程序設(shè)計(jì)方法,用一個(gè)配置文件作為程序與外部的接口文件,這樣軟件使用者只需按照自己的要求來修改該接口文件,不需做其他任何更改就可滿足不同的需求。
應(yīng)用程序配置文件是標(biāo)準(zhǔn)的 XML 文件,XML 標(biāo)記和屬性是區(qū)分大小寫的。它是可以按需要更改的,其優(yōu)勢(shì)體現(xiàn)在開發(fā)人員可以使用配置文件來更改設(shè)置,而不必重編譯應(yīng)用程序,使得業(yè)務(wù)邏輯分離出來。管理員可以使用配置文件來設(shè)置策略,以便影響應(yīng)用程序在計(jì)算機(jī)上運(yùn)行的方式。
4.1 應(yīng)用服務(wù)器JBOSS的數(shù)據(jù)源配置文件
<datasources>
<local-tx-datasource>
<jndi-name>jdbc/test</jndi-name>
<connection-url>jdbc:oracle:thin:@127.0.0.1:1521:oradb</connection-url>
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
<user-name>guest</user-name>
<password>guest</password>
<min-pool-size>0</min-pool-size>
<max-pool-size>10</max-pool-size>
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter
</exception-sorter-class-name>
</local-tx-datasource>
</datasources>
上面是JBOSS的一個(gè)數(shù)據(jù)源配置接口文件,存放路徑為:jboss安裝路徑→server→default→deploy→oracle-ds.xml,其連接數(shù)據(jù)庫(kù)類型為ORACLE,其中,定義了一個(gè)名為jdbc/test的數(shù)據(jù)源,其參數(shù)包括JDBC的URL,驅(qū)動(dòng)類名,用戶名及密碼等。直接使用JDBC或者通過JNDI引用數(shù)據(jù)源的編程代碼量相差無幾,但是現(xiàn)在的程序可以不用關(guān)心具體JDBC參數(shù)了。在系統(tǒng)部署后,如果數(shù)據(jù)庫(kù)的相關(guān)參數(shù)變更,只需要重新配置 oracle-ds.xml 修改其中的JDBC參數(shù),只要保證數(shù)據(jù)源的名稱不變,那么程序源代碼就無需修改。由此可見,JNDI避免了程序與數(shù)據(jù)庫(kù)之間的緊耦合,使應(yīng)用更加易于配置、易于部署。
當(dāng)然除了ORACLE數(shù)據(jù)庫(kù)外,JBOSS還可連接其他類型的數(shù)據(jù)庫(kù),比如SQL SERVER2000,用戶只需更換一個(gè)數(shù)據(jù)庫(kù)配置文件即可,無須做其他更改。
4.2 自定義的配置文件
<?xml version=\"1.0\" encoding=\"GB2312\"?>
<config>
<runmode>0</runmode><!-- 運(yùn)行模式:0正常;1測(cè)試;2調(diào)試 -->
<servertype>0</servertype>
<!-- 服務(wù)器類型:0websphere,1weblogic,2jboss,3tomcat -->
<databasetype>1</databasetype><!-- 數(shù)據(jù)庫(kù)類型:0SQL;1Oracle;-->
<datasource>
<connection>
<connection-url>jdbc:oracle:thin:@192.168.10.8:1521:xbfmis</connection-url>
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
<user-name>fmismain</user-name>
<password>fmismain</password
</connection>
</datasource>
<performance>
<check>1</check> <!-- 是否做性能檢查 -->
<warn>1</warn> <!-- 警告0 不做警告1 警告 當(dāng)不滿足性能要求時(shí)是否警告 -->
<exception>0</exception>
<!-- 異常 0 不拋出異常 1 拋出異常 當(dāng)不滿足性能要求時(shí)是否拋出異常 -->
</performance>
</config>
以上是用戶在開發(fā)程序過程中自定義的一個(gè)xml配置文件,其中包含很多用戶自定義的標(biāo)簽,比如用servertype標(biāo)簽可以設(shè)置應(yīng)用服務(wù)器類型,用databasetype標(biāo)簽設(shè)置連接的數(shù)據(jù)庫(kù)類型,用performance標(biāo)簽設(shè)置性能檢查相關(guān)的參數(shù)等等。在外部環(huán)境發(fā)生變化時(shí),用戶只需修改配置文件中相應(yīng)的參數(shù)即可,無須修改代碼,重新編譯程序,大大節(jié)省了人力和物力,增強(qiáng)了程序的可擴(kuò)展性及可重用性,而這點(diǎn)正是軟件工程提出的對(duì)應(yīng)用程序最重要的目標(biāo)。
如今,我們正處于信息時(shí)代,有人將信息時(shí)代形容為:知識(shí)爆炸+知識(shí)共享+即時(shí)通訊+即時(shí)查詢。從海量的信息中查詢到我們所需要的信息,已經(jīng)成為應(yīng)用軟件的一個(gè)重要的必不可少的功能,自定義的配置文件一個(gè)重要的應(yīng)用就是可以實(shí)現(xiàn)通用查詢。通用查詢就是使用統(tǒng)一的查詢描述和通用查詢處理引擎,代替對(duì)不同的查詢應(yīng)用編寫不同的查詢相關(guān)代碼,把大部分需要重復(fù)編寫的部分由通用引擎來處理,通過使用通用模板和引擎,做大部分應(yīng)用開發(fā)時(shí)不需要開發(fā)頁(yè)面,不需要編寫業(yè)務(wù)邏輯,簡(jiǎn)少大量重復(fù)工作,只需要對(duì)具體應(yīng)用做一個(gè)相應(yīng)的配置就行了。
使用基于模板和引擎的開發(fā),產(chǎn)品的質(zhì)量,如性能,可靠性等可以得到集中的控制和優(yōu)化,可以使開發(fā)人員只關(guān)注應(yīng)該關(guān)注的業(yè)務(wù)細(xì)節(jié),從技術(shù)實(shí)現(xiàn)細(xì)節(jié)中解放出來。
配置文件框架如下:
<?xml version=\"1.0\" encoding=\"GB18030\" ?>
<sqldatasource>
<sqltext type=\"\"></sqltext> <!-- 0 SQL語句;1 名稱/值對(duì);3 一個(gè)類名 -->
<displaycolumn></displaycolumn> <!-- 以逗號(hào)分隔的字段名,設(shè)置缺省哪些列顯示 -->
<topcount></topcount> <!-- 是否取前面多少條記錄,如果需要?jiǎng)t記錄相應(yīng)的數(shù)值 -->
<o(jì)rderby></orderby> <!-- 排序字段列表-->
<groupby></groupby> <!-- 分組字段列表-->
<displaytotalrow></displaytotalrow> <!-- 是否顯示合計(jì)行 true 1 -->
<displaytotalcolumn></displaytotalcolumn> <!-- 是否顯示合計(jì)列 true 1 -->
<parameters> <!-- 參數(shù)定義 注意,參數(shù)是完全按照在下面出現(xiàn)的順序確定索引的 -->
<parameter default=\"\" source=\"\" type=\"\" name=\"\" alias=\"參數(shù)別名,如果沒有取name\" operator=\"<>\" dynamic=\"0\" emptyusedefault=\"true\"></parameter>
<!-- default 參數(shù)缺省值; source 參數(shù)的取值來源 [0 常量 1 總線節(jié)點(diǎn) 2 界面組件] ;
type 參數(shù)類型 0 無類型 1 NUMERIC 2 STRING 5 DATETIME ;name 全部使用大寫;
operator 比較關(guān)系操作符; dynamic 0 靜態(tài)參數(shù) 1 動(dòng)態(tài)參數(shù) 需要?jiǎng)討B(tài)形成過濾條件;
emptyusedefault 當(dāng)沒有相應(yīng)的參數(shù)時(shí)是否使用缺省值 -->
</parameters>
<actions> <!-- 查詢事件配置 -->
<action className=\"\"></action>
</actions>
<queryreturn>
<queryreturnfields></queryreturnfields><!-- 返回的值字段 順序返回-->
<queryreturntextfields></queryreturntextfields><!--返回的文本字段 順序返回-->
</queryreturn>
<fadisplayformat> <!-- 方案的顯示結(jié)果方案 -->
<gridset> <!-- 查詢結(jié)果格式信息 查詢表格的分組合計(jì)設(shè)置,列寬度高度等的設(shè)置-->
</gridset>
</fadisplayformat>
</sqldatasource>
使用者只需按照框架的格式要求編寫配置文件,而不需修改代碼,就可以實(shí)現(xiàn)各種各樣的查詢,從而加強(qiáng)了該程序的復(fù)用性。
5 結(jié)束語
可配置的程序設(shè)計(jì)得到了越來越多的軟件開發(fā)者和使用者的青睞,該技術(shù)也不斷地趨于成熟,程序設(shè)計(jì)必將沿著該技術(shù)路線發(fā)展下去。
參考文獻(xiàn):
[1] 石雙元.面向?qū)ο箝_發(fā)方法[M].科學(xué)出版社,2007.
[2] 用例子說明面向?qū)ο蠛兔嫦蜻^程的區(qū)別[EB/OL].[2007-09-20].http://www.soft6.com/tech/9/90898.html.
[3] 陳曉紅.面向過程與面向?qū)ο?-兩種程序設(shè)計(jì)方法的比較與思考[J].計(jì)算機(jī)時(shí)代,2001(11).
[4] XML配置文件的讀取處理[EB/OL].[2007-03-22].http://www.mp3sea.net/Java/2007-3-22/XML-PeiZhiWenJianDeDouQuChuLi-29ir12506.htm.
注:本文中所涉及到的圖表、注解、公式等內(nèi)容請(qǐng)以PDF格式閱讀原文