實體、值對象、聚合


定義:

實體不僅需要知道它是什么,還要知道它是哪個,值對象只關心它是什么。

實體:許多對象不是由它們的屬性來定義,而是通過一系列的連續性和標識來從根本定義的。只要一個對象在生命周期中能夠保持連續性,並且獨立於它的屬性(即使這些屬性對系統用戶非常重要),那它就是一個實體。

值對象:當你只關心某個對象的屬性時,該對象便可以作為一個值對象。為其添加有意義的屬性,並賦予它相應的行為。我們需要將值對象看成不變對象,不要它任何身份標識,還應該盡量避免像實體對象一樣的復雜性。

對於實體,實體核心是用唯一的標識符來定義,而不是通過屬性定義。即使屬性完全相同的也可能是不同的對象。同時實體本身是由狀態的,實體有嚴謹的生命周期,實體本身會體現出相關的業務行為,業務行為會被實體屬性或狀態造成影響和改變。

值對象本身無狀態,不可變,並且不分配具體的標識。本身無生命周期,也不會產生獨立行為。

舉個栗子:

1、手機由SN號識別,手機是一個實體。手機的配件這種場景下就是值對象。

2、體育場的座位,門票上有座位號,座位號可以最為唯一標識,座位是實體。但是如果門票沒有座位號,先到先做,座位沒有座位號,只有數量,坐一個少一個,這時候座位就是值對象。

值對象的使用目的:

使用不變的值對象使得我們做更少的職責假設。

值對象用於度量和描述事物,DDD中建議盡量使用值對象來建模而不是實體對象,因為值對象非常容易的進行創建、測試、使用、優化和維護。

值對象的特征:

1、它度量或者描述了領域的一件東西。

2、它可以作為不變量。

3、它可以將土撥桿的相關的屬性結合成一個概念整體。

4、當度量和描述發生改變的時候,可以用另一個值對象替換。

5、它可以和其他值對象進行相等比較

6、它不會對協作對象造成副作用

最小化集成:

DDD項目中,通常存在多個限界上下文,這意味着我們需要找到合適的方法對這些上下文進行集成。當模型概念從上流上下文流入下游上下文時,盡量使用值對象表示這些概念。這樣可以達到最小化集成,即可以最小化下游模型中用於管理職責的屬性數數目。使用不便的值對象使得我們做更少的職責假設。

聚合與聚合根

定義了對象之間清晰的關系和邊界,並實現領域模型的內聚。

必須將聚合作為一個修改數據的單元。

一個聚合必須有一個聚合根,根是聚合中的一個實體,通常聚合中其他實體需要依賴於聚合根,其他實體不能沒有聚合根而存在,從業務的角度看它是沒有單獨存在的意義。

對一個聚合中的實體的訪問和操作,必須通過這個聚合的聚合根開始,確保一致性規則。例如訂單的總金額依賴每個訂單項的總和。

一個聚合只有一個聚合根,聚合根是可以獨立存在的,聚合中其他實體或者值對象依賴聚合根。

只有聚合根才能被外部訪問到。

針對功能模塊進行系統划分,粒度太粗,使用聚合可以精確划分粒度。

 

 

      


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM