領域驅動設計簡介 - danhaywood(點擊標題見原文)

18-12-26 banq
         

今天的企業應用程序無疑是復雜的,需要依靠一些專門技術(持久性,AJAX,Web服務等)來完成他們的工作。作為開發人員,我們傾向于關注這些技術細節,這是可以理解的。但事實是,一個不能解決業務需求的系統對任何人都沒用,無論它看起來多么漂亮或者如何很好地構建其基礎設施。

領域驅動設計(DDD)的理念- 首先由Eric Evans在他的同名書中描述 - 是關于將我們的注意力放在應用程序的核心,關注業務領域固有的復雜性本身。我們還將核心域(業務獨有)與支持子域(通常是通用的,如錢或時間)區分開來,并將更多的設計工作放在核心上。

領域驅動設計包含一組用于從領域模型構建企業應用程序的模式。在您的軟件生涯中,您可能已經遇到過許多這些想法,特別是如果您是OO語言的經驗豐富的開發人員。但將它們一起應用將允許您構建真正滿足業務需求的系統。

在本文中,我將介紹DDD的一些主要模式,了解一些新手似乎很難解決的問題,并突出顯示一些工具和資源,以幫助您在工作中應用DDD。

代碼和模型......

使用DDD,我們希望創建問題域的模型,持久性,用戶界面和消息傳遞的東西可以在以后再創建,這是需要理解的業務領域,因為正在構建的系統中,可以區分公司的業務、核心競爭力以及競爭對手情況。(如果不是這樣,那么考慮購買一個包裝好的產品)。

根據模型,我們不是指一個或一組圖表;?確實,圖表很有用,但它們不是模型,只是模型的不同視圖(參見圖)。模型是我們選擇在軟件中實現的一組概念,用代碼表示,以及用于構建交付系統的任何其他軟件工件。換句話說,代碼就是模型。文本編輯器提供了一種使用此模型的方法,盡管現代工具也提供了大量其他可視化(UML類圖,實體關系圖,Spring beandocs,Struts / JSF流等)。

圖1:模型與模型的視圖

這是DDD模式中的第一個概念:模型驅動設計。這意味著能夠將模型中的概念映射到設計/代碼的概念(理想情況下),模型的變化意味著代碼的變化;?更改代碼意味著模型已更改。DDD并沒有強制要求您使用面向對象來構建領域 - 例如,我們可以使用規則引擎構建模型 - 但是考慮到主要的企業編程語言是基于OO的,大多數模型本質上都是OO。畢竟,OO基于建模范例。模型的概念將表示為類和接口,作為類成員的職責。

談談語言

現在讓我們看一下領域驅動設計的另一個基本原則。回顧一下:我們想要捕獲一個問題域的域模型,并且我們將在代碼/軟件工件中表達成某種理解。為了幫助我們做到這一點,DDD提倡領域專家和開發人員有意識地使用模型中的概念進行溝通。因此,領域專家不會根據屏幕上的字段或菜單項來描述新的用戶故事需求,而是討論領域對象所需的基礎屬性或行為。類似地,開發人員不會討論數據庫表中的數據列以及新字段類型。

DDD嚴格要求我們開發出一種無處不在的語言。如果一個想法不能輕易地明確表達,那么它實際上在暗示背后有一個概念,這個概念在領域模型中缺失了,并且團隊需要共同努力找出缺失的概念是什么。一旦建立了這個,那么數據庫表中的屏幕或數據表列上的新字段等結果就自然產生。

像DDD一樣,這種發現無處不在的語言的想法并不是一個新想法:XPers稱之為“名稱系統”,多年來DBA將數據字典放在一起。但無處不在的語言一個令人回味的術語,可以出售給商業和技術人員。現在,“整個團隊”敏捷實踐正在成為主流,這也很有意義。

模型和上下文......

每當我們討論模型時,它總是在某種情況下(某種背景條件下),通常可以從使用該系統的最終用戶的使用情況來推斷出這個上下文背景。比如,我們有一個部署到交易員前臺的交易系統,或超市收銀員使用的銷售點系統,這些用戶以特定方式與模型的概念相關,并且模型的術語對這些用戶有意義,但不一定對該上下文之外的任何其他人有意義。DDD稱之為有界上下文(BC)。每個域模型都只存在于一個BC中,BC只包含一個域模型。

我必須承認,當我第一次讀到關于BC時,我看不出重點:如果BC與領域模型一樣,為什么要引入一個新術語?如果只有最終用戶與BC進行了互動,那么也許就不需要這個術語了。然而,不同的系統(BC)也相互交互,發送文件,傳遞消息,調用API等。如果我們知道有兩個BC相互交互,那么我們知道我們必須注意進行概念之間進行轉換:此域和其他域之間。

在模型周圍設置明確的邊界也意味著我們可以開始討論這些BC之間的關系。實際上,DDD確定了BC之間的一整套關系,因此當我們需要將不同的BC鏈接在一起時,我們可以合理地確定應該做什么:

  • 已發布的語言published language:交互式BC是就共同的語言(例如企業服務總線上的一堆XML模式)達成一致,通過它們可以相互交互;
  • 開放主機服務open host service:BC指定任何其他BC可以使用其服務的協議(例如RESTful Web服務);
  • 共享內核shared kernel:兩個BC使用一個共同的代碼內核(例如一個庫)作為一個共同的通用語言,但是否則以他們自己的特定方式執行其他的東西;
  • 發布/訂閱customer/supplier:一個BC使用另一個BC的服務,并且是另一個BC的利益相關者(客戶端)。因此,它可以影響該BC提供的服務;
  • 跟從者conformist:一個BC使用另一個BC的服務,但不是其他BC的利益相關者。因此,它使用“原樣”(符合)BC提供的協議或API;
  • 防腐敗層anti-corruption layer:一個BC使用另一個服務而不是利益相關者,但旨在通過引入一組適配器 - 反腐敗層來最小化BC所依賴的變化所帶來的影響。

你可以看到,在這個列表中,兩個BC之間的合作耦合水平是逐漸降低(見圖2)。使用已發布的語言,我們從BC建立一個可以與之交互的共同標準,我們不擁有這種語言,而是擁有它們所在的企業(甚至可能是行業標準)。有了開放主機服務,我們仍然做得很好;?BC提供其作為任何其他BC調用的運行時服務的功能,但隨著服務的發展(可能)將保持向后兼容性。

圖2:有界上下文關系的譜

然而,當我們走向跟從模式時,我們只是一起調用和被調用;?一個BC明顯屈服于另一個。如果我們必須與購買megabucks的總分類帳系統集成,那可能就是我們所處的情況。如果我們使用反腐敗層,?那么我們通常會與遺留系統集成,但是額外的層將我們盡可能地隔離開來。當然,這需要花錢來實施,但它降低了依賴風險。反腐敗層也比重新實現遺留系統便宜很多,這最多會分散我們對核心域的注意力,最壞的情況是以失敗告終。

DDD建議我們制定一個BC圖來識別我們的BC以及我們依賴或依賴的BC,以確定這些依賴關系的性質。圖3顯示了我過去5年左右一直在研究的系統的上下文映射。

圖3:上下文映射示例

所有這些關于有界上下文圖和BC的討論有時被稱為戰略性DDD,并且是有充分的理由的。畢竟,當你想到它時,弄清楚BC之間的關系是非常具有戰略重要的:我的系統將依賴哪些上游系統,我是否容易與它們集成,我是否有利用它們,我相信它們嗎?下游也是如此:哪些系統將使用我的服務,如何將我的功能作為服務公開,他們是否會對我有利?誤解了這一點,您的應用程序可能很容易失敗。

層和六邊形

現在讓我們轉向內部并考慮我們自己的BC(系統)的架構。從根本上說,DDD只關心領域層,實際上它并沒有很多關于其他層的說法:比如表現層,應用程序層或基礎架構層(或持久層)。但它確實期望它們存在。這是分層架構模式(圖4)。

圖4:分層架構

當然,我們多年來一直在構建多層系統,但這并不意味著我們必須擅長它。確實,過去的一些主流技術 - 例如EJB 2,對,我說的是它!?- 對領域模型可以作為有意義的層存在的想法產生了積極的影響。所有的業務邏輯似乎滲透到應用層或(更糟糕的)表現層,留下一組貧血的領域對象作為數據持有者的空殼(DTO或VO),這不是DDD的意思。

因此,要絕對清楚,應用程序層中不應存在任何領域邏輯。相反,應用程序層負責事務管理和安全性等事務。在某些架構中,它還可能負責確保從基礎結構/持久層中檢索的領域對象在與之交互之前已正確初始化(盡管我更喜歡基礎結構層執行此操作)。

如果表現層有單獨的存儲空間中(比如手機終端),應用層也充當表現層和領域層之間的中介。表現層通常處理領域對象或其他對象(數據傳輸對象或DTO)的可序列化表示,通常每個“視圖”一個。如果這些被修改,則表示層將對應用程序層的任何更改發送回去,而應用程序層確定已修改的領域對象,并從持久層加載它們,然后轉發對這些領域對象的更改。

分層架構的一個缺點是:它從表現層一直到基礎結構層的依賴性是線性的。但是,我們可能希望在表現層和基礎結構層中支持不同的實現。如果我們想測試我們的應用程序肯定是這樣的:

  • 例如,FitNesse等工具允許我們從最終用戶的角度驗證我們系統的行為。但是這些工具通常不會通過表示層,而是直接返回到下一層,即應用層。所以從某種意義上說,FitNesse就是另一種觀察者。
  • 同樣,我們可能有多個持久性實現。我們的生產實現可能使用RDBMS或類似技術,但是對于測試和原型設計,我們可能有一個輕量級實現(甚至可能在內存中),因此我們可以模擬持久性。

我們可能還想區分“內部”和“外部”層之間的交互,其中內部我指的是兩個層完全在我們的系統(或BC)內的交互,而外部交互跨越BC。

因此,不要將我們的應用程序視為一組圖層,另一種方法是將其視為六邊形,如圖5所示。我們的最終用戶使用的是查看器以及FitNesse測試使用內部客戶端API(或端口),而來自其他BC的調用(例如,RESTful用于開放主機交互,或來自ESB適配器的調用用于已發布的語言交互)命中外部客戶端端口。對于后端基礎架構層,我們可以看到用于替代對象存儲實現的持久性端口,此外,領域層中的對象可以通過外部服務端口調用其他BC。

圖5:六邊形結構

領域驅動設計簡介之二

         

1
sinaID45094
2019-10-16 15:17

怎么看著像google翻譯過來的...

一级黄色录像影片 夫妻性生活影片 免费在线观看 一级a做爰片