領域驅動設計(Domain Driven Design)

前言

什麼是軟件

軟件是一種被建立用來幫助咱們處理現代生活中複雜問題的工具,它只是到達目的的一種方法(不是必定要使用軟件)。
【手機、操做系統、IM、email】html

軟件的特色

  • 軟件必須是實際和有用的;
  • 軟件設計是一門藝術(程序員是一位手藝人);【木匠、工藝品、刺繡】
  • 完成軟件設計的方法多種多樣;(這裏單講ddd這種方法)

引出問題

在啓動一個軟件項目時,咱們應該關注軟件涉及的領域。軟件的最終目的是增進一個特定的領域。爲了達到這個目的,軟件須要和他服務的領域相得益彰。

爲了建立一個好的軟件,你必須知道這個軟件到底是什麼,主要解決什麼領域的問題。程序員

什麼是領域(Domain)

一個領域本質上能夠理解爲一個問題域 。只要肯定了軟件所屬的領域,那麼這個領域的核心業務(基本問題)就基本肯定了。安全

最佳實踐

讓軟件成爲該領域的映射。經過對領域進行建模(領域模型),對該領域模型進行實現。架構

領域通用語言(Ubiquitous Language)

爲了讓領域專家,設計人員,開發人員搭建溝通的橋樑。使用一門通用的語言。【UML、SQL】app

領域驅動設計(Domain-Driven Design)

領域驅動設計

領域驅動設計的核心是創建正確的領域模型。【怎麼創建領域模型】框架

步驟:模塊化

1. 以一種領域專家、設計人員、開發人員都能理解的通用語言做爲相互交流的工具,在交流的過程當中發現領域概念,而後將這些概念設計成一個領域模型;
2. 由領域模型驅動軟件設計,用代碼來實現該領域模型;

領域模型(Domain Model)

特色:
  1. 對具備某個邊界的領域的一個抽象,反映了領域內用戶業務需求的本質 。它屬於『解決問題空間』。領域模型是有邊界的,只反應了咱們在領域內所關注的部分,包括 實體概念(如:貨物,書本,應聘記錄,地址等),以及過程概念(如:資金轉帳等);
  2. 提升軟件的可維護性,業務可理解性以及可重用性。領域模型確保了咱們的軟件的業務邏輯都在一個模型中,幫助開發人員相對平滑地將領域知識轉化爲軟件構造;
  3. 貫穿軟件 分析、設計、開發 的整個過程。領域專家、設計人員、開發人員面向同一個模型進行交流,彼此共享知識與信息,因此能夠防止需求走樣,讓軟件開發人員作出來的軟件真正知足需求;要創建正確的領域模型並不簡單,須要領域專家、設計、開發人員積極溝通共同努力,而後才能使你們對領域的認識不斷深刻,從而不斷細化和完善領域模型;
  4. 爲了讓領域模型看的見,使用的經常使用表達領域模型的方式:圖、代碼或文字;
  5. 重要性:領域模型是整個軟件的核心,是軟件中最有價值和最具競爭力的部分;設計足夠精良且符合業務需求的領域模型可以更快速的響應需求變化;
構成要素

領域模型的要素

  1. 實體(entity):在整個系統的生命週期中擁有惟一的標識符的對象。(不該該給實體定義太多的屬性或行爲,而應該尋找關聯,將屬性或行爲轉移到其餘關聯的實體或值對象上。)【用戶user擁有惟一標識,大學university擁有惟一的標識】
  2. 值對象(value objects):若是兩個對象全部屬性的值都相同,咱們會認爲它們是同一個對象,那麼就能夠把這種對象設計爲值對象。沒有標識符的一個對象、不可變 的,即全部屬性都是隻讀的,因此能夠被安全的共享。【用戶user的地址信息address,大學專業】
  3. 領域服務(services): 領域中的一些概念不太適合建模爲對象(實體對象或值對象),由於它們本質上就是一些操做、動做,而不是事物。這些操做每每須要 協調多個領域對象。若是強行將這些操做職責分配給任何一個對象,則被分配的對象就是承擔一些不應承擔的職責,從而會致使對象的職責不明確很混亂。DDD認爲領域服務模式是一個很天然的範式用來對應這種跨多個對象的操做。通常的領域對象都是有狀態和行爲的,而領域服務沒有狀態只有行爲。【操做的集合,好比加密操做】
  4. 模塊(moudles):

對於一個大型的複雜應用而言,領域模型趨向於愈來愈大,模型到達了一個做爲總體很難討論的點,理解不一樣部件之間的關係和交互變得很困難。基於此緣由,頗有必要將模型組織進模塊。模塊被用來做爲 組織相關概念和任務以便下降複雜性的一種方法。而另外一個緣由則是模塊能夠提升代碼質量和可維護性,好比咱們常說的高內聚,低耦合就是要提倡將相關的類內聚在一塊兒實現模塊化。
模塊應當有對外的統一接口供其餘模塊調用,好比有三個對象在模塊a中,那麼模塊b不該該直接操做這三個對象,而是操做暴露的接口。模塊的命名也頗有講究,最好可以深層次反映領域模型。函數

  1. 聚合(aggregate):它經過定義對象之間清晰的所屬關係和邊界來實現領域模型的內聚,並避免了錯綜複雜的難以維護的對象關係網的造成。聚合定義了一組具備內聚關係的相關對象的集合,咱們把聚合看做是一個修改數據的單元。一個聚合中能夠包含多個實體和值對象,所以聚合也被稱爲根實體。【聚合中的對象密不可分】
  2. 工廠(Factory):體現封裝思想的模式。用來封裝建立一個複雜對象尤爲是聚合時所需的知識(變量),工廠的做用是將建立對象的細節隱藏起來。實體和聚合一般會很大很複雜,根實體的構造函數內的建立邏輯也會很複雜。實際上經過構造器努力構建一個複雜的聚合也與領域自己一般作的事情相沖突,在領域中,某些事物一般是由別的事物建立的(例如電器是在組裝線上被建立的)【所需即所得】
  3. 倉庫(Repository):資源庫用於保存和獲取聚合對象。【爲了數據落地】
  4. ...

領域驅動設計的經典分層架構

分層架構

分層的初衷

專一於展示領域模型。工具

將一個複雜的程序切分紅層開發每個層中內聚的設計,讓每一個層僅依賴於它底下的那層。遵守標準的架構模式以提供層之間的低耦合。【將領域模型相關的代碼從界面層、應用層和基礎設施層分隔出來】ui

概念
  1. 用戶界面/展示層

    負責向用戶展示信息以及解釋用戶命令。(請求應用層以獲取用戶所須要展示的數據;發送命令給應用層要求其執行某個用戶命令;)
  2. 應用層

    很薄的一層,定義軟件要完成的全部任務。對外爲展示層提供各類應用功能(包括查詢或命令),對內調用領域層(領域對象或領域服務)完成各類業務邏輯,應用層不包含業務邏輯。
  3. 領域層

    負責表達業務概念,業務狀態信息以及業務規則,領域模型處於這一層,是業務軟件的核心。
  4. 基礎設施層

    本層爲其餘層提供通用的技術能力;提供了層間的通訊;爲領域層實現持久化機制;總之,基礎設施層能夠經過架構和框架來支持其餘層的技術需求;

領域建模的方法

用例分析法、DDD的方法、四色建模法

四色建模法

某我的(Party)的角色(PartyRole)在某個地點(Place)的角色(PlaceRole)用某個東西(Thing)的角色(ThingRole)作了某件事情(MomentInterval)。

示例

PartyPlaceThing:簡稱PPT,用淡綠色表示,常見的PPT有:部門、崗位、人員、地點、物品等。
Description:簡稱Des,用淡藍色表示,主要用來對PPT進行描述,常見的Des有:部門類型、崗位層級、人員類型、地點區域、物品分類等。
Role:用淡黃色表示,主要表示PPT在某個場景下扮演的角色,常見的角色有:財務類部門、管理類崗位、請假者、銷售點、產品等。
MomentInterval:簡稱MI,用淡紅色表示,主要表示在一刻或一段時間內發生的一件事情,常見的MI有:部門移動、崗位移動、員工離職、產品銷售等。
MomentIntervalDetail簡稱MIDetail,用淡紅色表示,主要表示MI的明細,常見的MIDetail有銷售明細、入庫明細、出庫明細等。

參考

  1. http://www.cnblogs.com/netfocus/archive/2011/10/10/2204949.html
  2. http://www.javashuo.com/article/p-avrwzayx-de.html
  3. http://www.fanyilun.me/2018/04/08/%E8%B0%88%E8%B0%88%E9%A2%86%E5%9F%9F%E5%BB%BA%E6%A8%A1/
  4. https://www.cnblogs.com/Leo_wl/p/3866629.html#_label8
  5. https://www.jianshu.com/p/b6ec06d6b594
  6. https://infoq.cn/article/xh-four-color-modeling
  7. https://www.cnblogs.com/happyframework/archive/2013/04/26/3043515.html
  8. https://www.imooc.com/learn/1101
相關文章
相關標籤/搜索