1.引言

我們還是先來拆詞理解,領(lǐng)域模型可以拆為“領(lǐng)域”和“模型”二詞。

  • 領(lǐng)域:按照我們之前的文章的理解,DDD中的領(lǐng)域是指軟件系統(tǒng)要解決的問題,如我們的辦公設(shè)備公眾號(hào)在線商城就是為了解決電商問題,對(duì)應(yīng)的就是電商領(lǐng)域。

  • 模型:百度百科解釋為對(duì)于某個(gè)實(shí)際問題或客觀事物、規(guī)律進(jìn)行抽象后的一種形式化表達(dá)方式。如戶型圖就是實(shí)際房屋結(jié)構(gòu)的模型。

把兩個(gè)詞結(jié)合起來,我們給領(lǐng)域模型下個(gè)定義:領(lǐng)域模型是對(duì)我們軟件系統(tǒng)中要解決問題的抽象表達(dá)。

這個(gè)理解還是很生澀,沒關(guān)系,容我娓娓道來。

2.領(lǐng)域模型的來歷和作用

我們知道,軟件開發(fā)過程主要包括:需求分析、概要設(shè)計(jì)、詳細(xì)設(shè)計(jì)、編碼、測(cè)試、軟件交付、驗(yàn)收、維護(hù)。其實(shí)簡(jiǎn)單來說就是分析、設(shè)計(jì)和實(shí)現(xiàn)。

而傳統(tǒng)的軟件開發(fā)方式中,系統(tǒng)分析、設(shè)計(jì)和實(shí)現(xiàn)三個(gè)階段完全脫節(jié),最后開發(fā)出來的軟件不能很好的滿足業(yè)務(wù)需求,在未來也不能很好的適應(yīng)需求變化進(jìn)行功能演進(jìn)。

那在DDD中是如何做到呢,下面我們就從以下幾個(gè)問題來分析說明。

  1. 怎樣確保最終的軟件設(shè)計(jì)能滿足客戶需求且適應(yīng)變化?
    那就要保證系統(tǒng)分析、設(shè)計(jì)和實(shí)現(xiàn)不脫節(jié)。

  2. 那如何做到不脫節(jié)呢?
    如果按照我的理解,那就需要有某一個(gè)東西能貫穿整個(gè)開發(fā)流程,來銜接分析、設(shè)計(jì)和實(shí)現(xiàn)三個(gè)階段。

  3. 那這個(gè)東西是什么呢?
    聰明如你,是的,就是我們今天的主題——領(lǐng)域模型。

  4. 那領(lǐng)域模型是如何做到的呢?
    在分析階段,所有的參與人員(領(lǐng)域?qū)<?、設(shè)計(jì)人員、開發(fā)人員等)對(duì)業(yè)務(wù)進(jìn)行需求分析,通過大家的不斷交流討論,提取出業(yè)務(wù)規(guī)則和流程中的關(guān)鍵詞匯和概念形成通用語言,進(jìn)而發(fā)現(xiàn)領(lǐng)域概念,隨著大家對(duì)領(lǐng)域的認(rèn)識(shí)不斷深入,通用語言的詞匯也會(huì)不斷豐富和精準(zhǔn),從而確保了業(yè)務(wù)需求的正確表達(dá)。
    在設(shè)計(jì)階段,以通用語言為交流基礎(chǔ),將發(fā)掘的領(lǐng)域概念進(jìn)行領(lǐng)域模型設(shè)計(jì),以面向?qū)ο蟮乃枷氤橄蟪鰧?shí)體,確定實(shí)體所對(duì)應(yīng)的方法和屬性,以及實(shí)體之間的關(guān)系。然后將這些實(shí)體和實(shí)體之間的關(guān)系以某種形式展現(xiàn)出來,形成領(lǐng)域模型。
    在實(shí)現(xiàn)階段,開發(fā)人員根據(jù)確立的領(lǐng)域模型進(jìn)行代碼實(shí)現(xiàn),做到代碼與模型的綁定,從而實(shí)現(xiàn)了設(shè)計(jì)和實(shí)現(xiàn)階段的銜接。
    通過這樣一種方式,我們實(shí)現(xiàn)了語言、模型、代碼三者緊密綁定,確保開發(fā)出來的軟件來準(zhǔn)確反應(yīng)需求并能適應(yīng)變化。

通過上面對(duì)領(lǐng)域模型的來歷和作用的介紹,我們對(duì)領(lǐng)域模型就有了一個(gè)大致的印象。

3.案例分析

按照上面的理解,領(lǐng)域模型無非就是綜合了系統(tǒng)分析和設(shè)計(jì)的產(chǎn)物,而這個(gè)產(chǎn)物我們正好可以通過UML來展示,下面我們就結(jié)合辦公設(shè)備微信公眾號(hào)在線商城案例,簡(jiǎn)單對(duì)銷售子域進(jìn)行領(lǐng)域模型設(shè)計(jì)。