2011-01-28 69 views
2

在樣本DDD項目上查看Evans的項目時,我注意到在Cargo實體中,Evans使用的是值對象的tracknumber。爲什麼他沒有選擇明碼標價而選擇價值對象?這裏是埃文斯片段:在實體中使用值對象作爲標識符

public class Cargo implements Entity<Cargo> { 

    private TrackingId trackingId 
} 

public final class TrackingId implements ValueObject<TrackingId> { 

    private String id; 

    /** 
    * Constructor. 
    * 
    * @param id Id string. 
    */ 
    public TrackingId(final String id) { 
    Validate.notNull(id); 
    this.id = id; 
    } 

回答

2

一對夫婦的事情,將實現:

  • 封裝的跟蹤ID不能爲空
  • 邏輯封裝邏輯的跟蹤ID不應該改變一次設置。

對於一個普通的字符串,貨物對象必須知道這些規則。使用價值對象方法意味着TrackingId維護關於它自己的這些規則。

+0

我們可以在.Net世界中實現同樣的功能,只有通過構造函數設置的readonly變量,以後不能更改或者只有getter沒有setter。 – kamal 2011-01-29 19:45:32