參考:http://culttt.com/2014/04/30/difference-entities-value-objects/
在常見的程序中,對象(Object)代表相關的屬性和方法,例如,一個人可以成為一個對象,他有姓名,電子郵件地址和密碼,以及其他的屬性。在數據庫中這個人是由一個ID代表,這意味着,我們可以改變他的姓名,電子郵件地址和密碼,但是他仍然是同一個人,當一個對象可以改變他的屬性,但仍然是同一個對象,那么我們叫它為一個‘實體’,一個實體是可變的(mutable),因為它可以改變他的屬性同時不改變對象的身份。實體對象將維持身份,因為它有一個ID在數據庫中。
試想一下,我們的應用程序中允許跟蹤人們當前的位置。當人們能成功連接到互聯網的時候,我們的應用程序會創建一個新的位置對象,此位置對象包含有經度和維度的屬性。該位置的對象是一個‘值對象’,因為我們不關心對象的特定實例,我們只關心它的位置。同時代表這個位置的對象的屬性是不能變的,如果它的經度或維度哪怕變了一點,都不能代表這個位置了,如果用戶的位置變更了,那么我們可以簡單的重新創建一個位置對象。當一個對象的屬性不能改變,他被稱為‘不可變的’(immutable)。
另外一個重要的區別是,值對象的平等不是基於身份。例如,當你創建一個位置對象,兩個位置對象的經緯度是相同的,那么我們認為兩個位置對象是相等的。但是實體就不一樣了,因為不同ID的人,雖然有相同的名字,但是他們不會是同一個人。
到底什么時候使用實體以及什么時候使用值對象呢?那么真正決定的是應用程序的上下文環境。
試想一下,上面例子中,如果我們的應用不是常見的應用,而是一個對不同位置參觀人數的統計的應用程序呢。這時,每個位置都應該有一個唯一的標識符,來作為一個實體存入數據庫中,然而人則不是我們關心的實體了,我們關心的只是有人經過這個地方了,這時任何人對於系統來說就是不變的。
因此,無論對象是一個實體或值對象真的取決於你如何在應用程序的上下文中使用它。如位置,日期,數字或貨幣,一般來說都是值對象,而人,產品,文件幾乎都是實體。