DDD理论学习系列(2)-- 领域
1. 引言
領域一詞,主要有以下兩個意思:
一國主權所達之地。
學術思想或社會活動的范圍。
不管是指國家的主權范圍也好還是學術活動范圍,都是在講一個范圍,一個界限。
比如我們常說的,學術領域、思想領域、技術領域、語言領域、物理領域、醫學領域、游戲領域、JAVA領域、.NET領域等等,它們中不管是泛指還是特指某個領域,都是限定在某個范圍之內的。
由此可見領域一詞重在范圍的界限。
下面我們就回歸正傳,DDD,Domain Drive Design,全稱,領域驅動設計。那這個領域具體指什么呢,在DDD中有什么特殊含義呢?
2. DDD中的領域
我們要先弄明白DDD是干什么的。
DDD是一種綜合軟件系統分析和設計的面向對象建模方法,旨在幫我們設計高質量的軟件模型,是一種解決復雜中大型軟件的一套行之有效的方式。
那既然是用來解決軟件問題,那自然要弄清楚軟件系統的業務需求。
那就以我們之前的辦公設備微信公眾號開發的案例為例,來分析一下。
雖然是微信公眾號開發,但其實涉及到的主要是商品、用戶、訂單、報價、支付、物流、報修相關業務,其本質還是電子商務系統開發。
反過來看,任何電子商務網站也都涉及到商品、用戶、訂單、支付、物流這些核心業務,而這也正是所有電商領域都會涉及到的業務。
其實不管是普通的電子商務網站,還是像京東、淘寶、亞馬遜這樣的電商平臺,其本質都是電商領域,只不過是系統的復雜性不同而已。
所以我們的案例也就可以理解為一個基于微信公眾號平臺的電商領域普通電子商務網站的開發。
通過以上的舉例說明,只是想說明,DDD中的領域也并沒有什么特別之處,它只是被界限在指定的業務需求之中,有了更清楚的范圍邊界。
其實也可以參照原著《領域驅動設計:軟件核心復雜性應對之道》的總結:
一個領域本質上可以理解為就是一個問題域,只要是同一個領域,那問題域就相同。所以,只要我們確定了系統所屬的領域,那這個系統的核心業務,即要解決的關鍵問題、問題的范圍邊界就基本確定了。
弄清了業務領域,接下來就是領域的拆分。下面我們就來細化我們案例中的業務場景,來介紹引入的核心域和子域的概念。
3. 子域
回到我們的案例,基于微信公眾號的電子商務網站的開發。
我們先拋開DDD,按照我們傳統的開發設計思路,以數據優先的方式,上來就建表寫代碼,而且按照我們一貫的作風,肯定會先設計Product表,因為電商的哪一個環節都跟商品息息相關,在這里Product對象就是一個核心對象。
那既然Product對象是核心對象,那Product對象所處的領域--商品列表領域,是不是就是我們這一節講的核心域?
答案是否定的。
DDD跟我們傳統的軟件開發設計過程不同,它注重領域建模。
在了解了業務領域的業務規則之后,我們為了完成對一個復雜領域的分析,往往我們要先簡化之,即領域拆分。可以理解為把領域中的復雜大問題,拆分成小問題,各個擊破。也就是將一個領域拆分成多個子域,再針對每個子域進行分析。而子域又可以分為核心域、通用子域、支撐子域。
那什么是核心域、通用子域、支撐子域呢?
下面我們就對我們的案例進行拆分來梳理這些概念。
對于我們的案例涉及到的業務,商品、用戶、訂單、報價、支付、物流、報修相關業務,我們可以大致拆分成以下幾個子域:
商品子域
用戶子域
銷售子域
訂單子域
支付子域
物流子域
維修子域
3.1 核心域
如果從幾個子域中確定核心域,這也許難以決定,沒關系。我們先來回答一個問題。
什么是電商網站?在線商品買賣平臺。
電商領域的核心就是為了商品買賣,
我們知道開發這個電商網站的目的是為了尋求推廣和銷售利潤的最大化。
所以自然而然核心域就是銷售子域了。
為什么要先確定核心域?
因為作為一個業務的核心存在,它最能體現系統的核心價值,也是核心競爭力。如果要最大化系統的價值,我們必然要在核心域的設計上更勝一籌。
確定核心域后,我們在進行開發設計的時候就有了主次之分。
3.2 通用子域
通用子域,顧名思義,也就是服務于整個業務領域。比如我們要為該網站提供一個日志系統,用來記錄一些日志。我們可以設計一個日志子域來供其他子域使用。
3.3 支撐子域
支撐子域的作用于業務系統的某些重要業務而非核心業務,它關注于業務的某一方面,來支撐完善業務系統。
我們劃分的子域中除了銷售子域,其他都可以說是支撐子域。
比如物流子域,就是專注于物流相關業務,支撐著訂單發貨以及物流跟蹤的重要流程。
4. 總結
本節主要結合案例,簡要梳理了DDD中領域、核心域、通用子域、支撐子域的定義。
領域是有范圍界限的,也可以說是有邊界的。
核心域是業務系統的核心價值所在,承載著一個系統的重中之重。
通用子域可以理解為業務系統所有子域的消費者,提供著通用服務。
支撐子域專注于業務系統的某一重要的業務,來支撐和完善業務系統。
這一節遺留了一個問題,那就是文章開頭就說領域是有范圍界限的,但這個范圍界限在DDD中如何表述呢?這就是下一篇文章要講的——限界上下文。
相關文章
DDD理論學習系列(1)-- 通用語言
DDD領域驅動之干貨 (一)
從事件和DDD入手來構建微服務
WeText項目:一個基于.NET實現的DDD、CQRS與微服務架構的演示案例
【DDD/CQRS/微服務架構案例】在Ubuntu 14.04.4 LTS中運行WeText項目的服務端
原文地址:http://www.cnblogs.com/sheng-jie/p/6865784.html
.NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注
總結
以上是生活随笔為你收集整理的DDD理论学习系列(2)-- 领域的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 活动 | Unity带你亲临王者荣耀KP
- 下一篇: RabbitMQ系列教程之三:发布\/订