《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
?
?
總結
以上是生活随笔為你收集整理的《Patterns, Principles, and Pract》— chapter15 Value Objects的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VC驿站黑客编程(关机,重启,注销)
- 下一篇: cmd命令行进入D盘的方法