實現領域驅動設計----第六章

當你決定以惡搞領域概念是否是一個值對象時,你需要考慮他是否擁有以下特徵:

  • 它度量或者描述了領域中的一件東西
  • 它可以作爲不變量
  • 它將不同的相關的屬性組合成一個概念整體
  • 當度量和描述改變時,可以用另一個值對象予以替換
  • 它可以和其他值對象進行相等性比較
  • 它不會對協作對象造成副作用

如果你試圖將多個屬性加在一個實體上,但這樣卻弱化了各個屬性之間的關係,那麼此時你便應該考慮將這些相互關聯的屬性結合在一個值對象中了。每個值對象都是一個內聚的概念整體,它表達了通用語言中的一個概念。如果其中一個屬性表達了一種描述性概念,那麼我們應該把該概念相關的所有屬性集中起來。如果其中一個或多個屬性發生了改變,那麼可以考慮對整體值對象進行替換。

實體的唯一標識時不能改變的,這可以部分地通過值對象地不變性達到。此外,我們還可以從值對象地概念整體特性中得到好處,因爲實體的唯一標識是根據通用語言來命名的,並且需要在一個實例中得到好處,因爲實體的唯一標識是根據通用語言來命名的,並且需要在一個實例中包含所有的可以標識唯一標識的屬性。然而,這裏我們並不需要值對象的可替換性,因爲我們不會替換聚合根的唯一標識。儘管如此,我們依然可以在聚合中使用值對象。此外,如果實體的唯一標識需要一些無副作用的行爲,這些行爲便可以在值對象上實現。

最小化集成

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

保持值對象的不變性
只有主構造函數才能使用自委派性來設置屬性值,除此之外,其他方法都不能使用setter方法。由於值對象中的所有setter方法都是私有的,消費方是沒有機會直接調用這些setter方法的。這是保持值對象不變性的兩個重要因素。

持久化值對象

持久化過程即是將對象序列化成文本格式或者二進制格式,然後將其保存到計算機磁盤中。

對象-關係映射(ORM,比如Hibernate)持久化機制是流行的。但是,使用ORM將每個類映射到一張數據庫表,再將每個屬性映射到數據庫表中的列會增加程序的複雜性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章