張名明 許坤 凌旺
摘要
軟件中的數(shù)據(jù)結(jié)構(gòu)常常需要保存到配置文件中,通常的配置文件格式如INI,XML在讀取和保存時(shí)存在對(duì)結(jié)構(gòu)化數(shù)據(jù)支持薄弱,易讀性差等種種問題,為了解決如上問題,通過設(shè)計(jì)一套支持結(jié)構(gòu)化數(shù)據(jù)的配置文件格式,并提供相關(guān)配置文件存取庫實(shí)現(xiàn)原理。新的配置文件格式和相應(yīng)實(shí)現(xiàn)原理提供了對(duì)結(jié)構(gòu)化數(shù)據(jù)針對(duì)性的設(shè)計(jì),減少了不同系統(tǒng)對(duì)配置文件功能的重復(fù)開發(fā),提高了軟件開發(fā)的效率并減小了缺陷率。
【關(guān)鍵詞】結(jié)構(gòu)化 配置文件 INIXML
軟件是由數(shù)據(jù)結(jié)構(gòu)與算法組成,數(shù)據(jù)結(jié)構(gòu)在軟件中是一個(gè)重要的組成部分,它是業(yè)務(wù)邏輯中數(shù)據(jù)的抽象,一個(gè)軟件往往由很多數(shù)據(jù)結(jié)構(gòu)組成,這些數(shù)據(jù)結(jié)構(gòu)承載了軟件業(yè)務(wù)邏輯中方方面面的數(shù)據(jù),包括初始化數(shù)據(jù),運(yùn)行時(shí)數(shù)據(jù),結(jié)果數(shù)據(jù)等。其中初始化數(shù)據(jù)往往存在于配置文件中,通過修改其中的數(shù)據(jù)達(dá)到修改程序行為的目的。通常的實(shí)現(xiàn)思路是軟件利用INI或者XML格式的配置文件,實(shí)現(xiàn)一套解析的方法,并將解析后的數(shù)據(jù)填入初始化數(shù)據(jù)結(jié)構(gòu)中;寫入配置文件也一樣,先將數(shù)據(jù)從初始化數(shù)據(jù)結(jié)構(gòu)中取出,再依照INI或者XML的格式,將數(shù)據(jù)填入配置文件中。目前常用的處理方式存在大量重復(fù)的工作,需要有一種抽象層次更高的配置文件格式,以解決上述問題。
1 傳統(tǒng)配置文件分析
傳統(tǒng)的配置文件格式簡單直觀,技術(shù)較成熟,但也有一些不能避免的缺點(diǎn):INI格式結(jié)構(gòu)單一,只能存儲(chǔ)簡單的鍵值對(duì)類型,缺乏靈活性,技術(shù)陳舊。XML格式結(jié)構(gòu)比較復(fù)雜,沒有結(jié)構(gòu)化的描述,不易于讀寫,額外字符較多,文件體積較大。一般的配置文件讀取流程分為:
(1)準(zhǔn)備配置文件;
(2)解析配置文件;
(3)保存配置項(xiàng)到初始化數(shù)據(jù)結(jié)構(gòu);
(4)使用配置項(xiàng)內(nèi)容,其中解析配置文件功能需要在已有INI或者XML讀寫庫上做二次開發(fā),從前到后將解析到的配置項(xiàng)內(nèi)容保存到內(nèi)部初始化數(shù)據(jù)結(jié)構(gòu)中,供后續(xù)的初始化流程使用。
通常這部分解析讀取流程需要大量重復(fù)的工作量,也容易引入錯(cuò)誤。故考慮設(shè)計(jì)一套抽象層次更高的配置文件格式,提供規(guī)定的語法,能夠滿足結(jié)構(gòu)化數(shù)據(jù)格式的需求,并且具有簡單直接,易讀寫以及占用體積小等優(yōu)點(diǎn)。
2 設(shè)計(jì)與實(shí)現(xiàn)
2.1 配置文件格式分析
考慮到在高級(jí)程序設(shè)計(jì)語言中,結(jié)構(gòu)化的數(shù)據(jù)結(jié)構(gòu)通常是用類或者結(jié)構(gòu)體實(shí)現(xiàn),將一份配置文件設(shè)計(jì)為由一組配置項(xiàng)組成,每個(gè)配置項(xiàng)由配置項(xiàng)名稱與配置項(xiàng)內(nèi)容組成,每個(gè)配置項(xiàng)內(nèi)容可以由下面的任意一項(xiàng)構(gòu)成:
(1)矢量值:整形值,浮點(diǎn)型值,Bool值,字符串。
(2)數(shù)組:由一系列矢量值組成,數(shù)組中的每一項(xiàng)類型必須相同。
(3)組合:一個(gè)配置項(xiàng)的集合。
(4)列表:一系列的配置內(nèi)容組成,包括矢量值,數(shù)組,組合以及列表。
2.2 配置文件格式設(shè)計(jì)
在具體實(shí)現(xiàn)過程中,參考類C語言和Python類腳本語言的編程范式,并考慮到工程實(shí)踐的需求,將以上配置項(xiàng)需求設(shè)計(jì)成以下的格式:
(1)配置項(xiàng)格式,形式如:namevalue;其中name由字符,數(shù)字及下劃線組成,并以字母或下劃線開頭,value必須是a、b、c、d四種配置項(xiàng)內(nèi)容中的一種,
(2)組合配置項(xiàng)格式,形式如:{settings…},組合配置項(xiàng)可以包含任意多個(gè)配置項(xiàng),但每個(gè)配置項(xiàng)名稱必須唯一。
(3)數(shù)組配置項(xiàng),形式如:[value,value…],小數(shù)組配置項(xiàng)可以包含0或n個(gè)元素,每個(gè)元素都必須是類型相同的矢量值。
(4)列表配置項(xiàng),形式如:(value,value一),數(shù)組配置項(xiàng)可以包含0或n個(gè)元素,每個(gè)元素可以a、b、c、d四中配置項(xiàng)內(nèi)容中的一種,且每個(gè)元素類型無需一致。
(5)整形配置項(xiàng),包含兩種類型:1.包含可選前導(dǎo)符(‘+、‘-)的n個(gè)0-9數(shù)字;2.十六進(jìn)制字符,以‘0x作為前綴,接著n個(gè)十六進(jìn)制字符(‘01-‘9,‘A-‘F,‘a(chǎn)-‘f)。
(6)浮點(diǎn)型配置項(xiàng),由n個(gè)數(shù)字和1個(gè)小數(shù)點(diǎn)組成,并包含一個(gè)可選前導(dǎo)符(‘+、‘-),以及一個(gè)可選的指數(shù),指數(shù)由一個(gè)字符(‘e、‘E),一個(gè)可選的符號(hào)字符以及n個(gè)數(shù)字組成。
(7)Bool型配置項(xiàng),由‘true或者‘false組成,或者其他大小寫混合的變種。
(8)字符串型配置項(xiàng),由雙引號(hào)分隔的任意文本組成。文字雙引號(hào)可以通過在它們前面加上反斜杠來轉(zhuǎn)義:\“'。轉(zhuǎn)義序列\\','\f','\n','\r'和'\t'也可被識(shí)別,并具有同C語言中的含義。
(9)注釋,包含三種類型:1.腳本風(fēng)格,以#開頭到行結(jié)尾的字符將作為注釋,2.C語言風(fēng)格,/*到*/之間的字符將作為是注釋,3.C++語言風(fēng)格,以‘//開頭到行結(jié)尾的字符將作為注釋。
通過以上a-i條語法規(guī)范定義的示例配置文件如下所示:
#Example application configuration file
version="1.01";
application=
{
Window{
title="My Application";
size={w=640;h=480;}:
pos={x=350;y=250;}:
};
list=(("abc",123,true),1.234,(/*anempty list*/));
misc={
pi=3.141592654;
int=1234;
columns=["Last Name","FirstName","Mi"];
bitmask=0x1FC3;//hex
};
};
2.3 配置文件存取庫實(shí)現(xiàn)原理
配置文件的語法接近編程語言,故參考一般代碼的編譯方法,簡化后的配置文件存取庫實(shí)現(xiàn)詞法分析和語法分析兩個(gè)步驟。
在特定的編程語言平臺(tái),利用通用的詞法分析和語法分析工具如Flex以及Bison等,通過導(dǎo)入對(duì)應(yīng)的詞法分析和語法分析規(guī)則,可以比較方便地將配置文件一步一步轉(zhuǎn)換成配置項(xiàng)集合,配置項(xiàng)集合一般可以考慮通過各種編程語言通常會(huì)提供的Map結(jié)構(gòu)來實(shí)現(xiàn),并額外增加配置項(xiàng)查詢,增加,修改和刪除方法,即可實(shí)現(xiàn)一套特定編程語言平臺(tái)的通用配置文件存取庫。
3 結(jié)語
經(jīng)過對(duì)配置文件結(jié)構(gòu)化需求的分析,改進(jìn)后的配置文件格式具備較完善的結(jié)構(gòu)化特性,更接近程序語言,方便機(jī)器和人讀寫,彌補(bǔ)了舊式配置文件在存儲(chǔ)結(jié)構(gòu)化數(shù)據(jù)時(shí)的不足,并且因?yàn)榕渲梦募袷街欢x了數(shù)值,不存在計(jì)算表達(dá)式,所以也不會(huì)有代碼注入等安全隱患。通過提供一份配置文件存取庫實(shí)現(xiàn)原理,使得軟件開發(fā)者只需要按照原理設(shè)計(jì)實(shí)現(xiàn)一套對(duì)應(yīng)語言的配置庫模塊,就可以獲得結(jié)構(gòu)化配置方面所有的功能,并且該配置庫可以重復(fù)使用,減少了配置功能方面重復(fù)的工作量,提高了軟件開發(fā)的效率,也減少了缺陷率。
參考文獻(xiàn)
[1]周霞,彭文惠.XML技術(shù)與應(yīng)用教程[M].北京:電子工業(yè)出版社,2015.
[2]劉艷春,洪曉慧.Struts2框架核心配置文件的研究與應(yīng)用[J].計(jì)算機(jī)技術(shù)與發(fā)展,2013(02).
[3]滕海坤,劉心聲,李倫彬.嵌入式Java編譯器的研究與設(shè)計(jì)[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2018(04).