日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

DDD驅(qū)動如何設計?如何進行領域建模?

jf_ro2CN3Fa ? 來源:技術瑣話 ? 2023-07-18 14:11 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

7.1什么是DDD

DDD是Eric Evans在2003年出版的《領域驅(qū)動設計:軟件核心復雜性應對之道》(Domain-Driven Design: Tackling Complexity in the Heart of Software)一書中提出的具有劃時代意義的重要概念,是指通過統(tǒng)一語言、業(yè)務抽象、領域劃分和領域建模等一系列手段來控制軟件復雜度的方法論。

DDD的革命性在于領域驅(qū)動設計是面向?qū)ο蠓治龅姆椒ㄕ摚梢岳妹嫦驅(qū)ο蟮奶匦裕ǚ庋b、多態(tài))有效地化解復雜性,而傳統(tǒng)J2EE或Spring+Hibernate等事務性編程模型只關心數(shù)據(jù)。這些數(shù)據(jù)對象除了簡單的setter/getter方法外,不包含任何業(yè)務邏輯,業(yè)務邏輯都是以過程式的代碼寫在Service中。這種方式極易上手,但隨著業(yè)務的發(fā)展,系統(tǒng)也很容易變得混亂復雜。

7.2初步體驗DDD

在介紹DDD之前,我喜歡用這個銀行轉(zhuǎn)賬的案例來做一個DDD和事務腳本(Transaction Script)的簡單對比。我們要實現(xiàn)一個銀行轉(zhuǎn)賬的功能,如果用傳統(tǒng)的事務腳本方式實現(xiàn),業(yè)務邏輯通常會被寫在MoneyTransferService中,而Account僅僅是getters和setters的數(shù)據(jù)結構,也就是所謂的“貧血模式”。其代碼如下所示:

publicclassMoneyTransferServiceTransactionScriptImpl
implementsMoneyTransferService{
privateAccountDaoaccountDao;
privateBankingTransactionRepositorybankingTransactionRepository;
...
@Override
publicBankingTransactiontransfer(
StringfromAccountId,StringtoAccountId,doubleamount){
AccountfromAccount=accountDao.findById(fromAccountId);
AccounttoAccount=accountDao.findById(toAccountId);
...
doublenewBalance=fromAccount.getBalance()-amount;
switch(fromAccount.getOverdraftPolicy()){
caseNEVER:
if(newBalance

上述代碼有些讀者可能會比較眼熟,因為大部分系統(tǒng)都是這么寫的。評審完需求,工程師畫幾張UML圖完成設計,就開始像上面這樣寫業(yè)務代碼了,這樣寫基本不用太動腦筋,完全是過程式的代碼風格。

同樣的業(yè)務邏輯,接下來看使用領域建模是怎么做的。在使用DDD之后,Account實體除賬號屬性之外,還包含了行為和業(yè)務邏輯,比如debit()和credit()方法。

publicclassAccount{
privateStringid;
privatedoublebalance;
privateOverdraftPolicyoverdraftPolicy;
...
publicdoublebalance(){returnbalance;}
publicvoiddebit(doubleamount){
this.overdraftPolicy.preDebit(this,amount);
this.balance=this.balance-amount;
this.overdraftPolicy.postDebit(this,amount);
}
publicvoidcredit(doubleamount){
this.balance=this.balance+amount;
}}

透支策略OverdraftPolicy也不僅僅是一個Enum了,而是被抽象成包含業(yè)務規(guī)則并采用策略模式的對象。

publicinterfaceOverdraftPolicy{
voidpreDebit(Accountaccount,doubleamount);
voidpostDebit(Accountaccount,doubleamount);}publicclassNoOverdraftAllowedimplementsOverdraftPolicy{
publicvoidpreDebit(Accountaccount,doubleamount){
doublenewBalance=account.balance()-amount;
if(newBalance

而Domain Service只需要調(diào)用Domain Entity對象完成業(yè)務邏輯。

publicclassMoneyTransferServiceDomainModelImpl
implementsMoneyTransferService{
privateAccountRepositoryaccountRepository;
privateBankingTransactionRepositorybankingTransactionRepository;
...
@Override
publicBankingTransactiontransfer(
StringfromAccountId,StringtoAccountId,doubleamount){
AccountfromAccount=accountRepository.findById(fromAccountId);
AccounttoAccount=accountRepository.findById(toAccountId);
...
fromAccount.debit(amount);
toAccount.credit(amount);
BankingTransactionmoneyTransferTransaction=
newMoneyTranferTransaction(fromAccountId,toAccountId,amount);
bankingTransactionRepository.addTransaction(moneyTransferTransaction);
returnmoneyTransferTransaction;
}}

通過DDD重構后,雖然類的數(shù)量比以前多了一些,但是每個類的職責更加單一,代碼的可讀性和可擴展性也隨之提高。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權限、多租戶、數(shù)據(jù)權限、工作流、三方登錄、支付、短信、商城等功能

項目地址:https://github.com/YunaiV/yudao-cloud

視頻教程:https://doc.iocoder.cn/video/

7.3數(shù)據(jù)驅(qū)動和領域驅(qū)動

7.3.1數(shù)據(jù)驅(qū)動

目前主流的開發(fā)模式是由數(shù)據(jù)驅(qū)動的。數(shù)據(jù)驅(qū)動的開發(fā)很容易上手,

有了業(yè)務需求,創(chuàng)建數(shù)據(jù)庫表,然后編寫業(yè)務邏輯,開發(fā)過程如圖7-1所示。數(shù)據(jù)驅(qū)動以數(shù)據(jù)庫為中心,其中最重要的設計是數(shù)據(jù)模型,但隨著業(yè)務的增長和項目的推進,軟件開發(fā)和維護的難度會急劇增加。

a6587c8e-2531-11ee-962d-dac502259ad0.png

圖7-1數(shù)據(jù)驅(qū)動研發(fā)過程

以客戶關系管理(Customer Relationship Management,CRM)為例,其中很重要的概念有銷售、機會、客戶、私海、公海,實體的定義分別如下。

銷售(Sales):公司的銷售人員,一個銷售可以擁有多個銷售機會。

機會(Opportunity):銷售機會,每個機會包含至少一個客戶信息,且歸屬于一個銷售人員。

客戶(Customer):客戶,也就是銷售的對象。

私海(Private sea):專屬于某個銷售人員的領地(Territory),私海里面的客戶,其他銷售人員不能觸碰。

公海(Public sea):公共的領地,所有銷售人員都可以從公海里撿入客戶到其私海。

按照我們曾經(jīng)學習的數(shù)據(jù)庫建模理論,對于上面的場景,不難畫出圖7-2所示的實體聯(lián)系(Entity Relationship,ER)圖。

a6656a02-2531-11ee-962d-dac502259ad0.png

圖7-2CRM的ER圖

可以看到,圖7-2所示的ER圖中不存在公海和私海,因為所謂的機會在私海,就是這個機會是不是歸屬某個銷售,這樣我們只需要看機會上是否有salesId。如果有,說明機會被某個銷售占有,也就是在私海中;反之,這個機會就在公海中。

在這種開發(fā)模式下,最后的產(chǎn)出是幾張數(shù)據(jù)庫表,以及針對表中數(shù)據(jù)進行操作的事務腳本,如圖7-3所示。

a67ffa20-2531-11ee-962d-dac502259ad0.png

圖7-3事務腳本實現(xiàn)

7.3.2領域驅(qū)動

領域驅(qū)動設計關心的是業(yè)務中的領域劃分(戰(zhàn)略設計)和領域建模(戰(zhàn)術設計),其開發(fā)過程不再以數(shù)據(jù)模型為起點,而是以領域模型為出發(fā)點,研發(fā)過程如圖7-4所示。領域模型對應的是業(yè)務實體,在程序中主要表現(xiàn)為類、聚合根和值對象,它更加關注業(yè)務語義的顯性化表達,而不是數(shù)據(jù)的存儲和數(shù)據(jù)之間的關系。 這是“領域驅(qū)動設計”和“數(shù)據(jù)驅(qū)動設計”之間顯著的區(qū)別。

a68bec2c-2531-11ee-962d-dac502259ad0.png

圖7-4領域驅(qū)動研發(fā)過程

仍以上面的CRM為例。假如我們先不考慮數(shù)據(jù)模型,而是采用面向?qū)ο蠓治觯∣bject Oriented Analysis,OOA)對這個場景進行領域建模,那么可以得到圖7-5所示的領域模型。

a6a14a4a-2531-11ee-962d-dac502259ad0.png

圖7-5CRM的領域模型

可以看到,在圖7-5中,領域模型的描述更加貼近業(yè)務,一些重要的業(yè)務術語和概念沒有丟失,更完整地表達了業(yè)務語義。即使是產(chǎn)品經(jīng)理或者業(yè)務人員,也不難看懂這樣的領域模型,甚至他們可以和技術人員一起參與到梳理領域模型和創(chuàng)建活動中來。

通過DDD的戰(zhàn)略設計和戰(zhàn)術設計,我們可以為問題域劃分出合適的子域,并對域中的業(yè)務進行建模。圖7-6所示是我們在實際工作中為CRM進行的領域戰(zhàn)略設計。

a6ba018e-2531-11ee-962d-dac502259ad0.jpg

圖7-6CRM的領域劃分

7.3.3ORM

很明顯,領域模型和數(shù)據(jù)模型并不是一一對應的關系,但也不排除,有些情況領域模型和數(shù)據(jù)模型是趨同的,但是大部分情況都需要做一層映射(Mapping)。為了彌補二者之間的差異,行業(yè)先驅(qū)們做了很多關于映射工作的嘗試,這種技術有一個名稱叫作對象關系映射(Object Relationship Mapping,ORM),如圖7-7所示。

a6d87678-2531-11ee-962d-dac502259ad0.png

圖7-7對象關系映射

ORM曾經(jīng)非常火,記得當年Hibernate才出現(xiàn)時,我用盡了其中的高級技巧,比如繼承關系映射、多對多關系映射……結果弄出來的東西卻變成了“四不像”,既不像Entity,也不像數(shù)據(jù)對象(Data Object,DO)。

ORM的問題在于它太理想化,期望通過工具把數(shù)據(jù)建模和領域建模合一,這樣的嘗試注定是很難成功的。仍以上述的CRM案例為例,在數(shù)據(jù)模型中根本就沒有私海和公海這兩個實體,工具是無法映射的。因此,Hibernate和JPA的衰落是可以預見的?,F(xiàn)在使用最多的是MyBatis,它很簡單,完全不理會復雜的關系和對象之間的復雜關系映射,只做數(shù)據(jù)庫表和DO之間的簡單映射。

復雜的數(shù)據(jù)庫關系和對象關系之間的差異,其本質(zhì)是數(shù)據(jù)模型和領域模型之間的差異,而這種差異的多樣性和靈活性是很難通過規(guī)則預先定義的,這也是為什么工具的作用會很有限?,F(xiàn)在的互聯(lián)網(wǎng)大廠大多使用MyBatis,原因也在于此。因此,如果你打算實踐DDD,請一定不要讓工具幫你去建模,工具不會抽象,也不會思考,還是要老老實實自己動手去建。






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • CRM
    CRM
    +關注

    關注

    1

    文章

    153

    瀏覽量

    22177
  • 數(shù)據(jù)驅(qū)動器

    關注

    0

    文章

    5

    瀏覽量

    6273
  • ddd
    ddd
    +關注

    關注

    0

    文章

    23

    瀏覽量

    3111

原文標題:DDD的精髓

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Android APP如何進行訪問硬件驅(qū)動

    本文我們要講的是在用 i.MX8 平臺開發(fā)時,Android APP 如何進行訪問硬件驅(qū)動。
    的頭像 發(fā)表于 12-04 13:50 ?3470次閱讀
    Android APP如<b class='flag-5'>何進行</b>訪問硬件<b class='flag-5'>驅(qū)動</b>

    何進行FSM任意狀態(tài)建模

    兩個快速問題:1)我有以下狀態(tài)圖:如您所見,一些狀態(tài)轉(zhuǎn)換是明確確定的,一些轉(zhuǎn)換是任意的。例如,當處于空閑狀態(tài)時,下一狀態(tài)可以是就緒狀態(tài)或保持空閑狀態(tài)。我怎樣才能在VHDL中對此進行建模(不是一切
    發(fā)表于 10-31 07:18

    基于領域建模的數(shù)控系統(tǒng)代碼生成技術

    為提高數(shù)控軟件系統(tǒng)開發(fā)效率,提出基于領域建模的代碼自動生成開發(fā)方法。該方法在數(shù)控領域元模型的基礎上建立了數(shù)控系統(tǒng)的建模環(huán)境,以模型數(shù)據(jù)到源代碼的映射規(guī)則庫為基
    發(fā)表于 04-02 08:36 ?11次下載

    綜合航電領域建模技術研究

    為了方便對綜合化航空電子系統(tǒng)的領域建模,通過對綜合航電系統(tǒng)的領域分析,提出了綜合航電系統(tǒng)的參考模型;在此基礎上,使用通用建模環(huán)境GME設計了綜合航電系統(tǒng)的系統(tǒng)級、模塊級、分區(qū)級以及進程級的元模型
    發(fā)表于 01-04 14:55 ?0次下載

    黑客攻防入門與進階ddd

    黑客攻防入門與進階ddd黑客攻防入門與進階ddd
    發(fā)表于 02-23 15:45 ?9次下載

    詳解領域驅(qū)動設計和spring

    領域驅(qū)動設計 Eric Evans的《領域驅(qū)動設計》無疑是軟件設計領域最重要的幾本書之一。 這本書主要集中在軟件開發(fā)中如何處理
    發(fā)表于 09-27 12:51 ?0次下載
    詳解<b class='flag-5'>領域</b><b class='flag-5'>驅(qū)動</b>設計和spring

    詳解領域驅(qū)動設計和spring

    領域驅(qū)動設計 Eric Evans的《領域驅(qū)動設計》無疑是軟件設計領域最重要的幾本書之一。 這本書主要集中在軟件開發(fā)中如何處理
    發(fā)表于 09-27 12:51 ?0次下載
    詳解<b class='flag-5'>領域</b><b class='flag-5'>驅(qū)動</b>設計和spring

    何進行正確數(shù)據(jù)建模

    理解數(shù)據(jù)是控制任何企業(yè)的先決條件。但只有當這些知識能夠被分享和傳播時,理解才是有用的。有效的數(shù)據(jù)建模應該是任何企業(yè)架構師的首要關注點。
    的頭像 發(fā)表于 09-28 02:37 ?4490次閱讀

    何進行OPCDCOM配置

    何進行OPCDCOM配置(四會理士電源技術有限公司招聘)-如何進行OPCDCOM配置? ? ? ? ? ? ? ? ? ? ??
    發(fā)表于 09-18 14:23 ?11次下載
    如<b class='flag-5'>何進行</b>OPCDCOM配置

    SystemVerilog對硬件功能如何進行建模

    本文定義了通常用于描述使用SystemVerilog對硬件功能進行建模的詳細級別的術語。
    的頭像 發(fā)表于 03-30 11:42 ?2805次閱讀

    用好DDD必須先過Spring Data這關

    DDD 是一種領域驅(qū)動的設計方法,旨在通過建立對領域模型的清晰理解來解決業(yè)務問題。和事務腳本不同,DDD 使用面向?qū)ο笤O計來應對復雜的業(yè)務場
    的頭像 發(fā)表于 03-07 09:38 ?2828次閱讀

    一文理解DDD領域驅(qū)動設計

    2004年Eric Evans 發(fā)表Domain-Driven Design –Tackling Complexity in the Heart of Software (領域驅(qū)動設計),簡稱Evans DDD。
    的頭像 發(fā)表于 05-25 14:21 ?1687次閱讀
    一文理解<b class='flag-5'>DDD</b><b class='flag-5'>領域</b><b class='flag-5'>驅(qū)動</b>設計

    DDD是什么?DDD核心概念梳理

    DDD 是什么,DDD 的英文全稱是 Domain-Driven Design,翻譯過來就是領域驅(qū)動設計。
    的頭像 發(fā)表于 09-07 11:12 ?1.2w次閱讀
    <b class='flag-5'>DDD</b>是什么?<b class='flag-5'>DDD</b>核心概念梳理

    cad如何進行三維建模

    三維建模是計算機輔助設計(CAD)中的一項重要技術,它可以幫助設計師在計算機上創(chuàng)建和編輯三維模型。本文將介紹如何使用CAD軟件進行三維建模,包括建模的基本步驟、
    的頭像 發(fā)表于 07-09 10:23 ?3979次閱讀

    DDD學習與感悟——向屎山?jīng)_鋒

    軟件系統(tǒng)是通過軟件開發(fā)來解決某一個業(yè)務領域或問題單元而產(chǎn)生的一個交付物。而通過軟件設計可以幫助我們開發(fā)出更加健壯的軟件系統(tǒng)。因此,軟件設計是從業(yè)務領域到軟件開發(fā)之間的橋梁。而DDD是軟件設計中的其中
    的頭像 發(fā)表于 09-24 13:31 ?1120次閱讀
    <b class='flag-5'>DDD</b>學習與感悟——向屎山?jīng)_鋒
    东平县| 婺源县| 诸城市| 安义县| 余庆县| 长阳| 乌兰浩特市| 东平县| 射洪县| 锡林浩特市| 湛江市| 内江市| 安康市| 龙游县| 巢湖市| 类乌齐县| 喀喇| 温宿县| 清原| 乐昌市| 扬中市| 伊吾县| 南陵县| 澜沧| 临沭县| 健康| 三台县| 柳河县| 湘阴县| 临城县| 泰宁县| 景德镇市| 芒康县| 安多县| 简阳市| 安仁县| 绥中县| 乌鲁木齐市| 辽阳县| 达日县| 于都县|