肖文輝,劉洪星
(武漢理工大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,湖北 武漢 430063)
模型驅(qū)動架構(gòu)(model driven architecture,MDA)是由對象管理組織(object management group,OMG)提出的[1]。MDA 將信息系統(tǒng)抽象成計(jì)算無關(guān)模型(CIM)、平臺無關(guān)模型(PIM)和平臺相關(guān)模型(PSM)3個層次。
在傳統(tǒng)的軟件開發(fā)流程中通常會經(jīng)歷需求分析、概要設(shè)計(jì)、詳細(xì)設(shè)計(jì)、編碼和測試等階段,如圖1所示。系統(tǒng)的模型和文檔主要在設(shè)計(jì)階段被創(chuàng)建,之后隨著編碼工作的開始,模型與代碼之間可能會出現(xiàn)不同步的問題[2]。
圖1 傳統(tǒng)的開發(fā)流程
不同于傳統(tǒng)的開發(fā)流程,MDA由系統(tǒng)的建模行為驅(qū)動,模型(而不是代碼)在系統(tǒng)開發(fā)流程中處于核心地位[3],如圖2所示。在MDA的開發(fā)流程中,由PIM完成分析設(shè)計(jì)工作,而與具體的平臺和實(shí)現(xiàn)技術(shù)相關(guān)的PSM以及代碼,則可借助第三方轉(zhuǎn)換工具來完成。
圖2 MDA的開發(fā)流程
實(shí)體數(shù)據(jù)模型(entity data model,EDM)是微軟實(shí)體框架(ADO.NET entity framework)的核心,它基于實(shí)體關(guān)系(ER)模型。EDM是一種構(gòu)建在ER模型之上的概念模型。EDM由CSDL(conceptual schema definition language),SSDL(stores schema define language),MSL(mapping schema language)3個部分組成,分別描述應(yīng)用程序業(yè)務(wù)層的實(shí)體和關(guān)系、邏輯模型的結(jié)構(gòu)、概念模型與邏輯模型之間的映射[4]。
在實(shí)體框架中,EDM處于一個包含中間件映射引擎的運(yùn)行環(huán)境中,該環(huán)境支持EDM與關(guān)系數(shù)據(jù)模型(RDM)之間的雙向映射。開發(fā)人員可以使用語言集成查詢 LINQ[5](language integrated query)或一種新的數(shù)據(jù)操作語言Entity SQL來操作EDM實(shí)例[6]。通過面向?qū)ο蟮姆绞綄?shù)據(jù)進(jìn)行操作,傳入的參數(shù)和得到的返回結(jié)果都是封裝好的對象,而不是單獨(dú)的字段值或一條一條的表記錄。另外,數(shù)據(jù)操作代碼和編程語言能較好地集成在一起,在代碼執(zhí)行之前,Visual Studio就可以檢測數(shù)據(jù)操作代碼在語法以及對象間的引用上是否存在錯誤。
EDM給概念模型帶來了新的生命力。開發(fā)人員能夠編寫代碼來操作EDM,然后依靠實(shí)體框架提供的工具將這些操作映射到特定的邏輯模型。這樣可以將應(yīng)用程序從關(guān)聯(lián)特定的邏輯模型中解放出來[7],即使跨越多個數(shù)據(jù)引擎,應(yīng)用程序也能工作在一個穩(wěn)定的概念模型之上。
在微軟的集成開發(fā)環(huán)境Visual Studio 2010中,其 ADO.NET Entity Framework不僅支持從EDM到RDM的雙向轉(zhuǎn)換,而且也支持EDM到OOM(C#代碼)的轉(zhuǎn)換。而MDA的核心問題正是模型轉(zhuǎn)換問題[8],因此,Visual Studio為實(shí)現(xiàn)基于MDA的開發(fā)方式提供了可行性。
Visual Studio所支持的針對EDM進(jìn)行開發(fā)的流程如圖3所示,經(jīng)過需求分析和設(shè)計(jì)得到系統(tǒng)的RDM,然后使用工具將 RDM轉(zhuǎn)換為 EDM。EDM作為一種關(guān)系對象映射(ORM),為上面的應(yīng)用程序提供以面向?qū)ο蟮姆绞竭M(jìn)行數(shù)據(jù)訪問的API,開發(fā)人員直接對EDM進(jìn)行編程,對EDM實(shí)例的操作將由EDM到RDM之間的映射規(guī)則自動更新到底層的RDM實(shí)例。
圖3 現(xiàn)有的開發(fā)方式
運(yùn)用現(xiàn)有的開發(fā)方式,開發(fā)人員不必關(guān)心底層數(shù)據(jù)庫的訪問細(xì)節(jié),提升了軟件開發(fā)的效率,但這種開發(fā)方式并沒有充分發(fā)揮EDM作為“可執(zhí)行的概念模型”的作用,其原因如下:
(1)EDM作為概念模型,其建模功能并沒有體現(xiàn)出來,EDM只是作為一種ORM為應(yīng)用程序提供數(shù)據(jù)訪問服務(wù),并不是一種類似于UML的可用來進(jìn)行系統(tǒng)建模的工具。
(2)這種開發(fā)方式首先得到的是RDM,然后再通過轉(zhuǎn)換得到EDM,這使系統(tǒng)開發(fā)之初就依賴于具體的邏輯模型。
(3)對于新出現(xiàn)的需求或變更,針對RDM而不是EDM進(jìn)行修改,則依然需要開發(fā)人員考慮與平臺相關(guān)的細(xì)節(jié)。
基于MDA的思想,筆者提出一種在Visual Studio中針對EDM進(jìn)行開發(fā)的新方式,如圖4所示。經(jīng)過需求分析,直接使用EDM進(jìn)行系統(tǒng)分析和建模。之后借助轉(zhuǎn)換工具將概念模型EDM轉(zhuǎn)換為平臺相關(guān)模型(如RDM)。應(yīng)用程序直接工作在EDM上,其對數(shù)據(jù)的操作將由轉(zhuǎn)換工具映射到底層的關(guān)系數(shù)據(jù)庫中。
圖4 基于MDA的開發(fā)方式
EDM作為一種平臺無關(guān)的概念模型,更貼近于系統(tǒng)的問題域,它能比RDM等平臺相關(guān)模型更準(zhǔn)確地描述系統(tǒng)需求。這樣,軟件開發(fā)人員可以站在更高的抽象層次上分析和解決問題,更多地關(guān)注于系統(tǒng)的業(yè)務(wù)領(lǐng)域[9],而不是具體的實(shí)現(xiàn)技術(shù)和平臺。
在傳統(tǒng)的軟件開發(fā)流程中,需要在系統(tǒng)開發(fā)的不同時期建立不同的模型與文檔,這些模型和文檔是對同一問題的多次描述,會帶來重復(fù)勞動。當(dāng)系統(tǒng)結(jié)構(gòu)發(fā)生變化時,手動維護(hù)這些模型與文檔之間版本的同步,需要付出大量的時間。但這種基于MDA的開發(fā)方式,只需要建立EDM這一種概念模型,相應(yīng)的平臺相關(guān)模型和文檔可借助轉(zhuǎn)換工具去完成。EDM在系統(tǒng)開發(fā)生命周期中處于核心地位,系統(tǒng)開發(fā)的起點(diǎn)不是建立RDM或編寫代碼,而是設(shè)計(jì) EDM 概念模型[10-11]。若系統(tǒng)結(jié)構(gòu)發(fā)生變化,只需在概念模型EDM上進(jìn)行修改,其他模型的更新和同步可借助相應(yīng)的模型轉(zhuǎn)換工具來進(jìn)行。
在基于MDA的開發(fā)方式中,EDM不僅是進(jìn)行概念建模的工具,而且貫穿于整個開發(fā)的始終,增強(qiáng)了概念模型的作用,是對MDA架構(gòu)更完整的實(shí)現(xiàn)。這種開發(fā)方式的優(yōu)點(diǎn)有:
(1)在系統(tǒng)設(shè)計(jì)之初,EDM作為一種概念建模工具進(jìn)行系統(tǒng)設(shè)計(jì)。在系統(tǒng)實(shí)現(xiàn)階段,EDM作為一種ORM為應(yīng)用程序提供數(shù)據(jù)訪問,使整個開發(fā)過程的環(huán)境得到統(tǒng)一。
(2)在整個開發(fā)過程中,開發(fā)人員始終面對的是EDM,不用過多地考慮底層具體的實(shí)現(xiàn)技術(shù)和平臺,只需專注于業(yè)務(wù)邏輯的實(shí)現(xiàn),EDM到OOM、RDM之間的轉(zhuǎn)換可借助工具完成。這樣,EDM簡化了系統(tǒng)的開發(fā),也增強(qiáng)了系統(tǒng)在不同平臺下的可移植性。
(3)對系統(tǒng)結(jié)構(gòu)的更改不再是針對代碼,而是直接在EDM上進(jìn)行,借助轉(zhuǎn)換工具來維護(hù)EDM到RDM和代碼之間的同步,避免由系統(tǒng)重構(gòu)帶來的混亂,減少重復(fù)勞動,提高系統(tǒng)的可維護(hù)性。
(4)系統(tǒng)設(shè)計(jì)階段得到的EDM,可復(fù)用到相近領(lǐng)域,在更高的層次上增強(qiáng)了系統(tǒng)的可重用性。
筆者以一個網(wǎng)上銷售系統(tǒng)為例來演示這種基于MDA的開發(fā)流程。通過與傳統(tǒng)的ADO.NET的數(shù)據(jù)訪問方式進(jìn)行對比,體現(xiàn)使用EDM進(jìn)行開發(fā)的優(yōu)勢,并以一次系統(tǒng)重構(gòu)來說明使用基于MDA的EDM開發(fā)所帶來的靈活性。
在系統(tǒng)設(shè)計(jì)階段,通過需求分析,獲取業(yè)務(wù)流程和規(guī)則,通過對業(yè)務(wù)規(guī)則的分析,抽取出相關(guān)的核心實(shí)體。然后在Visual studio中建立EDM模型,如圖5所示,抽取出4個實(shí)體:顧客、訂單、訂單項(xiàng)和商品,實(shí)體之間的關(guān)系有一對一,一對多。
圖5 網(wǎng)上銷售系統(tǒng)EDM模型
利用Visual Studio中提供的功能將EDM轉(zhuǎn)換為SQL語句并生成RDM。在轉(zhuǎn)換過程中,Visual Studio根據(jù)EDM與SQL Server數(shù)據(jù)庫之間的映射規(guī)則,將EDM中的實(shí)體轉(zhuǎn)換為數(shù)據(jù)庫中的表,將EDM實(shí)體間的關(guān)系轉(zhuǎn)換為數(shù)據(jù)庫表之間的關(guān)系,并自動建立主碼、外碼。在數(shù)據(jù)庫中生成如圖6所示的RDM。
在系統(tǒng)的實(shí)現(xiàn)階段,相對于傳統(tǒng)的ADO.NET的數(shù)據(jù)訪問方式,使用EDM之后所需的代碼量將大大減少。一方面,實(shí)體框架會自動生成與EDM實(shí)體對應(yīng)的實(shí)體類,該實(shí)體類的結(jié)構(gòu)由實(shí)體框架自動維護(hù),并與EDM實(shí)體保持同步,對EDM結(jié)構(gòu)的更改可以立即在實(shí)體類代碼中得到更新。另一方面,EDM屏蔽了底層的數(shù)據(jù)訪問細(xì)節(jié),省去了傳統(tǒng)訪問方式中連接數(shù)據(jù)庫、打開連接、數(shù)據(jù)訪問和關(guān)閉連接等繁瑣且重復(fù)的操作。
圖6 網(wǎng)上銷售系統(tǒng)RDM
在實(shí)體框架中,每個EDM對應(yīng)于一個對象上下文(ObjectContext),它是所有實(shí)體對象的容器,對所有實(shí)體對象的生命周期進(jìn)行管理,自動記錄當(dāng)前正在使用的實(shí)體對象的狀態(tài),并在最后提交時將對象持久化到數(shù)據(jù)庫中。ObjectContext為應(yīng)用程序提供了訪問實(shí)體對象的接口,因此,對數(shù)據(jù)進(jìn)行的各種操作都是面向?qū)ο蟮?,解決了阻抗不匹配的問題。
例如,下面的數(shù)據(jù)訪問代碼段,統(tǒng)計(jì)某個顧客的消費(fèi)總額。只需將Customer對象作為參數(shù)輸入,使用對象間的關(guān)系來進(jìn)行查詢和統(tǒng)計(jì)。之后,ObjectContext會自動將相應(yīng)的操作映射到底層數(shù)據(jù)庫中。
若使用傳統(tǒng)的ADO.NET的方式來實(shí)現(xiàn),則需要使用如下的SQL語句,進(jìn)行三層嵌套查詢,編寫類似的代碼,要求開發(fā)人員非常熟悉SQL語法,且在程序代碼中無法對SQL語句進(jìn)行語法和語義上的檢測,編寫起來容易出錯,不便于測試,效率比較低。
如果在系統(tǒng)開發(fā)完成后,出現(xiàn)一個新的需求,如為了吸引顧客,系統(tǒng)對VIP貴客實(shí)行打折優(yōu)惠,需要在原有顧客的基礎(chǔ)上建立一批VIP顧客。使用基于MDA的開發(fā)方式,可直接在EDM上對概念模型進(jìn)行重構(gòu)。通過對新需求的分析,在原有的EDM中添加一個新的繼承自Customer實(shí)體的VIPCustomer實(shí)體,如圖7所示。在修改EDM后,將EDM轉(zhuǎn)換為新的RDM(目前,Visual Studio還不支持EDM到RDM的自動實(shí)時更新,需要先導(dǎo)出為SQL然后在數(shù)據(jù)庫里執(zhí)行得到新的RDM)。對于EDM上原有的C#程序代碼,ObjectContext會自動添加VIPCutomer實(shí)體類,這些更新不會影響原有的程序代碼。在程序中可直接操作ObjectContext中的VIPCutomer對象,不必關(guān)心底層數(shù)據(jù)庫的結(jié)構(gòu)發(fā)生的變化。
圖7 系統(tǒng)重構(gòu)之后的網(wǎng)上銷售系統(tǒng)EDM
若使用原有的開發(fā)方式,則需要在數(shù)據(jù)庫里添加額外的字段或者增加一個新的表來記錄VIP顧客的信息,由于RDM中不支持繼承的概念,因此它沒有EDM對這一需求描述得直觀和清晰。更改數(shù)據(jù)庫表結(jié)構(gòu)需要開發(fā)人員熟悉關(guān)系數(shù)據(jù)庫的操作和關(guān)系模式的設(shè)計(jì),并且更改底層的數(shù)據(jù)庫結(jié)構(gòu)可能會引起上面應(yīng)用程序的變化,這將增加系統(tǒng)重構(gòu)的工作量。
基于MDA的開發(fā)方式使軟件開發(fā)的抽象級別進(jìn)一步得到了提高。筆者提出了一種基于MDA的開發(fā)方式,使EDM處于系統(tǒng)開發(fā)的核心地位,并貫穿于整個開發(fā)周期。這樣,EDM作為概念模型的作用得到了增強(qiáng),能更好地支持MDA,并豐富了EDM的使用方式。
[1] Object Management Group.MDA guide version 1.0.1[DB/OL].[2011 -09 -21].http://www.omg.org/cgi-bin/doc?omg/03-06-01.pdf.
[2] ANNEKE G K,JOS W,WIM B.The model driven architecture:practice and promise[M].[S.l.]:Addison Wesley,2003:133 - 141.
[3] DAVID S F.Model driven architecture - applying MDA to enterprise computing[M].[S.l.]:Wiley Publishing Inc,2003:43 -51.
[4] Microsoft.Entity framework overview[DB/OL].[2011-09 - 21].http://msdn.microsoft.com/en - us/library/bb399567(v=VS.100).aspx.
[5] ROGER J.Professional ADO.NET 3.5 with LINQ and the entity framework[M].[S.l.]:Wiley Publishing,2009:24-29.
[6] ADYA A,BLAKELEY J A,MELNIK S.Anatomy of the ADO.NET entity framework[C]//ACM SIGMOD.[S.l.]:[s.n.],2007:877 -888.
[7] JOSE A B,MURALIDHAR S.The ADO.NET entity+framework:making the conceptual level real[C]//Lecture Notes in Computer Science 4215.[S.l.]:Springer,2006:552 - 565.
[8] SHANE S,WOJTEK K.Model transformation:the heart and soul of model- driven software development[C]//IEEE Software.[S.l.]:[s.n.],2003:42 -45.
[9] LIU Y,LIU H X.The mapping from entity data model to relational data model[C]//IEEE International Conference on InternetTechnology and Applications.[S.l.]:[s.n.],2010:1 -5.
[10] 陳雪梅,韓潔瓊.C語言可視化編程環(huán)境的設(shè)計(jì)與實(shí)現(xiàn)[J].武漢理工大學(xué)學(xué)報(bào):信息與管理工程版,2010,32(4):561 -564.
[11] ANDREY Y.Using ADO.NET entity framework in domain- driven design:a pattern approach[R].Sweden:Department of Applied Information Technology,2008.