国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

領(lǐng)域驅(qū)動設(shè)計方法的關(guān)鍵要素研究與應(yīng)用*

2015-12-09 07:38吳昌雨王善勤李云松劉青鄒軍國
菏澤學(xué)院學(xué)報 2015年2期
關(guān)鍵詞:資源共享架構(gòu)邏輯

吳昌雨,王善勤,李云松,劉青,鄒軍國

(滁州職業(yè)技術(shù)學(xué)院,安徽滁州239000)

引言

傳統(tǒng)的軟件開發(fā)經(jīng)常是分析與設(shè)計割裂的,一個典型的例子就是在我國系統(tǒng)分析師、系統(tǒng)設(shè)計師就是兩種不同的職稱,分析與設(shè)計分離導(dǎo)致的后果就是分析的結(jié)果往往不能直接用于設(shè)計編程,設(shè)計者需要從分析文檔中給出數(shù)據(jù)設(shè)計逆推出系統(tǒng)的行為,最終造成設(shè)計出的軟件并不能真正的體現(xiàn)需求,而領(lǐng)域驅(qū)動設(shè)計(Domain-Driven Design,DDD)是Eric Evans在其著作《Domain-Driven Design–Tackling Complexity in the Heart of Software》[1]中首次提出的一種用于指導(dǎo)復(fù)雜軟件設(shè)計與開發(fā)的一整套基于領(lǐng)域模型的系統(tǒng)分析和設(shè)計的方法.它將軟件分析與設(shè)計的關(guān)注點從數(shù)據(jù)引導(dǎo)到業(yè)務(wù)上來,打破了分析與設(shè)計的隔閡,提出了領(lǐng)域模型概念,使得軟件能夠適應(yīng)更靈活的需求變更.

本文從教學(xué)資源共享平臺的分析與設(shè)計入手,闡述了領(lǐng)域驅(qū)動設(shè)計的相關(guān)理論及其應(yīng)用,通過應(yīng)用六邊形架構(gòu)實現(xiàn)了系統(tǒng)原型,為類似軟件開發(fā)過程中領(lǐng)域驅(qū)動設(shè)計方法的應(yīng)用提供借鑒.

1 相關(guān)工作

領(lǐng)域驅(qū)動設(shè)計是面向?qū)ο蟮姆治雠c設(shè)計(Object Oriented Analysis Design,OOAD)的擴(kuò)展和延伸,它既是面向?qū)ο笤O(shè)計的補(bǔ)充,又完成了對面向?qū)ο笤O(shè)計的超越,相對OOAD而言,它的主要變化在于能夠使用領(lǐng)域模型準(zhǔn)確反應(yīng)業(yè)務(wù)語言,也正因為此,它幾乎成了目前開發(fā)大中型復(fù)雜軟件系統(tǒng)的主流方法.國內(nèi)外研究學(xué)者對領(lǐng)域驅(qū)動設(shè)計的核心構(gòu)成要素如分層架構(gòu)、實體、值對象服務(wù)等概念展開了大量研究.例如Vaughn Vernon的《Implementing Domain-Driven Design》(實現(xiàn)領(lǐng)域驅(qū)動設(shè)計)從戰(zhàn)略設(shè)計高度研究了包括領(lǐng)域、實體、值對象、受限上下文等概念如何設(shè)計,并從戰(zhàn)術(shù)設(shè)計的角度研究了其如何實施[2];Mat Wall等人從Guardian.co.uk網(wǎng)站,采用領(lǐng)域驅(qū)動設(shè)計后其架構(gòu)演進(jìn)的角度著手分析了如何在既有項目上應(yīng)用領(lǐng)域驅(qū)動設(shè)計并不斷演進(jìn)[3];Jimmy Nilsson在其著作《Applying domain-driven design and patterns》(領(lǐng)域驅(qū)動設(shè)計與模式實戰(zhàn))中,展示了如何應(yīng)用測試驅(qū)動開發(fā)(TDD)不斷改進(jìn)領(lǐng)域驅(qū)動設(shè)計以及應(yīng)用領(lǐng)域驅(qū)動設(shè)計創(chuàng)建高質(zhì)量企業(yè)級應(yīng)用架構(gòu)的過程[4].

2 領(lǐng)域驅(qū)動建模及架構(gòu)設(shè)計

2.1 構(gòu)建領(lǐng)域模型

和傳統(tǒng)軟件開發(fā)一樣,軟件開發(fā)首先是從軟件專家與項目領(lǐng)域?qū)<业慕涣鏖_始,但這種交流通常會存在障礙,原因是雙方思維方式及問題的側(cè)重點是不一致的,所以領(lǐng)域驅(qū)動設(shè)計的一個核心的原則就是使用一種基于模型的通用語言(Ubiquitous Language)實現(xiàn)相互的交流.圖1展示了通用語言是介于開發(fā)者與領(lǐng)域?qū)<医M成的開發(fā)團(tuán)隊所使用的用于統(tǒng)一其行動及幫助創(chuàng)建統(tǒng)一模型的語言.

圖1 構(gòu)建通用語言

以教學(xué)資源共享平臺開發(fā)為例,首先由領(lǐng)域?qū)<覍ζ湫枨筮M(jìn)行定義:教師可以創(chuàng)建并管理課程;課程由章節(jié)構(gòu)成,每個章節(jié)包括一定學(xué)時的教學(xué)內(nèi)容;章節(jié)中的教學(xué)內(nèi)容由文檔、視頻、音頻等教學(xué)資源構(gòu)成;學(xué)生可以瀏覽并收藏課程內(nèi)容.

如果是使用傳統(tǒng)的面向?qū)ο蟪绦蛟O(shè)計方法,根據(jù)其需求可以由動名詞法得到一些實體類,類之間包含一些屬性及其get/set方法,這些實體類的作用很單一,僅僅用于描述實體卻沒有任何與其業(yè)務(wù)邏輯相關(guān)的東西,業(yè)務(wù)邏輯將會被放到一個單獨的service類中處理,這是一種典型的失血模型.而采用領(lǐng)域驅(qū)動設(shè)計方法則要求將業(yè)務(wù)邏輯集中于領(lǐng)域?qū)ο笾校瑯邮巧厦娴睦?,課程領(lǐng)域模型可以被視為一個聚合,課程作為聚合根包含了章節(jié)與課程資源,聚合根內(nèi)部包含有狀態(tài),并且這種狀態(tài)不能直接暴露出去,另外聚合內(nèi)部的對象通過聚合根實體與外界交互.因此從邏輯上得出這樣一個結(jié)論:教師、學(xué)生作為用戶與課程發(fā)生業(yè)務(wù)邏輯,而課程作為聚合根其內(nèi)部包含了章節(jié)及教學(xué)資源,即形成了圖2所示的領(lǐng)域模型.

圖2 教學(xué)資源共享平臺領(lǐng)域模型

這種領(lǐng)域模型準(zhǔn)確的反應(yīng)了業(yè)務(wù),業(yè)務(wù)邏輯不是放在單獨的業(yè)務(wù)邏輯類中處理,而是包含在領(lǐng)域?qū)ο笾?,每個領(lǐng)域?qū)ο蠖际前藢傩耘c業(yè)務(wù)邏輯相對完整的獨立體,并與現(xiàn)實領(lǐng)域中的業(yè)務(wù)對象一一映射.領(lǐng)域模型則是由這些領(lǐng)域?qū)ο蠼M成.這種設(shè)計方法,即保證了系統(tǒng)的可維護(hù)性、擴(kuò)展性和復(fù)用性,同時也在處理復(fù)雜業(yè)務(wù)邏輯方面具有先天優(yōu)勢.

2.2 架構(gòu)設(shè)計

Eric Evans在《領(lǐng)域驅(qū)動設(shè)計》中給出了一個典型的四層參考架構(gòu),分別是用于展示信息,并解釋用戶命令的表現(xiàn)層;起到協(xié)調(diào)、調(diào)度作用的應(yīng)用層;核心的領(lǐng)域?qū)樱I(yè)務(wù)領(lǐng)域的信息,以及業(yè)務(wù)對象的狀態(tài)變更;提供業(yè)務(wù)對象的持久化等支撐的基礎(chǔ)設(shè)施層.

這種分層架構(gòu)很好的遵循了關(guān)注點分離的原則,對領(lǐng)域?qū)ο筮M(jìn)行了明確的策略和職責(zé)劃分,讓領(lǐng)域?qū)ο蠛同F(xiàn)實世界中的業(yè)務(wù)形成良好的映射關(guān)系,相比于傳統(tǒng)的軟件架構(gòu)分層有如下特點:

1)應(yīng)用層不包含業(yè)務(wù)邏輯,由領(lǐng)域?qū)犹幚砭唧w的業(yè)務(wù)操作

傳統(tǒng)三層架構(gòu)軟件設(shè)計中,有專門用于處理業(yè)務(wù)邏輯的業(yè)務(wù)邏輯層(BLL),在這樣的架構(gòu)中,隨著需求的變更業(yè)務(wù)邏輯處理類開始積聚越來越多的業(yè)務(wù)邏輯,而領(lǐng)域?qū)ο髣t成為單純的數(shù)據(jù)載體造成了“肥的服務(wù)層”和“貧血的領(lǐng)域模型”.而在DDD方法指導(dǎo)下,領(lǐng)域模型應(yīng)該側(cè)重于具體的業(yè)務(wù)操作領(lǐng)域.領(lǐng)域?qū)ο笥蓪嶓w和值對象構(gòu)成,實體類具備自己的屬性和行為、狀態(tài),可以聚合,實體類之間可以有聚合關(guān)聯(lián)等關(guān)系,可以借由基礎(chǔ)設(shè)施層進(jìn)行持久化.

2)領(lǐng)域?qū)硬灰蕾囉趯崿F(xiàn)的細(xì)節(jié),層與層之間松耦合

在軟件分層結(jié)構(gòu)中,層通常是職責(zé)劃分為獨立且緊密結(jié)合的單元,比如傳統(tǒng)三層架構(gòu)中BLL層負(fù)責(zé)業(yè)務(wù)邏輯,它依賴于底層數(shù)據(jù)訪問層的支持同時也為其上級表示層提供依賴,這種層與層之間的依賴關(guān)系看起來很自然,但在具體面對需求變化時,每一個層次的變更都有可能影響到其他層,并對系統(tǒng)的伸縮性產(chǎn)生負(fù)面影響.而在DDD中,領(lǐng)域?qū)与m然負(fù)責(zé)處理整個系統(tǒng)的業(yè)務(wù)邏輯,但其設(shè)計是與其他層松耦合,即與其上下層之間沒有依賴關(guān)系,領(lǐng)域模型業(yè)務(wù)邏輯的實現(xiàn)應(yīng)該獨立于持久化實現(xiàn)的細(xì)節(jié).

事實上,DDD的具體實現(xiàn)并不依賴于特定架構(gòu),包括其參考架構(gòu)的層次概念在實踐中都是可以忽略的,本文針對教學(xué)資源共享平臺采用了圖3所示的六邊形架構(gòu)(Hexagonal architecture),圖中左邊是六邊形架構(gòu),右邊是資源共享平臺實現(xiàn)過程中針對六邊形架構(gòu)的一些具體實現(xiàn).

圖3 六邊形架構(gòu)

這種六邊形架構(gòu)也可以稱之為端口和適配器架構(gòu)(Ports and Adapters architecture)[5],該架構(gòu)設(shè)計目標(biāo)是實現(xiàn)層次之間的解耦,在其核心的領(lǐng)域模型中包含了所有的業(yè)務(wù)邏輯與規(guī)則(但并不直接實現(xiàn),由基礎(chǔ)設(shè)施層通過DI注入);包圍領(lǐng)域模型的是應(yīng)用程序端口層,它負(fù)責(zé)接收請求,并交由領(lǐng)域?qū)犹幚?,這一層很薄,主要起到協(xié)調(diào)作用;最外層的是適配器層,負(fù)責(zé)以某種格式接受輸入并產(chǎn)生輸出,比如通過HTTP接受客戶端請求并封裝為端口能夠理解的方式交給端口,再將處理結(jié)果轉(zhuǎn)換為HTTP相應(yīng)反饋給客戶端.該架構(gòu)的特點是組件與組件之間是相互平等的,模糊了層次概念,因為各層次之間的交互并不依賴于各自于實現(xiàn)的細(xì)節(jié),都是通過接口實現(xiàn),這一特性的實現(xiàn)取決與軟件抽象及一些新技術(shù)手段的運(yùn)用.具體來說,該架構(gòu)的實現(xiàn)需要以下三種技術(shù)手段的配合:

1)OOP(Object Oriented Programming,面向?qū)ο缶幊?,OOP仍然是領(lǐng)域?qū)崿F(xiàn)中的重要原則,應(yīng)充分利用其封裝、繼承、接口等特性設(shè)計領(lǐng)域?qū)ο?

2)DI((Dependency Injection,依賴注入),DDD要求領(lǐng)域?qū)ο蠹纫哂袠I(yè)務(wù)邏輯但又不能依賴于具體實現(xiàn)細(xì)節(jié),則只能通過DI的方式將數(shù)據(jù)持久化等業(yè)務(wù)邏輯注入到領(lǐng)域?qū)ο笾?

3)AOP(Aspect Oriented Programming,面向方面編程),AOP可以很好的實現(xiàn)關(guān)注點橫切,比如可以使用AOP將領(lǐng)域?qū)ο蟮臉I(yè)務(wù)規(guī)則檢查、狀態(tài)變化跟蹤、數(shù)據(jù)緩存、事務(wù)管理等某個方面的問題從領(lǐng)域?qū)ο笾幸瞥鰜?,讓領(lǐng)域?qū)ο蟾玫年P(guān)注業(yè)務(wù).

3 教學(xué)資源共享平臺設(shè)計實現(xiàn)

3.1 領(lǐng)域?qū)釉O(shè)計實現(xiàn)

領(lǐng)域?qū)ο笥蓪嶓w及值對象構(gòu)成,實體(Entities)類具有唯一的ID,能夠?qū)崿F(xiàn)持久化等業(yè)務(wù)邏輯,對應(yīng)于現(xiàn)實世界中的業(yè)務(wù)對象,在系統(tǒng)中設(shè)計了Course等實體類;值對象無ID,由對象屬性描述,可用于傳遞數(shù)據(jù)或?qū)嶓w進(jìn)行補(bǔ)充描述.

基于領(lǐng)域模型,教學(xué)資源共享平臺的通過設(shè)計與分析教學(xué)資源共享平臺領(lǐng)域?qū)釉O(shè)計圖如圖4所示:

圖4 教學(xué)資源共享平臺領(lǐng)域建模

圖中領(lǐng)域?qū)ο蠛同F(xiàn)實業(yè)務(wù)的對應(yīng)關(guān)系為:Teacher——教 師、Student——學(xué) 生、Course——課程、Lesson——教學(xué)章節(jié)、Resource——教學(xué)資源.這5個領(lǐng)域?qū)ο蟀凑展δ軇澐譃閮蓚€模塊,分別是用戶模塊和課程模塊,將這些高關(guān)聯(lián)度的類劃分到一個模塊,可以提供盡可能大的內(nèi)聚性,從圖3中可以看出每個模塊通過一個定義好的接口被其他的模塊訪問,比如用戶模塊通過IUserService接口的實現(xiàn)類UserService服務(wù)與外部交互,其目的是降低系統(tǒng)耦合度.UserService以及CourseService都屬于DDD中的領(lǐng)域服務(wù),它為外部提供操作接口,負(fù)責(zé)對領(lǐng)域?qū)ο筮M(jìn)行調(diào)度與封裝并提供各種形式的服務(wù),服務(wù)執(zhí)行的操作代表了一個領(lǐng)域概念,被執(zhí)行的操作通常會涉及到領(lǐng)域中的其他對象,以刪除課程為例,該業(yè)務(wù)邏輯不僅僅需要刪除課程還需考慮如何處理與其相關(guān)聯(lián)的章節(jié)及教學(xué)資源,此時將業(yè)務(wù)邏輯放到服務(wù)中是一種更合理的做法.

在領(lǐng)域?qū)ο笤O(shè)計過程中還應(yīng)該處理好對象之間的關(guān)系,通常領(lǐng)域?qū)ο笾g會相互產(chǎn)生各種聯(lián)系,甚至形成一個復(fù)雜的關(guān)系網(wǎng),比如在教學(xué)資源共享平臺中一門課程擁有多個教學(xué)章節(jié),這是一個典型的一對多關(guān)系;一位老師可以創(chuàng)建多門課程應(yīng)該也是一個一對多關(guān)系,但同樣的一對多關(guān)系在設(shè)計過程中還應(yīng)區(qū)別對待,對DDD中的領(lǐng)域模型而言,其設(shè)計目標(biāo)并非讓其具備完整的關(guān)聯(lián)關(guān)系,而是盡量的簡化關(guān)系.復(fù)雜的關(guān)聯(lián)關(guān)系只會讓管理對象生命周期變得困難,簡化關(guān)系可以采取刪除非基本關(guān)聯(lián)關(guān)系、添加約束減少多重性、雙向關(guān)聯(lián)轉(zhuǎn)為單項關(guān)聯(lián)等手段實現(xiàn).教學(xué)資源共享平臺的開發(fā)采用了Groovy語言,以Course領(lǐng)域?qū)ο笤O(shè)計為例,其代碼如下:

代碼中展示了Course與Lesson之間的一對多關(guān)系,因為Course與Lesson之間業(yè)務(wù)上緊密相連,其關(guān)系應(yīng)在模型中體現(xiàn).但在Course與Teacher之間的關(guān)系的處理上,考慮到邏輯上他們分屬兩個不同的模塊,Course領(lǐng)域?qū)ο笾芯S護(hù)其關(guān)系將導(dǎo)致額外的復(fù)雜性,因而并未在Course領(lǐng)域?qū)ο笾兄苯芋w現(xiàn)兩者之間的關(guān)系,而是通過teacherID維護(hù)其關(guān)聯(lián)關(guān)系,另外在代碼中通過設(shè)置約束來維護(hù)其關(guān)聯(lián)關(guān)系的完整性,比如定義一個約束用來保證只有課程的創(chuàng)建者才可以執(zhí)行課程的維護(hù),代碼如下:

def isCourseOwner(Teacher teacherInstance,Course courseInstance){

return courseInstance.teacher.id.equals(teacher-Instance.id)

}

在進(jìn)行刪除、修改等操作之前需要先調(diào)用該方法確認(rèn)當(dāng)前操作者與課程中TeacherID一致才可以繼續(xù)進(jìn)行.

3.2 應(yīng)用程序端口層設(shè)計實現(xiàn)

包圍領(lǐng)域模型的是應(yīng)用程序端口層它負(fù)責(zé)接收請求,并交由領(lǐng)域?qū)犹幚?,這一層很薄,主要起到協(xié)調(diào)作用.

3.3 適配器層與基礎(chǔ)設(shè)施層

適配器層是最外部的一層,它包含了與各種外部設(shè)備對接的適配器,比如針對Web瀏覽器用戶的適配器、針對數(shù)據(jù)庫交互的適配器、針對外部服務(wù)的適配器、甚至包括針對自身內(nèi)部操作的適配器等,這些適配器有些需要自行開發(fā)也有些可以利用基礎(chǔ)實施層的一些中間件來實現(xiàn)其功能.

教學(xué)資源共享平臺的基礎(chǔ)設(shè)施層主要利用了一些JavaEE開源組件來構(gòu)建,其中包括Hibernate實現(xiàn)數(shù)據(jù)持久化;Spring MVC框架實現(xiàn)IOC及AOP;JDBC實現(xiàn)數(shù)據(jù)庫驅(qū)動等.

4 結(jié)論

采用領(lǐng)域驅(qū)動設(shè)計的最大優(yōu)勢是直接將核心業(yè)務(wù)邏輯與領(lǐng)域模型結(jié)合起來,而不用向傳統(tǒng)軟件設(shè)計那樣分割為數(shù)據(jù)與行為,這種優(yōu)勢使其在復(fù)雜軟件設(shè)計中已成為主流思想,基于其設(shè)計教學(xué)資源共享平臺充分應(yīng)用了領(lǐng)域驅(qū)動設(shè)計方法的相關(guān)理論,在其四層參考架構(gòu)的基礎(chǔ)上研究了基于六邊形架構(gòu)的具體實現(xiàn),模糊了分層概念,更為充分的體現(xiàn)了軟件設(shè)計中高內(nèi)聚、低耦合的要求.

[1]Eric Evans.Domain-Driven Design[M].Boston:Addison-Wesley Professional,2003.

[2]Vaughn Vernon.Implementing Domain-Driven Design[M].Boston:Addison-Wesley Professional,2013.

[3]Mat Wall,Nik Silver.演進(jìn)架構(gòu)中的領(lǐng)域驅(qū)動設(shè)計.[EB/OL].王麗娟譯.http://www.infoq.com/cn/articles/ddd-evolving-architecture.2009.

[4]Jimmy Nilsson.領(lǐng)域驅(qū)動設(shè)計與模式實戰(zhàn)[M].趙俐,馬燕新,譯.北京:人民郵電出版社,2009.

[5]Alistair Cockburn.Hexagonal architecture.[EB/OL].http://alistair.cockburn.us/Hexagonal+architecture.2010.

猜你喜歡
資源共享架構(gòu)邏輯
基于FPGA的RNN硬件加速架構(gòu)
刑事印證證明準(zhǔn)確達(dá)成的邏輯反思
交通運(yùn)輸數(shù)據(jù)資源共享交換體系探究與實現(xiàn)
邏輯
創(chuàng)新的邏輯
功能架構(gòu)在電子電氣架構(gòu)開發(fā)中的應(yīng)用和實踐
福建省交通運(yùn)輸信息資源共享平臺
女人買買買的神邏輯
衛(wèi)康與九天綠資源共享
WebGIS架構(gòu)下的地理信息系統(tǒng)構(gòu)建研究