《Patterns, Principles, and Pract》— chapter15 Value Objects

這章的內容有什麼呢?

  • 對ddd value object 模型構造的介紹
  • 討論 什麼是value object 以及如何使用它
  • 用於value ojbects的patterns
  • 持久化 value objects可以採用的nosql和sql數據庫

value objects沒有身份。純粹用來描述entities模型常用屬性。因爲沒有唯一識別,所以使用起來比較簡單。

 

When to Use a Value Object

Value objects是entity的狀態,描述一些entity或者它擁有的一些屬性。一般爲描述性,無特定意義的概念。

entities把表現放到value objects裏面,來保持entities的專注。value objects是細粒度的。

 

Defining Characteristics

DDD實踐者喜歡value objects, 因爲它固定不變,無副作用,易測試。下面定義了一些value objects重要的特性。

Identity-less

value objects沒有身份,在domain中描述其他概念。從entity中發掘一成不變的信息,放到value objects中。value objects需要entity中一成不變的內容。

比較value objects是一個關鍵的操作,即使它沒有身份。

Attribute-Based Equality

entities如果id相等,則被視爲相同。同理,value objects因爲擁有共同的value值而被認爲相等。

Behavior-Rich

value objects需要儘可能多的表現面向domain的行爲,封裝狀態。一般來說,原始的values應該默認是private的或者protected。

除非有非常好的理由打破封裝的狀態,讓它變成公有。否則,首先考慮要把需要的方法添加到value objects裏面。通過創建更加豐富的模型,讓domain的概念變的更加明確。

Cohesive(拼合)

做爲一個描述性的概念,它經常描述一些東西的數量,value objects經常把度量單位的值和單位拼到一起。比如錢,額度和單位。

Immutable(不可變)

值對象一旦創建,將不會被改變。如果想改變它的值,需要創建整個新的實例包含所有期望的值。這麼做的原因是讓不變會讓操作變的簡單,減少風險。

Combinable(組合)

values經常表示數字,所以在很多的cases中,把它們結合起來,創建一個新的值。值對象可以組合。雖然它是不變的,組合之後可以是一個新的value object 包含期望的值。原始的objects繼續保持不變。可以通過加,減,乘,除把這些值重新結合。

Self-Validating

value objects用於不會在無效的狀態中。它們會對自己的方法進行校驗。

Testable

value objects不變,拼合,組合的特性,使得面向領域的語言更加易於測試。不變性 ,避免了mock的需求,或者確認副作用。拼合保證了單獨的概念被充分隔離測。組合允許表達了兩個value objects之間的關係。

 

Common Modeling Patterns

ddd實踐者,在這些年,創建了小的模式的集合 來提升跟value objects工作的經歷。大多數,益處旨在提升表現力,更加的明確。一些有細小的益處,比如可維護性。這個部分代表三個基本的模式,你可以馬上使用這些,思考自己的模式。

Static Factory Methods

使用靜態工廠方法是一個很流行的技術用來封裝複雜對象的創建,更具表現的接口。可以根據自己的風格喜好選擇靜態工廠方法。

Micro Types

避免原始類型,可以讓你更加的明確代碼的意圖,導致錯誤因爲歧義。

Collection Aversion

一些ddd的實踐者認爲,你將永遠不會收集value objects的集合。因爲原始的集合不能很好的表達domain的概念。

 

Persistence

按理說,處理value objects最棘手的就是持久化它們。

NoSQL

很多非關係型數據庫使用非規範數據,它們通過正規數據庫的強大的公約進行構造。 NoSQL將有意於ddd,因爲完整的實體,有時是完整的aaggreaggregates,可以被定義爲單獨的文檔。連表問題,規範數據,orm懶加載 不會存在於面向文檔模型中。value objects,意味着可以存儲entity。

SQL

持久化value objects 在sql 數據庫中是附帶選擇。 可以遵循標準sql,標準化value objects在他們自己的tables。

Flat Denormalization

持久化value objects的普通模式就是直接存儲他們的值採用自定義表示。這個一個很好的選擇,當你不想擁有多餘的表,或者多餘的聲明描述去連表查它們。

Creating a Persistence Format

確保持久化的時候,重新加載值對象。值對象可以從數據庫load出來,然後根據該格式進行持久化,當它保存到數據庫可以採用該格式。

Persisting Values on Save

通過ORM持久化數據是最複雜的。

Persing Values on Load

Normalizing into Separate Tables

 

The Salient Points

 

 

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