穆仕華 陳月英
(1.貴州省科技信息中心,貴州貴陽 550002;2.貴州省信息技術(shù)創(chuàng)新服務(wù)中心,貴州貴陽 550002)
基于三層架構(gòu)的映射方法研究
穆仕華1陳月英2
(1.貴州省科技信息中心,貴州貴陽550002;2.貴州省信息技術(shù)創(chuàng)新服務(wù)中心,貴州貴陽550002)
傳統(tǒng)的三層架具有層次清晰、任務(wù)明確的特點(diǎn),但軟件的設(shè)計(jì)和編碼也涉及到三個(gè)層次,不同層次涉及到不同的開發(fā)語言、工具和方法,使得軟件的設(shè)計(jì)、編碼、測(cè)試和維護(hù)困難,軟件開發(fā)效率和質(zhì)量難以保障。本文通過對(duì)三層架構(gòu)映射模型的建立,采用規(guī)則引擎、組件引擎、代碼生成技術(shù)和組件解析技術(shù)實(shí)現(xiàn)了一層到三層的映射,在保留三層架構(gòu)優(yōu)點(diǎn)的基礎(chǔ)上,簡(jiǎn)化了軟件設(shè)計(jì)和開發(fā)的難度,提高了軟件開發(fā)的效率和質(zhì)量。
三層架構(gòu)映射方法組件引擎規(guī)則引擎代碼生成
三層架構(gòu)是指在客戶端瀏覽器與后臺(tái)數(shù)據(jù)庫間加入了一個(gè)可稱為組件層的中間層。組件層分為業(yè)務(wù)邏輯層BLL、數(shù)據(jù)訪問層DAL、數(shù)據(jù)對(duì)象模型層Model[1]。三層架構(gòu)的優(yōu)點(diǎn)是層次清晰,提高了系統(tǒng)設(shè)計(jì)的靈活性、可擴(kuò)展性和可維護(hù)性。但是,從三層架構(gòu)的各層來看,具有涉及的開發(fā)語言多、開發(fā)工具多的特點(diǎn):(1)表示層的設(shè)計(jì)復(fù)雜。在表示層,需要對(duì)用戶界面進(jìn)行設(shè)計(jì),界面是實(shí)現(xiàn)人機(jī)友好交互的接口,界面的友好性對(duì)用戶體驗(yàn)有直接影響[2]。WEB表示層的設(shè)計(jì)涉及頁面布局、圖片處理、人機(jī)會(huì)話等技術(shù),這些技術(shù)需要多種工具和語言來完成,如Photoshop、html、div、js等,不同內(nèi)核的瀏覽器在表示層存在較大的兼容性問題,導(dǎo)致同樣的界面在不同瀏覽器中的表現(xiàn)形式不一致,甚至部分功能失效。(2)業(yè)務(wù)邏輯層的實(shí)現(xiàn)復(fù)雜。在業(yè)務(wù)邏輯層,通過對(duì)業(yè)務(wù)邏輯的封裝,對(duì)表示層進(jìn)行隱藏實(shí)現(xiàn),表示層通過調(diào)用業(yè)務(wù)邏輯層的接口來實(shí)現(xiàn)各種操作。業(yè)務(wù)邏輯層是表示層和數(shù)據(jù)訪問層的紐帶,需要處理各種復(fù)雜的算法實(shí)現(xiàn)問題。實(shí)現(xiàn)業(yè)務(wù)邏輯層的語言有VB、C#、JAVA等,不同語言的開發(fā)環(huán)境、語法格式、基礎(chǔ)類庫等差異較大,開發(fā)過程中需要進(jìn)行大量的編碼工作。(3)數(shù)據(jù)訪問層的差異較大。在數(shù)據(jù)訪問層,需要解決不同數(shù)據(jù)庫的存取問題,不同類型的數(shù)據(jù)庫在連接方法、數(shù)據(jù)類型、SQL查詢語句、存儲(chǔ)過程、用戶自定義函數(shù)的語法格式方面存在差異,這些差異需要技術(shù)人員在開始過程中查閱相關(guān)的幫助文檔才能解決,消耗了大量的時(shí)間和精力。
1.1MVC
MVC在開發(fā)復(fù)雜的大型網(wǎng)站時(shí),能將不同的功能作切割,提高程序代碼的可讀性,以及組件的可重用性。MVC縱向切割了開發(fā)過程中的代碼,從服務(wù)器到瀏覽器層層分離。層次之間耦合度很低。但MVC無法封裝,所以無法被重用[3]。
1.2MVP
MVP演變自MVC,通過表示器將視圖與模型巧妙地分開。在該模式中,視圖通常由表示器初始化,它呈現(xiàn)用戶界面(UI)并接受用戶所發(fā)出命令,但不對(duì)用戶的輸入作任何邏輯處理,而僅僅是將用戶輸入轉(zhuǎn)發(fā)給表示器[4]。
1.3WPF
WPF涵蓋了桌面應(yīng)用程序開發(fā)、網(wǎng)絡(luò)應(yīng)用程序開發(fā)和移動(dòng)應(yīng)用程序開發(fā),是微軟開發(fā)技術(shù)未來十年的主要方向。WPF基于DirectX底層接口,帶來優(yōu)秀的圖形向量渲染引擎,因此相對(duì)于上一代GDI/ GDI+編程模型有了質(zhì)的飛躍,可以輕松實(shí)現(xiàn)2D/3D絢麗效果,比如半透明、圖形翻轉(zhuǎn)、平移、縮放等[5]。
通過對(duì)三層架構(gòu)常見模式的優(yōu)缺點(diǎn)進(jìn)行比較,提出三層架構(gòu)的映射模型,如圖1所示。
2.1偽碼文檔
偽碼文檔是一個(gè)二維表結(jié)構(gòu),其行列結(jié)構(gòu)可通過代碼生成器的算法轉(zhuǎn)化為HTML代碼。在偽碼文檔的單元格中,通過規(guī)則表達(dá)式描述各單元格中的組件類型、組件屬性以及組件的數(shù)據(jù)接口。按照組件引擎和規(guī)則引擎的約定,在偽碼文檔中還可描述數(shù)據(jù)庫的表結(jié)構(gòu)、表間關(guān)系、業(yè)務(wù)流程及用戶權(quán)限。
2.2組件引擎
組件引擎是由表單、數(shù)據(jù)列表、報(bào)表、業(yè)務(wù)流程、圖文、視頻等具有通用性的組件組成的組件庫,其底層實(shí)現(xiàn)細(xì)節(jié)通過JAVA、C#等支持面向?qū)ο蟮腤EB開發(fā)語言實(shí)現(xiàn)。組件引擎除包含常見的組件外,還可根據(jù)其提供的標(biāo)準(zhǔn)和統(tǒng)一接口進(jìn)行組件擴(kuò)展,組件的標(biāo)準(zhǔn)接口包括組件ID、組件類型、數(shù)據(jù)庫類型、可編程性數(shù)據(jù)接口、界面描述、外部文件引入路徑,在此基礎(chǔ)上,可擴(kuò)展新加入組件的其他屬性。
2.3規(guī)則引擎
2.3.1表結(jié)構(gòu)描述規(guī)則
(1)表結(jié)構(gòu)描述規(guī)則。關(guān)系數(shù)據(jù)庫的表結(jié)構(gòu)通過“TableName={字類名$字段類型$字段長(zhǎng)度$驗(yàn)證方式$字段說明}”的方式進(jìn)行描述,字段的驗(yàn)證方式是指對(duì)字段對(duì)應(yīng)的控件在接收用戶輸入的數(shù)據(jù)時(shí)進(jìn)行的有效性驗(yàn)證,常見的驗(yàn)證方式包括身份證號(hào)、電話、郵編、電子郵箱、整數(shù)、小數(shù)、日期、時(shí)間等,用其對(duì)應(yīng)的英文名作為偽碼描述。
(2)表間關(guān)系描述規(guī)則。表單關(guān)系包括1對(duì)1,1對(duì)多和多對(duì)多關(guān)系,通過規(guī)則表達(dá)式“{表x->字段1orn=表y->字段1orn}”進(jìn)行描述。若同一表與多表之間存在關(guān)系,則可通過編寫多個(gè)表間關(guān)系表達(dá)式進(jìn)行描述。
2.3.2組件描述規(guī)則
組件描述通過規(guī)則表達(dá)式“Component=組件ID$組件類型$屬性集合”進(jìn)行描述,屬性集合以“{屬性ID=屬性值},{屬性ID=屬性值}”的方式描述組件的多個(gè)屬性。
由于組件在實(shí)現(xiàn)業(yè)務(wù)功能時(shí)可能需要引入一些外部文件作為支撐,因此,對(duì)于文件的引入規(guī)則采用“<FileType=文件類型Path=文件路徑”進(jìn)行描述。文件類型JS、CSS、Image三種。
2.3.3參數(shù)描述規(guī)則
圖1 三層架構(gòu)映射模型
圖2 代碼生成器的工作流程
在規(guī)則引擎中還需制定各種參數(shù)的傳遞和接收方法,WEB應(yīng)用中的參數(shù)傳遞方式主要包括Post、Get,Session和Cookie三種,對(duì)于Post和Get,其偽碼表達(dá)式為“參數(shù)變量=request.參數(shù)名”,Session和Cookie則分別為“參數(shù)變量=Cookie.參數(shù)名”和“參數(shù)變量=Session.參數(shù)名”。
2.4代碼生成器
代碼生成器的作用是將偽碼文檔轉(zhuǎn)換成組件的XML配置文檔及相關(guān)的文件。代碼生成器的工作流程為導(dǎo)入偽碼文檔,對(duì)偽碼文檔的類型進(jìn)行判斷,若偽碼文檔為表結(jié)構(gòu)偽碼,則通過SQL代碼生成器生成特定關(guān)系數(shù)據(jù)庫的SQL建表腳本和用于實(shí)現(xiàn)數(shù)據(jù)增加、刪除和修改的腳本。若偽碼文檔是組件結(jié)構(gòu),則根據(jù)組件的結(jié)構(gòu)生成HTML、CSS、JS文件和組件的XML配置文檔。代碼生成器的工作流程如圖2所示。
2.5組件解析器
組件解析器的作用是將組件的XML文檔轉(zhuǎn)換成WEB應(yīng)用程序。組件解析器的工作流程是對(duì)代碼生成器生成的XML文檔進(jìn)行加載,并根據(jù)組件的參數(shù)描述從外部獲取session、post等方式傳遞的參數(shù),與此同時(shí),調(diào)用一個(gè)通用數(shù)據(jù)接口獲取關(guān)系數(shù)據(jù)庫中的數(shù)據(jù)并創(chuàng)建組件,組件創(chuàng)建完畢后,根據(jù)組件的HTML界面布局呈現(xiàn)組件。
映射模型實(shí)現(xiàn)的關(guān)鍵是通過各種算法對(duì)偽碼文檔進(jìn)行解析,以生成組件的XML配置文檔,而組件的XML配置文檔中包含了組件的屬性描述、界面描述、數(shù)據(jù)接口描述,XML配置文檔是組件解析器將其轉(zhuǎn)換為WEB應(yīng)用的基礎(chǔ),因此映射模型需要對(duì)代碼生成算法和組件解析算法進(jìn)行實(shí)現(xiàn)。
3.1代碼生成算法
三層架構(gòu)映射模型的關(guān)鍵是實(shí)現(xiàn)HTML、JS、XML和SQL的代碼生成,各種代碼的生成原理和方法差異較大。
3.1.1HTML生成算法
HTML生成算法根據(jù)偽碼文檔描述的二維表結(jié)構(gòu)生成WEB應(yīng)用程序的界面布局,其算法的關(guān)鍵步驟如下:
(1)遍歷二維表的所有行和列,開始遍歷前生成“<table>”標(biāo)簽;(2)讀取每一個(gè)單元格式的值,如果不為空,產(chǎn)生一個(gè)“<td><td>”標(biāo)識(shí),如果為空,并入其左側(cè)的單元格;(3)如果某一單元格的下方存在空單元格,則將其合并;(4)所有單元格遍歷結(jié)束生成“</table>”標(biāo)簽。
3.1.2JS生成算法
JS代碼用于實(shí)現(xiàn)數(shù)據(jù)的驗(yàn)證、在前端實(shí)現(xiàn)計(jì)算等,其代碼生成算法的關(guān)鍵步驟如下:(1)根據(jù)組件的描述規(guī)則引入JS文件;2)如果組件涉及函數(shù)庫的調(diào)用,則將調(diào)用函數(shù)庫所需的相關(guān)參數(shù)轉(zhuǎn)換為接收到的實(shí)際參數(shù);(3)對(duì)于表單組件,若發(fā)現(xiàn)算法運(yùn)算或邏輯運(yùn)算表達(dá)式,則采用二叉樹的遍歷算法遍歷整個(gè)表達(dá)式,以獲取表達(dá)式中的控件ID,同時(shí)調(diào)用JQuery函數(shù)庫中的組件選擇器獲取特定控件的值,并將整個(gè)表達(dá)式轉(zhuǎn)換為條件表達(dá)式,以實(shí)現(xiàn)對(duì)表單中相關(guān)數(shù)據(jù)的驗(yàn)證。
3.1.3XML生成算法
XML生成算法將偽碼文檔的整體結(jié)構(gòu)生成一個(gè)XML文檔,并將偽碼文檔中描述的組件作為XML文檔的子節(jié)點(diǎn)。XML生成算法的關(guān)鍵步驟如下:(1)遍歷二維表的所有行和列,開始遍歷前生成“<Page>”根節(jié)點(diǎn);(2)讀取每一個(gè)單元格式的值,如果找到Component標(biāo)識(shí),則獲取組件的類型,根據(jù)組件的結(jié)構(gòu)為偽碼文檔的描述生成組件和XML描述文檔,同時(shí)作為“<Page>”根節(jié)點(diǎn)的子節(jié)點(diǎn);(3)遍歷完成后,生成”</Page>”結(jié)束標(biāo)簽。
3.1.4SQL生成算法
SQL生成算法將偽碼文檔中描述數(shù)據(jù)庫表結(jié)構(gòu)的偽碼生成為數(shù)據(jù)庫的建表腳本,同時(shí)根據(jù)偽碼文檔中描述的組件接口的需要,生成相應(yīng)的數(shù)據(jù)處理腳本,其關(guān)鍵的代碼生成步驟如下:(1)遍歷二維表的所有行和列,若發(fā)現(xiàn)“TableName”標(biāo)簽,則說明是一個(gè)數(shù)據(jù)為表結(jié)構(gòu)相關(guān)的偽碼描述;(2)獲取每一個(gè)單元格的值,拆分偽碼表達(dá)式以獲取字段名、字段類型、長(zhǎng)度和備注信息,存入數(shù)組;(3)遍歷結(jié)束后,判斷當(dāng)前選用的關(guān)鍵數(shù)據(jù)庫類型,調(diào)用特定關(guān)系數(shù)據(jù)庫的建表方法生成數(shù)據(jù)庫表結(jié)構(gòu);(4)遍歷描述組件的偽碼文檔,根據(jù)組件的數(shù)據(jù)接口需求生成特定的數(shù)據(jù)處理腳本。
3.2組件解析算法
組件解析算法根據(jù)組件的XML文檔生成WEB應(yīng)用程序,組件解析算法以組件的XML文檔為基礎(chǔ),從XML文檔的根節(jié)點(diǎn)開始對(duì)整個(gè)XML文檔進(jìn)行遍歷,當(dāng)讀取到組件類型標(biāo)簽時(shí),首先創(chuàng)建一個(gè)組件實(shí)例,同時(shí)從XML文檔獲取組件的其他參數(shù)對(duì)組件實(shí)例的接口進(jìn)行配置。單個(gè)組件創(chuàng)建完成后,根據(jù)XML文檔中提供的界面布局對(duì)各組件進(jìn)行呈現(xiàn)。組件呈現(xiàn)時(shí),如果需獲取相關(guān)參數(shù)、設(shè)置組件的初始值,則根據(jù)規(guī)則表達(dá)式對(duì)參數(shù)進(jìn)行解析,通過通用的數(shù)據(jù)接口獲取組件的數(shù)據(jù)源,調(diào)用其數(shù)據(jù)接口代碼獲取數(shù)據(jù)源中的數(shù)據(jù),并綁定到組件中。
基于三層架構(gòu)的映射技術(shù)在建立三層架構(gòu)映射技術(shù)的基礎(chǔ)上,以組件引擎為基礎(chǔ),通過自定義的規(guī)則表達(dá)式對(duì)組件進(jìn)行描述,形成偽碼文檔,實(shí)現(xiàn)了界面層、業(yè)務(wù)邏輯層和數(shù)據(jù)訪問層的設(shè)計(jì)通過一個(gè)文檔完成。在構(gòu)建偽碼文檔的基礎(chǔ)上,通過代碼生成器將偽碼文檔轉(zhuǎn)化為組件的XML配置文檔,組件解析器將XML配置文檔轉(zhuǎn)換成WEB應(yīng)用程序,從實(shí)現(xiàn)了通過XML代碼文檔向三層代碼的映射關(guān)系,簡(jiǎn)化了軟件設(shè)計(jì)的過程,改變了WEB應(yīng)用軟件代碼編寫的方式,從而提高了軟件的開發(fā)效率和質(zhì)量。
[1]張士敏.ASP.NET的三層架構(gòu)與實(shí)現(xiàn)[J].硅谷,2013,(第4期).
[2]HOU Yan'e,DANG Lanxue,WEI Dan.Design and implementation of web user interface automatic generation tool[J].Journal of Henan University(Natural Science),2011,41(6):641-644.
[3]張志剛.基于ASP.NET MVC框架的研究[J].計(jì)算機(jī)光盤軟件與應(yīng)用,2014,(第18期).
[4]王念橋.應(yīng)用MVP模式改進(jìn)軟件架構(gòu)[J].計(jì)算機(jī)時(shí)代,2012,(第4期).
[5]王嬋娟.淺談WPF架構(gòu)及其應(yīng)用[J].科技信息,2011,(第21期).