成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

談一下你對DDD的理解?我:馬什么梅?

開發(fā) 架構(gòu)
領(lǐng)域模型(domain model)是對領(lǐng)域內(nèi)的概念類或現(xiàn)實世界中對象的可視化表示。領(lǐng)域模型也稱為概念模型、領(lǐng)域?qū)ο竽P秃头治鰧ο竽P汀?/div>

 領(lǐng)域模型(domain model)是對領(lǐng)域內(nèi)的概念類或現(xiàn)實世界中對象的可視化表示。領(lǐng)域模型也稱為概念模型、領(lǐng)域?qū)ο竽P秃头治鰧ο竽P汀?/p>

[[339513]]

——《UML和模式應(yīng)用》

我們在日常開發(fā)中,經(jīng)常針對一些功能點爭論“這個功能不應(yīng)該我改,應(yīng)該是你那邊改”,最終被妥協(xié)改了之后都改不明白為什么這個功能要在自己這邊改。區(qū)別于傳統(tǒng)的架構(gòu)設(shè)計,領(lǐng)域驅(qū)動設(shè)計(DDD)也許在這個時候能幫助你做到清晰的劃分。

什么是DDD

領(lǐng)域驅(qū)動設(shè)計最初由Eric Evans提出,但是多年以來一直停留在理念階段,真正能實現(xiàn)并且落地的項目和公司少之又少,而進來阿里內(nèi)部其實在大力推行DDD的理念,它主要可以幫助我們解決傳統(tǒng)單體式集中架構(gòu)難以快速響應(yīng)業(yè)務(wù)需求落地的問題,并且針對中臺和微服務(wù)盛行的場景做出指導(dǎo)。

DDD為我們提供的是架構(gòu)設(shè)計的方法論,既面向技術(shù)也面向業(yè)務(wù),從業(yè)務(wù)的角度來把握設(shè)計方案。

DDD的作用

統(tǒng)一思想:統(tǒng)一項目各方業(yè)務(wù)、產(chǎn)品、開發(fā)對問題的認知,而不是開發(fā)和產(chǎn)品統(tǒng)一,業(yè)務(wù)又和產(chǎn)品統(tǒng)一從而產(chǎn)生分歧。

明確分工:域模型需要明確定義來解決方方面面的問題,而針對這些問題則形成了團隊分鐘的理解。

反映變化:需求是不斷變化的,因此我們的模型也是在不斷的變化的。領(lǐng)域模型則可以真實的反映這些變化。

邊界分離:領(lǐng)域模型與數(shù)據(jù)模型分離,用領(lǐng)域模型來界定哪些需求在什么地方實現(xiàn),保持結(jié)構(gòu)清晰。

DDD的概念

實體

有唯一標志的核心領(lǐng)域?qū)ο螅疫@個標志在整個軟件生命周期中都不會發(fā)生變化。這個概念和我們平時軟件模型中和數(shù)據(jù)庫打交道的Model實例比較接近,唯一不同的是DDD中這些實體會包含與該實體相關(guān)的業(yè)務(wù)邏輯,它是操作行為的載體。

值對象

依附于實體存在,通過對象屬性來識別的對象,它將一些相關(guān)的實體屬性打包在一起處理,形成一個新的對象。

舉個栗子:比如用戶實體,包含用戶名、密碼、年齡、地址,地址又包含省市區(qū)等屬性,而將省市區(qū)這些屬性打包成一個屬性集合就是值對象。

聚合

實體和值對象表現(xiàn)的是個體的能力,而我們的業(yè)務(wù)邏輯往往很復(fù)雜,依賴個體是無法完成的,這時候就需要多個實體和值對象一起協(xié)同工作,而這個協(xié)同的組織就是聚合。聚合是數(shù)據(jù)修改和持久化的基本單元,同一個聚合內(nèi)要保證事務(wù)的一致性,所以在設(shè)計的時候要保證聚合的設(shè)計拆分到最小化以保證效率和性能。

聚合根

也叫做根實體,一個特殊的實體,它是聚合的管理者,代表聚合的入口,抓住聚合根可以抓住整個聚合。

領(lǐng)域服務(wù)

有些領(lǐng)域的操作是一些動詞,并不能簡單的把他們歸類到某個實體或者值對象中。這樣的行為從領(lǐng)域中識別出來之后應(yīng)該將它聲明成一個服務(wù),它的作用僅僅是為領(lǐng)域提供相應(yīng)的功能。

領(lǐng)域事件

在特定的領(lǐng)域由用戶動作觸發(fā),表示發(fā)生在過去的事件。比如充值成功、充值失敗的事件。

四種模式

失血模型

模型中只有簡單的get set方法,是對一個實體最簡單的封裝,其他所有的業(yè)務(wù)行為由服務(wù)類來完成。

  1. @Data 
  2. @ToString 
  3. public class User { 
  4.     private Long id; 
  5.     private String username; 
  6.     private String password
  7.     private Integer status; 
  8.     private Date createdAt; 
  9.     private Date updatedAt; 
  10.     private Integer isDeleted; 
  1. public class UserService{ 
  2.     public boolean isActive(User user){ 
  3.         return user.getStatus().equals(StatusEnum.ACTIVE.getCode()); 
  4.     } 

貧血模型

在失血模型基礎(chǔ)之上聚合了業(yè)務(wù)領(lǐng)域行為,領(lǐng)域?qū)ο蟮臓顟B(tài)變化停留在內(nèi)存層面,不關(guān)心數(shù)據(jù)持久化。

  1. @Data 
  2. @ToString 
  3. public class User { 
  4.     private Long id; 
  5.     private String username; 
  6.     private String password
  7.     private Integer status; 
  8.     private Date createdAt; 
  9.     private Date updatedAt; 
  10.     private Integer isDeleted; 
  11.      
  12.     public boolean isActive(User user){ 
  13.         return user.getStatus().equals(StatusEnum.ACTIVE.getCode()); 
  14.     } 
  15.      
  16.     public void setUsername(String username){ 
  17.         return username.trim(); 
  18.     } 

充血模型

在貧血模型基礎(chǔ)上,負責(zé)數(shù)據(jù)的持久化。

  1. @Data 
  2. @ToString 
  3. public class User { 
  4.     private Long id; 
  5.     private String username; 
  6.     private String password
  7.     private Integer status; 
  8.     private Date createdAt; 
  9.     private Date updatedAt; 
  10.     private Integer isDeleted; 
  11.      
  12.     private UserRepository userRepository; 
  13.      
  14.     public boolean isActive(User user){ 
  15.         return user.getStatus().equals(StatusEnum.ACTIVE.getCode()); 
  16.     } 
  17.      
  18.     public void setUsername(String username){ 
  19.         this.username = username.trim(); 
  20.         userRepository.update(user); 
  21.     } 

脹血模型

service都不需要,所有的業(yè)務(wù)邏輯、數(shù)據(jù)存儲都放到一個類中。

對于DDD來說,失血和脹血都是不合適的,失血太輕量沒有聚合,脹血那是初學(xué)者才這樣寫代碼。那么充血模型和貧血模型該怎么選擇?充血模型依賴repository接口,與數(shù)據(jù)存儲緊密相關(guān),有破壞程序穩(wěn)定性的風(fēng)險。

建模方法

用例分析法

用例分析法是領(lǐng)域建模最簡單可行的方式。大致可以分為獲取用例、收集實體、添加關(guān)聯(lián)、添加屬性、模型精化幾個步驟。

  1. 獲取用例:提取領(lǐng)域規(guī)則描述
  2. 收集實體:定位實體,
  3. 添加關(guān)聯(lián):兩個實體間用動詞關(guān)聯(lián)起來
  4. 添加屬性:獲取實體屬性
  5. 模型精化:可選的步驟,可以用UML的泛華和組合來表達模型間的關(guān)系,同時可以做子領(lǐng)域的劃分

四色建模法

四色建模法源于《Java Modeling In Color With UML》,它是一種模型的分析和設(shè)計方法,通過把所有模型分為四種類型,幫助模型做到清晰、可追溯。

簡單來說,四色關(guān)注的是某個人的角色在某個地點的角色用某個東西的角色做了某件事情。

事件風(fēng)暴法

事件風(fēng)暴法類似頭腦風(fēng)暴,簡單來說就是誰在何時基于什么做了什么,產(chǎn)生了什么,影響了什么事情。

架構(gòu)分層

區(qū)別于左圖傳統(tǒng)架構(gòu)的分層,一般DDD分層會有一些變化。

Application:包含事件注冊、業(yè)務(wù)邏輯等

Domain:聚合、實體、值對象

InfraStructure:基礎(chǔ)設(shè)施封裝、數(shù)據(jù)庫訪問等

總結(jié)

DDD是一套完善的方法論,他能幫助我們合理的對系統(tǒng)進行架構(gòu)設(shè)計,同時,好的模板應(yīng)該是在不斷的適應(yīng)變化,而DDD也能幫助我們更快速更方便的支撐業(yè)務(wù)的發(fā)展。

本文轉(zhuǎn)載自微信公眾號「科技繆繆」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系科技繆繆公眾號。

 

責(zé)任編輯:武曉燕 來源: 科技繆繆
相關(guān)推薦

2021-05-11 08:48:23

React Hooks前端

2017-07-14 10:55:05

2022-07-28 19:19:21

Zookeeper中心化架構(gòu)

2020-06-19 15:32:56

HashMap面試代碼

2019-12-26 09:15:44

網(wǎng)絡(luò)IOLinux

2024-03-25 02:00:00

Vite開發(fā)

2013-12-24 16:54:53

2012-04-08 14:09:50

小米

2013-07-31 17:47:16

網(wǎng)站制作Web制作Web網(wǎng)站

2021-12-27 18:00:30

對象數(shù)組Java

2012-08-15 10:50:51

IE6

2023-11-28 12:25:02

多線程安全

2022-06-30 09:10:33

NoSQLHBaseRedis

2021-03-26 00:20:34

NFT區(qū)塊鏈數(shù)據(jù)庫

2022-07-06 08:30:36

vuereactvdom

2013-07-11 10:37:20

Java內(nèi)存模型

2017-05-24 10:12:54

前端FlexboxCSS3

2025-03-07 00:11:00

JWTJSONSession

2019-05-31 08:52:53

存儲技術(shù)容器

2021-10-28 14:30:19

K8S Kubernetes數(shù)據(jù)持久化
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: www.毛片| 综合久久综合久久 | 免费观看一级视频 | 精品久久久久久久久久久久久久 | www.日韩 | 欧美日韩一区二区三区不卡视频 | 91亚洲国产亚洲国产 | 久久99精品视频 | 日日夜夜精品视频 | 国产精品国产三级国产aⅴ无密码 | 99精品视频在线观看 | 日韩欧美久久精品 | 成人免费看电影 | 国产精品成人在线 | 精品亚洲一区二区三区 | 国产一区二区三区精品久久久 | 91精品国产91久久久久福利 | 九九综合九九 | 91精品国产综合久久精品 | www.av7788.com | 精品小视频 | 天堂一区二区三区四区 | 久久久久精 | 欧美三级电影在线播放 | 一区二区三区视频在线免费观看 | 嫩草视频在线免费观看 | 国产亚洲欧美在线视频 | 国产精品污www一区二区三区 | 一级做a爰片久久毛片 | 黄色大片免费网站 | 综合九九 | 国产视频二区在线观看 | 韩国欧洲一级毛片 | 免费一区 | 天天爽夜夜爽精品视频婷婷 | 日韩精品一区二区三区视频播放 | 亚洲一区二区 | 麻豆av电影网| 国产精品一区二区久久 | 欧美一区二区成人 | av在线免费观看不卡 |