《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 通信與網(wǎng)絡(luò) > 設(shè)計應(yīng)用 > 模型驅(qū)動的預(yù)算管理系統(tǒng)設(shè)計與實(shí)現(xiàn)
模型驅(qū)動的預(yù)算管理系統(tǒng)設(shè)計與實(shí)現(xiàn)
2016年微型機(jī)與應(yīng)用第22期
郭寧遠(yuǎn),徐建良
(中國海洋大學(xué) 信息科學(xué)與工程學(xué)院,山東 青島 266100)
摘要: 針對財務(wù)預(yù)算的領(lǐng)域概念和復(fù)雜需求,將一種模型驅(qū)動的開發(fā)方式實(shí)踐于預(yù)算管理系統(tǒng)的設(shè)計與實(shí)現(xiàn),使開發(fā)人員脫離復(fù)雜的數(shù)據(jù)庫設(shè)計,更加專注領(lǐng)域概念的消化、模型和數(shù)據(jù)傳輸對象的創(chuàng)建。給出了預(yù)算管理系統(tǒng)的整體說明和框架的總體結(jié)構(gòu)設(shè)計,并以開發(fā)順序依次介紹了各層的設(shè)計與實(shí)現(xiàn),最后結(jié)合系統(tǒng)快速上線的效果說明了這種模型驅(qū)動開發(fā)方式的可行性、便利性和快捷性。
Abstract:
Key words :

  郭寧遠(yuǎn),徐建良

  (中國海洋大學(xué) 信息科學(xué)與工程學(xué)院,山東 青島 266100)

       摘要:針對財務(wù)預(yù)算的領(lǐng)域概念和復(fù)雜需求,將一種模型驅(qū)動的開發(fā)方式實(shí)踐于預(yù)算管理系統(tǒng)的設(shè)計與實(shí)現(xiàn),使開發(fā)人員脫離復(fù)雜的數(shù)據(jù)庫設(shè)計,更加專注領(lǐng)域概念的消化、模型和數(shù)據(jù)傳輸對象的創(chuàng)建。給出了預(yù)算管理系統(tǒng)的整體說明和框架的總體結(jié)構(gòu)設(shè)計,并以開發(fā)順序依次介紹了各層的設(shè)計與實(shí)現(xiàn),最后結(jié)合系統(tǒng)快速上線的效果說明了這種模型驅(qū)動開發(fā)方式的可行性、便利性和快捷性。

  關(guān)鍵詞:預(yù)算管理; 信息系統(tǒng); Entity Framework; Model First; 數(shù)據(jù)傳輸對象; 多層架構(gòu); JSON;

  中圖分類號:TP311.11文獻(xiàn)標(biāo)識碼:ADOI: 10.19358/j.issn.16747720.2016.22.003

  引用格式:郭寧遠(yuǎn),徐建良.模型驅(qū)動的預(yù)算管理系統(tǒng)設(shè)計與實(shí)現(xiàn)[J].微型機(jī)與應(yīng)用,2016,35(22):11-14.

0引言

  在面對某領(lǐng)域內(nèi)的專業(yè)概念和復(fù)雜需求時,將新知識吸收轉(zhuǎn)化為軟件產(chǎn)品對于軟件開發(fā)人員來說是一項艱巨的任務(wù)。一方面在此過程中若軟件開發(fā)人員對領(lǐng)域?qū)<业男枨罄斫獠煌笍兀瑢?dǎo)致工作重心的偏離、軟件交付期延長、需求頻繁變更等影響軟件開發(fā)和交付的嚴(yán)重后果。另一方面,軟件開發(fā)人員更偏向于使用技術(shù)來解決領(lǐng)域問題,比如沉溺于設(shè)計完美的數(shù)據(jù)庫來滿足需求,而這往往是事倍功半的方法。

  基于模型的開發(fā)方式提高了代碼本身的溝通能力。模型是一種知識形式,它對知識進(jìn)行有選擇的簡化和有目的的結(jié)構(gòu)化[1]。使用適當(dāng)?shù)哪P筒⒛P拓灤┯谡麄€開發(fā)過程,可以使軟件開發(fā)人員專注于需求相關(guān)的信息,簡化與領(lǐng)域?qū)<业臏贤ǎ怪R表達(dá)更加準(zhǔn)確,更加貼合需求。

  Entity Framework是微軟研發(fā)的一種對象關(guān)系映射組件(ORM),它可以在關(guān)系型數(shù)據(jù)庫和對象之間產(chǎn)生自動映射[2]。在Entity Framework 6.x版本中提供三種開發(fā)模式:Code First、Database First和Model First[3]。本文將利用Model First開發(fā)模式,以模型的構(gòu)建為中心,通過模型驅(qū)動開發(fā),數(shù)據(jù)庫由模型生成,開發(fā)人員只需將關(guān)注點(diǎn)放在領(lǐng)域模型和數(shù)據(jù)傳輸對象(DTO)的轉(zhuǎn)化上即可。

1系統(tǒng)整體說明

  1.1系統(tǒng)基本流程


001.jpg


  圖1預(yù)算新建及審核流程系統(tǒng)主要分為兩個業(yè)務(wù)流程,即預(yù)算業(yè)務(wù)流程和預(yù)算調(diào)整業(yè)務(wù)流程。

  預(yù)算業(yè)務(wù)流程如圖1所示,起于專家對已經(jīng)立項的項目添加預(yù)算,終于財務(wù)處管理員審核通過預(yù)算。

002.jpg

  預(yù)算調(diào)整流程如圖2所示,貫穿于整個項目進(jìn)行過程中,當(dāng)本次預(yù)算出現(xiàn)改變等需要調(diào)整的情況時,專家提出調(diào)整請求,由科技處管理員審核。

  1.2系統(tǒng)模塊劃分

  系統(tǒng)以項目預(yù)算業(yè)務(wù)流程為核心,以數(shù)據(jù)查詢、審核、分析為重心,包括基本信息維護(hù)、預(yù)算管理、預(yù)算調(diào)整管理、子課題管理、預(yù)算審核管理、調(diào)整審核管理、統(tǒng)計報表等功能。系統(tǒng)模塊如圖3所示。

  

003.jpg

  模塊功能簡要說明如下:

  (1)基本信息維護(hù):包括用戶、角色、權(quán)限、界面等用戶關(guān)聯(lián)信息管理,系統(tǒng)使用基于角色的訪問控制方法,可便捷簡單地處理用戶與權(quán)限之間關(guān)系;維護(hù)批復(fù)預(yù)算基本增、刪、改、查操作。

  (2)預(yù)算管理:包括專家對負(fù)責(zé)項目預(yù)算信息的基本處理,如新建、修改、查看、保存、提交、報表導(dǎo)出等,以及該項目子課題的科目預(yù)算制定與子課題指派等功能。

  (3)預(yù)算調(diào)整管理:預(yù)算調(diào)整是項目在執(zhí)行過程中,專家對承擔(dān)的項目預(yù)算進(jìn)行調(diào)整工作,包括調(diào)整的新建、修改、查看、保存、提交等工作,在調(diào)整過程中,可以添加新的子課題;專家亦可以查閱項目之前的每一次調(diào)整。

  (4)子課題管理:專家可對子課題憑單號、賬本號進(jìn)行編輯,也可查看參與的項目與子課題的預(yù)算分配情況。

  (5)預(yù)算審核管理:財務(wù)處管理員對專家提交的項目預(yù)算進(jìn)行審核。

  (6)調(diào)整審核管理:科技處管理員對專家提交的預(yù)算調(diào)整進(jìn)行審核。

  (7)預(yù)算數(shù)據(jù)統(tǒng)計:提供子課題數(shù)據(jù)的導(dǎo)出功能,將系統(tǒng)中的數(shù)據(jù)根據(jù)財務(wù)處相關(guān)要求導(dǎo)出一定格式的DBF文件,供財務(wù)處統(tǒng)計、分析、導(dǎo)入等使用。

2系統(tǒng)結(jié)構(gòu)設(shè)計與各層次的實(shí)現(xiàn)

  系統(tǒng)采用B/S架構(gòu),客戶端只需一個瀏覽器,就可以通過Web服務(wù)器與服務(wù)器端進(jìn)行數(shù)據(jù)交互[4]。按照高效、易維護(hù)的原則將系統(tǒng)分為展示層、服務(wù)層、數(shù)據(jù)轉(zhuǎn)化層、業(yè)務(wù)邏輯層、領(lǐng)域模型層、DTO模型層六個層次,如圖4所示。

004.jpg

  系統(tǒng)打破傳統(tǒng)的以業(yè)務(wù)邏輯為中心的開發(fā)模式,轉(zhuǎn)為以領(lǐng)域模型和DTO模型為中心的開發(fā)模式,使前后端開發(fā)人員更專注處理用戶的需求,更快地理解、吸收領(lǐng)域知識,從而構(gòu)建高質(zhì)量、易維護(hù)的軟件產(chǎn)品。這種開發(fā)模式的順序?yàn)椋?/p>

  (1)開發(fā)人員與領(lǐng)域?qū)<疫M(jìn)行交流溝通,根據(jù)需求確定系統(tǒng)的領(lǐng)域模型結(jié)構(gòu),再根據(jù)領(lǐng)域模型構(gòu)建前后臺傳輸?shù)腄TO模型。

  (2)確定好領(lǐng)域模型和DTO模型,前端的開發(fā)只需關(guān)注與后端服務(wù)器交互的DTO模型,根據(jù)用戶對界面的要求和各個界面的DTO模型構(gòu)建展示層中的各個界面。

  (3)后端服務(wù)器端只需關(guān)注領(lǐng)域模型與DTO模型之間的轉(zhuǎn)化,根據(jù)需求的轉(zhuǎn)化規(guī)則完成業(yè)務(wù)邏輯層的編寫。

  (4)根據(jù)前后臺約定的數(shù)據(jù)傳輸格式,完成數(shù)據(jù)轉(zhuǎn)化層編寫。

  (5)編寫服務(wù)層WebService供前端展示層調(diào)用。

  開發(fā)順序如圖5所示。

  

005.jpg

  2.1領(lǐng)域模型層設(shè)計實(shí)現(xiàn)

  領(lǐng)域模型層是系統(tǒng)的核心層,是連接整個系統(tǒng)的橋梁。在此層次中軟件開發(fā)人員利用Entity Framework的Model First開發(fā)模式構(gòu)建模型,模式的核心為EDM(Entity Data Model)技術(shù),EDM提供圖形化的設(shè)計界面,將模型設(shè)計和代碼實(shí)現(xiàn)綁定,通過與領(lǐng)域?qū)<业慕涣?,利用頭腦風(fēng)暴等活動將系統(tǒng)的領(lǐng)域概念和復(fù)雜需求等知識消化并提煉到模型當(dāng)中,并通過不斷地修改和調(diào)整模型使之更滿足預(yù)算系統(tǒng)的需求,最終確定出整個系統(tǒng)的領(lǐng)域模型。

  確定好領(lǐng)域模型后,開發(fā)人員只需保存模型,即可根據(jù)模型中屬性和實(shí)體間關(guān)聯(lián)等信息生成所有實(shí)體對象,并生成一個繼承于DbContext基類的數(shù)據(jù)庫上下文對象[5]。其中Entity Framework庫里面的DbContext基類為操控實(shí)體對象執(zhí)行上下文環(huán)境, 提供所需的架構(gòu)和映射元數(shù)據(jù)(Meatadata)、數(shù)據(jù)庫鏈接,同時還包括對象緩存、跟蹤狀態(tài)和關(guān)聯(lián)管理等功能[3]。

  保存好模型并生成實(shí)體和數(shù)據(jù)庫上下文后,在模型中選擇“根據(jù)模型生成數(shù)據(jù)庫”,配置好連接字符串,即可從模型映射到相應(yīng)的數(shù)據(jù)庫中,使開發(fā)人員擺脫使用復(fù)雜的數(shù)據(jù)庫管理工具進(jìn)行數(shù)據(jù)庫設(shè)計和實(shí)現(xiàn)的工作。

  以預(yù)算及其審核模塊為例,構(gòu)建圖6所示模型。

006.jpg

  2.2DTO模型層設(shè)計實(shí)現(xiàn)

  領(lǐng)域模型層完成后,開發(fā)人員的下一個關(guān)注點(diǎn)應(yīng)是數(shù)據(jù)的傳輸,也就是DTO模型的構(gòu)建。

  DTO(Data Transfer Object)即數(shù)據(jù)傳輸對象,是一種用來在多層架構(gòu)軟件系統(tǒng)中層間交換數(shù)據(jù)的對象。DTO的提出是為了在客戶端和服務(wù)器端交換大量的數(shù)據(jù),而無需多個細(xì)粒度的調(diào)用,從而減少遠(yuǎn)程調(diào)用的數(shù)目 ,避免相關(guān)的網(wǎng)絡(luò)負(fù)載[6]。

  開發(fā)人員可根據(jù)領(lǐng)域模型和原型界面構(gòu)建DTO模型。在預(yù)算管理系統(tǒng)框架中,業(yè)務(wù)邏輯層根據(jù)每個界面的數(shù)據(jù)需求從領(lǐng)域模型層中取出相應(yīng)的數(shù)據(jù)并組合成與需求數(shù)據(jù)相對應(yīng)的DTO對象,然后交由數(shù)據(jù)轉(zhuǎn)化層;或者由數(shù)據(jù)轉(zhuǎn)化層將服務(wù)層傳來的數(shù)據(jù)轉(zhuǎn)化成DTO對象,然后交由業(yè)務(wù)邏輯層進(jìn)行處理。所以,DTO模型是前后臺數(shù)據(jù)傳輸?shù)暮诵?,確定好DTO模型后,向下關(guān)注業(yè)務(wù)邏輯層的編寫,向上關(guān)注數(shù)據(jù)轉(zhuǎn)化層、服務(wù)層、展示層的編寫,并且可以同時進(jìn)行,大大節(jié)約了時間成本。

  以預(yù)算審核列表的顯示為例,DTO模型的示例代碼如下:

  public class BudgetAuditListDTO{

  public List<BudgetAuditVO> budgetAuditList { get; set; }

  }

  public class BudgetAuditVO{

  public int projectid { get; set; }

  public long totalamounts { get; set; }

  public long outeramounts { get; set; }

  public string prjmanagername { get; set; }

  public string prjstate { get; set; }

  }

  2.3業(yè)務(wù)邏輯層設(shè)計實(shí)現(xiàn)

  領(lǐng)域模型層和DTO模型層均構(gòu)建完畢后,業(yè)務(wù)邏輯層的職責(zé)是領(lǐng)域模型和DTO模型之間的轉(zhuǎn)化。語言集成查詢(Language Integrated Query,LINQ)是一組語言特性和API,LINQ to Entities提供了查詢關(guān)系數(shù)據(jù)庫中的實(shí)體模型的方式[7]。在此層次中,系統(tǒng)使用LINQ to Entities技術(shù),從領(lǐng)域模型實(shí)體中進(jìn)行數(shù)據(jù)的增、刪、改、查。

  以“我的子課題列表”的顯示為例,系統(tǒng)在接收到前臺的數(shù)據(jù)請求后,業(yè)務(wù)邏輯層使用LINQ to Entities技術(shù)將數(shù)據(jù)從數(shù)據(jù)庫中取出。示例代碼如下:

  varquery = from miss in

  database.MissionSet.OfType<InnerMission>()

  where miss.ManagerId == userId

  select new {

  MissionId = miss.Id,

  ProjectId = miss.ProjectId,

  MissionName = miss.MissionName

  };

  查詢結(jié)束后,將結(jié)果根據(jù)列表所對應(yīng)的DTO模型進(jìn)行DTO模型屬性的賦值和組合,示例代碼如下:

  foreach(var q in queryList){

  MyMissionListVO mmlVO = new MyMissionListVO(){

  missionid = q.MissionId,

  projectid = q.ProjectId,

  mssname = q.MissionName};

  this.missionListDTO.Add(mmlVO);

  }

  經(jīng)過上述步驟,業(yè)務(wù)邏輯層就完成了領(lǐng)域模型與DTO模型的轉(zhuǎn)化。

  2.4數(shù)據(jù)轉(zhuǎn)化層和服務(wù)層設(shè)計實(shí)現(xiàn)

  預(yù)算管理系統(tǒng)中,前后臺數(shù)據(jù)是通過JSON(JavaScript Object Notation)格式來傳輸?shù)?。JSON是一種輕量級的數(shù)據(jù)傳輸格式,易于閱讀和編碼,可以在多種語言之間進(jìn)行數(shù)據(jù)交換[8]。數(shù)據(jù)轉(zhuǎn)化層將業(yè)務(wù)邏輯層傳來的DTO對象序列化成JSON格式的數(shù)據(jù),或者根據(jù)服務(wù)層傳來的JSON格式的數(shù)據(jù)反序列化成DTO對象。

  預(yù)算管理系統(tǒng)的數(shù)據(jù)轉(zhuǎn)化層使用JSON.NET技術(shù)實(shí)現(xiàn)JSON的序列化和反序列化。使用JSON.NET技術(shù)可以自動進(jìn)行JSON的序列化和反序列化,是.NET框架下一款功能強(qiáng)大且高效的開源序列化和反序列化工具[9]。

  以子課題更新功能為例,先將服務(wù)層傳來的子課題信息反序列化為DTO對象,交由業(yè)務(wù)邏輯層保存后,將返回的子課題再序列化為JSON返回給服務(wù)層。示例代碼如下:

  MissionDTO missionDTO=

  JsonConvert.DeserializeObject<AddAndReturnMissionsBusin-ess>(json);

  missionDTO = aarmb.SaveAndReturn(database);

  json =

  JsonConvert.SerializeObject(missionDTO,Formatting.Indented);

  預(yù)算管理系統(tǒng)的服務(wù)層提供WebService供展示層調(diào)用,負(fù)責(zé)接收展示層發(fā)來的請求,并將數(shù)據(jù)傳給數(shù)據(jù)轉(zhuǎn)化層。

  以子課題更新的WebService為例,服務(wù)層接收到前端的請求后,實(shí)例化數(shù)據(jù)轉(zhuǎn)化層的對象,將JSON等數(shù)據(jù)傳給數(shù)據(jù)轉(zhuǎn)化層。示例代碼如下:

  public class AddAndReturnMissions : WebServiceBase{

 ?。踂ebMethod]

  public void SaveAndReturn(string mssParam){

  AddAndReturnMissionsTrans aarmT =

  new AddAndReturnMissionsTrans();

  aarmT.SaveAndReturn(Database, mssParam);}

  }

  2.5展示層設(shè)計實(shí)現(xiàn)

  預(yù)算管理系統(tǒng)的展示層采用ExtJS富客戶端框架。ExtJS是基于JavaScript語言開發(fā)的客戶端Ajax框架,優(yōu)點(diǎn)是與后臺技術(shù)無關(guān),而且瀏覽器兼容性較強(qiáng)[10]。

  在確定完領(lǐng)域模型和DTO模型后,軟件的前臺開發(fā)人員利用ExtJS后臺技術(shù)無關(guān)的優(yōu)點(diǎn),并利用之前確定好的DTO模型和需求分析階段的原型界面即可編寫前端代碼。

  預(yù)算管理系統(tǒng)利用ExtJS提供的視圖、表單、列表、表格等組件構(gòu)建友好、美觀的用戶界面,并通過ExtJS提供的Ajax功能與后臺進(jìn)行交互。以財務(wù)處管理員登錄后的界面為例,用戶登錄成功后,系統(tǒng)發(fā)起主界面的Ajax請求,取得相應(yīng)數(shù)據(jù)并渲染到用戶界面。示例界面如圖7所示。

 

007.jpg

3結(jié)論

  模型驅(qū)動的開發(fā)方式適用于需求急迫、領(lǐng)域概念復(fù)雜、對軟件質(zhì)量要求高的軟件研發(fā)。本文針對預(yù)算管理系統(tǒng)的復(fù)雜需求,展示了模型驅(qū)動開發(fā)方式的實(shí)踐,軟件開發(fā)人員使用模型作為一種語言,與領(lǐng)域?qū)<医涣鞑⒉粩喔倪M(jìn)模型,快速地明確需求,使領(lǐng)域知識精確地消化于模型中。在明確模型之后,以模型為橋梁,使系統(tǒng)框架中各個層次并行開發(fā),大大節(jié)約了時間成本。并行的開發(fā)使開發(fā)人員專注于各層次的功能需求,提高了代碼的質(zhì)量。通過模型,軟件開發(fā)人員還可以挖掘潛在需求進(jìn)行深度開發(fā),進(jìn)一步改進(jìn)軟件的性能。

  目前預(yù)算系統(tǒng)已上線使用,其在短期內(nèi)的上線使用和其穩(wěn)定性證明了文中介紹的基于模型驅(qū)動的開發(fā)方式的可行性、便利性和快捷性。

  參考文獻(xiàn)

  [1] EVANS E.領(lǐng)域驅(qū)動設(shè)計[M].趙俐,盛海艷,劉霞,等,譯.北京:人民郵電出版社, 2010.

 ?。?] 黃睿.基于Java技術(shù)的ORM工具接口的設(shè)計與實(shí)現(xiàn)[D]. 長春:吉林大學(xué),2012.

 ?。?] 沈霞菲, 王建中.基于.NET Entity Framework數(shù)據(jù)庫訪問機(jī)制的設(shè)計與應(yīng)用[J].現(xiàn)代電子技術(shù),2014(24):5-8.

  [4] 谷惠敏.基于Web的高校檔案管理系統(tǒng)設(shè)計[J].現(xiàn)代電子技術(shù),2015(21):139-141.

 ?。?] LERMAN J,MILLER R.Programming entity framework: DbContext[M].O’reilly Media,2012.

 ?。?] 朱彬, 陳志軍.DTO 模式的研究及對其實(shí)現(xiàn)的改進(jìn)[J].沈陽航空航天大學(xué)學(xué)報,2004,21(4):53-55.

  [7] 郭睿志, 邊力, 譚龍丹,等.數(shù)據(jù)庫查詢中LINQ to Entities應(yīng)用研究[J].軟件導(dǎo)刊,2014(1):122-124.

 ?。?] 高靜, 段會川.JSON數(shù)據(jù)傳輸效率研究[J].計算機(jī)工程與設(shè)計,2011,32(7):2267-2270.

 ?。?] ALLEN J.JsonNET claims significant performance improvements over other.NET Serializers[J].InfoQ,2010.

  [10] 易俗, 殷慧文.基于ExtJS的富客戶端聯(lián)通分銷商管理系統(tǒng)設(shè)計[J].遼寧大學(xué)學(xué)報(自然科學(xué)版),2015,42(2):143-149.


此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。