4.1.5 領域驅動設計
在處理復雜業(yè)務邏輯時,Domain Model模式非常有用。而DDD(Domain-Driven Design,領域驅動設計)就是一種流行的利用Domain Model模式的設計方法學。
簡而言之,DDD就是一組幫助人們構建能夠反映業(yè)務理解并滿足業(yè)務需求的應用程序的模式和原則。除此之外,它還是一種思考開發(fā)方法學的新方法。DDD探討對真實領域建模,首先要全面理解該領域,并將所有的術語、規(guī)則和邏輯放入到代碼的抽象表示(通常是以領域模型的形式)中。
下面將介紹DDD的主要方面,這是本書剩余部分中的大多數練習均要使用的方法學。
1. 通用語言
通用語言(ubiquitous language)的概念是,它應該充當一個公共詞匯表,開發(fā)者、領域專家及任何其他參與項目的人都使用它來描述該領域。領域專家具有特定領域知識和技能,并且在開發(fā)領域模型的過程中與您密切協作,以確保在嘗試使用代碼表示業(yè)務模型之前完全理解該模型。在貸款應用程序中,擔保人就可能是領域專家。通過聽取此人的講解,可以構建一個囊括了在申請貸款過程中使用的所有術語的詞匯表。所編寫的類、方法和屬性名稱都應該基于同樣的通用語言。這可以讓您使用領域專家能夠理解的語言來談論代碼。此外,接觸該代碼的新開發(fā)者也應該能夠了解該領域。它還讓他們能夠以相對容易的方式與業(yè)務專家談論復雜業(yè)務邏輯的哪怕是最細微的細節(jié)。當參與應用程序開發(fā)的各方都使用相同的語言時,人們就可以容易地表達問題和解決方法,從而讓應用程序更快、更容易地構建。
DDD并不是一個框架,但它確實有一組構建塊或概念可供整合到解決方案中。在下面將逐個介紹這些概念。
2. 實體
實體就是4.1.3小節(jié)中曾經討論過的事物,如電子商務網站中的訂單、客戶、商品,博客應用程序中的博客和帖子對象。它們以一種抽象的方式包含了真實實體中的數據和行為。任何與實體相關的邏輯都應該包含在它內部。實體屬于需要標識符的事物,在其整個生命周期中,該標識符都將保持不變??紤]貸款應用程序中的借款人。借款人有姓名,但姓名可能變化也可能重復,因此需要添加一個單獨的標識,借款人在該借款應用程序的整個生命周期中該標識將保持不變,無論其姓名、職業(yè)或地址改變與否。通常,系統(tǒng)使用某種唯一標識符或自動編號值來為所有無法采用自然方式標識的實體提供標識符。有時候,實體確實具有自然鍵,如社會保險號或員工號碼。并不是領域模型中的所有對象都是唯一的而且需要標識。對于某些對象,數據是最重要的,而不是標識。這些對象就被稱為值對象。
3. 值對象
值對象沒有標識,它們之所以重要只是因為它們的特性。值對象通常并不會單獨存在,它們通常是(但并非總是)實體的屬性?;仡?.1.3小節(jié)中編寫的簡單銀行賬號應用程序,應該記得Transaction對象沒有標識,這是因為它只存在于與之相關的銀行賬號實體中,它是一個值對象,在其上下文中它本身并不單獨存在。