李萬高,孫德廠,胡耀東
LI Wan-gao1, SUN De-chang2,3, HU Yao-dong1
(1.河南工程學(xué)院,鄭州 451191;2.中國科學(xué)院 沈陽自動化研究所,沈陽 110016;3.中國科學(xué)院 研究生院,北京 100049)
所有的企業(yè)應(yīng)用軟件系統(tǒng)都是為了支持具體的企業(yè)管理與運(yùn)作流程,總是與相關(guān)的業(yè)務(wù)領(lǐng)域密切相關(guān)。然而傳統(tǒng)的以數(shù)據(jù)存儲與功能實(shí)現(xiàn)為中心的軟件設(shè)計(jì)方法導(dǎo)致業(yè)務(wù)領(lǐng)域與軟件設(shè)計(jì)、開發(fā)脫節(jié),常常導(dǎo)致設(shè)計(jì)、開發(fā)偏離用戶需求。同時(shí)大量的業(yè)務(wù)規(guī)則、數(shù)據(jù)驗(yàn)證夾雜在業(yè)務(wù)對象的處理之中,業(yè)務(wù)邏輯的處理嵌入到用戶界面組件和數(shù)據(jù)庫腳本中,導(dǎo)致軟件的可維護(hù)性、可擴(kuò)展性不足。領(lǐng)域驅(qū)動設(shè)計(jì)的開發(fā)方法彌補(bǔ)了這一缺陷,在統(tǒng)一開發(fā)過程的框架下,領(lǐng)域模型貫穿整個(gè)軟件開發(fā)周期。
領(lǐng)域驅(qū)動設(shè)計(jì)(DDD)是Eric Evans在2004年提出的概念,是一種基于模型驅(qū)動開發(fā)(Model Driven Development MDD)思想的開發(fā)方式[1]。這種方法的核心觀點(diǎn)認(rèn)為軟件項(xiàng)目的起點(diǎn)是領(lǐng)域,針對領(lǐng)域建立符合系統(tǒng)需求的模型是軟件設(shè)計(jì)的基礎(chǔ),是業(yè)務(wù)領(lǐng)域?qū)<?、分析系統(tǒng)分析師、架構(gòu)設(shè)計(jì)師、開發(fā)人員共同交流的平臺。在軟件開發(fā)階段,推薦使用敏捷編程方法,使分析、設(shè)計(jì)、開發(fā)各環(huán)節(jié)相互反饋、促進(jìn),并對系統(tǒng)進(jìn)行持續(xù)的重構(gòu),形成良性循環(huán),有助于軟件在滿足需求的條件下,最真實(shí)的映射領(lǐng)域業(yè)務(wù)邏輯,這是瀑布模型的方法所不具備。圖1是領(lǐng)域驅(qū)動設(shè)計(jì)與開發(fā)模式的展示。
圖1 領(lǐng)域驅(qū)動設(shè)計(jì)與開發(fā)模式
領(lǐng)域驅(qū)動設(shè)計(jì)的核心是對業(yè)務(wù)領(lǐng)域建模,對象建模和基本要素包括:分層架構(gòu)、實(shí)體、值對象、服務(wù)、模塊、聚合、工廠和資源庫[2]。對領(lǐng)域驅(qū)動設(shè)計(jì)的研究工作,一些作者已經(jīng)做出了努力。王鵬等[3]使用領(lǐng)域驅(qū)動設(shè)計(jì)的開發(fā)模式設(shè)計(jì)了基于WEB的船舶性能預(yù)報(bào)系統(tǒng),完成了該系統(tǒng)的分層架構(gòu)設(shè)計(jì)和業(yè)務(wù)領(lǐng)域建模。陳亮[4]結(jié)合動態(tài)表單設(shè)計(jì)示例,對領(lǐng)域驅(qū)動模型進(jìn)行了介紹。張金松[5]針對物流系統(tǒng),提出了一個(gè)領(lǐng)域驅(qū)動設(shè)計(jì)的實(shí)施方案:DDD+SCRUM+XP(Extreme Programming)+CI(Continuous Integration)。系統(tǒng)架構(gòu)采用輕量級的J2EE技術(shù)(Spring+Hibernate+Compass+Ajax)。丁濤[6]對領(lǐng)域驅(qū)動設(shè)計(jì)的基礎(chǔ)理論與技術(shù)進(jìn)行全面的介紹,包括領(lǐng)域工程、領(lǐng)域建模等, 并對航務(wù)海事系統(tǒng)進(jìn)行領(lǐng)域建模、架構(gòu)設(shè)計(jì)與系統(tǒng)實(shí)現(xiàn)。鄭琴琴[7]對業(yè)務(wù)邏輯組織方法,史棟杰等[8]對資源庫模式設(shè)計(jì)進(jìn)行了研究。
車間詳細(xì)排產(chǎn)是指在一定的計(jì)劃期內(nèi)為加工任務(wù)分配制造資源的過程[9]。計(jì)劃期指排產(chǎn)所涉及的時(shí)間范圍,企業(yè)一般采用滾動周期的方法。加工任務(wù)指上層計(jì)劃系統(tǒng)給制造車間下達(dá)的已經(jīng)分解好的生產(chǎn)訂單,標(biāo)明有詳細(xì)的加工對象、加工數(shù)量、交付時(shí)間、工藝路線、加工工序等信息。制造資源指車間所擁有的設(shè)備、人員以及制造資源的能力。
依據(jù)上述概念,要實(shí)現(xiàn)車間詳細(xì)排產(chǎn)必須對基礎(chǔ)數(shù)據(jù)進(jìn)行管理,這些基礎(chǔ)數(shù)據(jù)包括工作日歷、人員班組、設(shè)備工具、工藝路線、工序、物料和物料清單。為達(dá)到詳細(xì)排產(chǎn)的優(yōu)化目標(biāo),要遵循相關(guān)的生產(chǎn)規(guī)則、滿足生產(chǎn)約束;為滿足交付時(shí)間要求必須選擇合適的計(jì)劃策略,選擇適合特定環(huán)境的算法;最后對排產(chǎn)的結(jié)果進(jìn)行評價(jià),并發(fā)布執(zhí)行。經(jīng)過對這些要素的迭代分析,車間詳細(xì)排產(chǎn)領(lǐng)域知識如圖2所示。
圖2 車間詳細(xì)排產(chǎn)領(lǐng)域知識
2.2.1 業(yè)務(wù)流程
車間詳細(xì)排產(chǎn)業(yè)務(wù)流程主要包括基礎(chǔ)數(shù)據(jù)管理和排產(chǎn)執(zhí)行?;A(chǔ)數(shù)據(jù)管理主要包括基礎(chǔ)數(shù)據(jù)維護(hù),以及基礎(chǔ)數(shù)據(jù)之間關(guān)系分配,從而建立起模擬實(shí)際生產(chǎn)環(huán)境的詳細(xì)排產(chǎn)模型。排產(chǎn)執(zhí)行主要包括加工任務(wù)加載、排產(chǎn)執(zhí)行、排產(chǎn)結(jié)果調(diào)整、排產(chǎn)結(jié)果發(fā)布、執(zhí)行過結(jié)果反饋。排產(chǎn)執(zhí)行流程如圖3所示。
基礎(chǔ)數(shù)據(jù):增加、修訂、刪除、查詢基礎(chǔ)數(shù)據(jù)信息,確?;A(chǔ)數(shù)據(jù)完整、正確、及時(shí)的維護(hù)在系統(tǒng)中。
數(shù)據(jù)分配:增加、修訂、刪除、查詢基礎(chǔ)數(shù)據(jù)分配關(guān)系,建立基礎(chǔ)數(shù)據(jù)之間的業(yè)務(wù)規(guī)則,切實(shí)反映各排產(chǎn)要素之間的制約關(guān)系。
加工任務(wù):在排產(chǎn)系統(tǒng)中建立加工任務(wù),或從上層ERP系統(tǒng)下載加工任務(wù)。
排產(chǎn)運(yùn)算:在基礎(chǔ)數(shù)據(jù)基礎(chǔ)上,選擇排產(chǎn)策略、目標(biāo),提交排產(chǎn)事務(wù),系統(tǒng)根據(jù)基礎(chǔ)數(shù)據(jù)建立排產(chǎn)環(huán)境模型,調(diào)用合適的算法,輸出排產(chǎn)結(jié)果,并對排產(chǎn)結(jié)果評價(jià)。
結(jié)果發(fā)布:根據(jù)甘特圖、負(fù)載圖、評價(jià)指標(biāo)對排產(chǎn)結(jié)果審查,根據(jù)人工經(jīng)驗(yàn)對排產(chǎn)結(jié)果進(jìn)行調(diào)整或優(yōu)化直至滿意,發(fā)布排產(chǎn)結(jié)果。
執(zhí)行反饋:根據(jù)實(shí)際生產(chǎn)開、完工時(shí)間,生產(chǎn)進(jìn)度的反饋數(shù)據(jù),不斷更新加工任務(wù)的狀態(tài),從而形成生產(chǎn)過程排產(chǎn)的閉環(huán)控制。
圖3 車間詳細(xì)排產(chǎn)執(zhí)行流程
2.2.2 領(lǐng)域模型
設(shè)計(jì)完整的企業(yè)級應(yīng)用軟件,在滿足業(yè)務(wù)領(lǐng)域和業(yè)務(wù)流程的功能性要求外,還應(yīng)該包括用戶管理、權(quán)限管理、日志管理等非功能性要求以及運(yùn)算速度等性能要求。在此基礎(chǔ)上構(gòu)建領(lǐng)域模型如圖4。
實(shí)體:模型中日歷時(shí)間、設(shè)備工具、人員班組、加工工序、工藝路線、生產(chǎn)產(chǎn)品、加工任務(wù)均具有唯一的標(biāo)識,這些對象均是實(shí)體對象。
圖4 車間詳細(xì)排產(chǎn)領(lǐng)域模型
值對象:模型中生產(chǎn)能力、計(jì)劃目標(biāo)、計(jì)劃結(jié)果等對象,隨系統(tǒng)運(yùn)行而變化,不具有標(biāo)識符,是值對象。
服務(wù):模型中的數(shù)據(jù)檢查、能力核查、數(shù)據(jù)加載、模型構(gòu)建、算法調(diào)用、結(jié)果發(fā)布等均為系統(tǒng)的服務(wù)。
模塊:系統(tǒng)中實(shí)體對象的維護(hù),以及實(shí)體對象之間關(guān)系的分配,是詳細(xì)排產(chǎn)的基礎(chǔ)數(shù)據(jù),可以劃分為基礎(chǔ)數(shù)據(jù)管理模塊。加工任務(wù)、排產(chǎn)運(yùn)算、結(jié)果發(fā)布、執(zhí)行反饋是動態(tài)的數(shù)據(jù),劃分為系統(tǒng)執(zhí)行管理模塊。用戶、權(quán)限、日志的管理劃分為系統(tǒng)管理模塊。
聚合:對于實(shí)體對象,擁有唯一的標(biāo)識,可以作為聚合根,進(jìn)而形成聚合體,在模型中,人員班組、設(shè)備工具、工藝路線、生產(chǎn)產(chǎn)品、加工任務(wù)作為子模型。其中加工任務(wù)和設(shè)備工具作為領(lǐng)域的核心,因?yàn)榕女a(chǎn)的結(jié)果就是要把加工任務(wù)分配到不同的設(shè)備工具上進(jìn)行加工。
工廠:在業(yè)務(wù)處理中,像工藝路線、加工任務(wù)這樣的聚合體或者生產(chǎn)能力、排產(chǎn)模型這樣的值對象,往往包含有復(fù)雜的數(shù)據(jù)及對象分配關(guān)系,為便于實(shí)現(xiàn),需要建立構(gòu)造函數(shù)對其進(jìn)行數(shù)據(jù)初始化,這就是工廠。
資源庫:為提升系統(tǒng)的計(jì)算性能,排產(chǎn)運(yùn)算必須基于內(nèi)存運(yùn)行,需要按照排產(chǎn)執(zhí)行流程將持久化數(shù)據(jù)加載到內(nèi)存中。為使不同數(shù)據(jù)在內(nèi)存中可以區(qū)別開來,需要為復(fù)雜的實(shí)例化實(shí)體對象或值對象創(chuàng)建資源庫,而簡單的數(shù)據(jù)使用變量進(jìn)行存儲。
通過上述領(lǐng)域模型的分析,可以對系統(tǒng)進(jìn)行架構(gòu)設(shè)計(jì),通用的領(lǐng)域驅(qū)動設(shè)計(jì)的架構(gòu)性解決方案是將軟件設(shè)計(jì)為四層:用戶界面層、應(yīng)用層、領(lǐng)域?qū)雍突A(chǔ)設(shè)施層。將領(lǐng)域模型從用戶界面層、應(yīng)用層、基礎(chǔ)設(shè)施層分離出來,專注于領(lǐng)域問題的管理、業(yè)務(wù)知識的捕獲和表達(dá)。圖5展示了車間詳細(xì)排產(chǎn)的領(lǐng)域模型。
圖5 車間詳細(xì)排產(chǎn)系統(tǒng)架構(gòu)
表示層:負(fù)責(zé)向用戶展現(xiàn)信息以及解釋用戶命令。
應(yīng)用層:用來協(xié)調(diào)應(yīng)用的活動。它不包含業(yè)務(wù)邏輯,不保留業(yè)務(wù)對象的狀態(tài),但保有應(yīng)用任務(wù)的進(jìn)度狀態(tài)。
領(lǐng)域?qū)樱喊P(guān)于領(lǐng)域的信息。這是業(yè)務(wù)軟件的核心所在。在這里保留業(yè)務(wù)對象的狀態(tài),對業(yè)務(wù)對象和它們狀態(tài)的持久化被委托給了基礎(chǔ)設(shè)施層。
持久層:作為其它層的支撐庫存在。它提供了層間的通信,實(shí)現(xiàn)對業(yè)務(wù)對象的持久化,包含對用戶界面層的支撐庫等作用。
依據(jù)上述領(lǐng)域模型和系統(tǒng)架構(gòu),開發(fā)環(huán)境為Visual Studio 2008,數(shù)據(jù)庫為SQL Server 2005。在微軟.NET應(yīng)用平臺下,采用Windows Presentation Foundation(WPF)技術(shù)實(shí)現(xiàn)。.NET平臺很好的支持了面向?qū)ο蠹夹g(shù),并為此專門開發(fā)了一種語言C#。新的WPF技術(shù)是.NET Framework的組成部分,WPF同時(shí)支持C/S和B/S結(jié)構(gòu),支持界面設(shè)計(jì)與業(yè)務(wù)邏輯開發(fā)的分離。界面設(shè)計(jì)采用XAML語言,可以對界面元素進(jìn)行定義和刻畫。通過數(shù)據(jù)綁定、事件響應(yīng)與業(yè)務(wù)邏輯層進(jìn)行交互。業(yè)務(wù)邏輯層,使用C#語言開發(fā),根據(jù)系統(tǒng)架構(gòu)設(shè)計(jì),分為應(yīng)用層和領(lǐng)域?qū)?。?yīng)用層負(fù)責(zé)響應(yīng)事件與結(jié)果反饋。領(lǐng)域?qū)迂?fù)責(zé)各種對象模型的創(chuàng)建和管理。持久層負(fù)責(zé)與數(shù)據(jù)源通信,在.NET平臺下,主要使用ADO進(jìn)行連接[10]。在.NET平臺WPF技術(shù)下,系統(tǒng)實(shí)現(xiàn)架構(gòu)如圖6所示。圖7和圖8為日歷和工藝路線等基礎(chǔ)數(shù)據(jù)管理。
圖6 NET平臺下系統(tǒng)架構(gòu)
圖7 日歷管理
圖8 工藝路線、工序管理
本文首先對領(lǐng)域驅(qū)動設(shè)計(jì)的相關(guān)概念、開發(fā)模式進(jìn)行介紹,然后遵照領(lǐng)域工程模式對車間詳細(xì)排產(chǎn)的領(lǐng)域知識、業(yè)務(wù)流程進(jìn)行研究,在此基礎(chǔ)上建立了領(lǐng)域模型。在面向復(fù)雜系統(tǒng)建模時(shí),對模型要素識別出實(shí)體、值對象、服務(wù)等對象,并對對象關(guān)系進(jìn)行簡化,進(jìn)行模塊的劃分。 分層架構(gòu)設(shè)計(jì),使得軟件開發(fā)人員能夠在實(shí)現(xiàn)階段更多的關(guān)注領(lǐng)域模型。最后,在.NET平臺下,使用WPF技術(shù),對系統(tǒng)進(jìn)行了實(shí)現(xiàn)。實(shí)踐證明,領(lǐng)域驅(qū)動設(shè)計(jì)模式下,軟件系統(tǒng)的設(shè)計(jì)與開發(fā)更具有效率,軟件系統(tǒng)本身更具有較好的可維護(hù)性、可擴(kuò)展性性。
[1]Evans E.著.陳大峰,張澤鑫,譯.領(lǐng)域驅(qū)動設(shè)計(jì)—軟件核心復(fù)雜性應(yīng)對之道[M].北京:清華大學(xué)出版社,2006.
[2]Abel Avran&Floyd Marinescu著.孫向暉,霍泰穩(wěn),譯.領(lǐng)域驅(qū)動設(shè)計(jì).精簡版[M],http://infoq.com/cn/minibooks/domain-driven-desian-quickly.
[3]王鵬,劉淵,冷文浩.領(lǐng)域驅(qū)動設(shè)計(jì)在SPP系統(tǒng)中的應(yīng)用[J],計(jì)算機(jī)工程與設(shè)計(jì),2008,29(13):3312-3364.
[4]陳亮.基于領(lǐng)域驅(qū)動設(shè)計(jì)的軟件開發(fā)方法和實(shí)例分析[J],鐵路計(jì)算機(jī)應(yīng)用,2010,19(9):51-54.
[5]張金松.領(lǐng)域驅(qū)動設(shè)計(jì)在航務(wù)海事系統(tǒng)中的應(yīng)用研究[D].大連海事大學(xué),2010.
[6]丁濤.基于領(lǐng)域驅(qū)動設(shè)計(jì)的物流平臺系統(tǒng)實(shí)現(xiàn)[D].電子科技大學(xué),2010.
[7]鄭琴琴.領(lǐng)域驅(qū)動設(shè)計(jì)的業(yè)務(wù)邏輯組織方法研究[J].中國科技論文在線,http://www.paper.edu.cn
[8]史棟杰,孔華峰.領(lǐng)域驅(qū)動設(shè)計(jì)中資源庫模式的設(shè)計(jì)與實(shí)現(xiàn)[J],電腦知識與技術(shù),2011,6(33):9617-9618,9621.
[9]Michael Pinedo.Scheduling:Theory,Algorithms,and Systems Second Edition.[M],北京:清華大學(xué)出版社.
[10]Adam Nathan著.瞿杰,單佐一,夏寒.譯.WPF揭秘[M],北京:人民郵電出版社,2008.