我刚读到有关值对象的信息,它是不可变的,并描述为:
一个小的简单对象,如金钱或日期范围,其等同性不是基于身份。
看看我现有的实体,我认为我可以做出几乎不是实体的所有事物。
假设我有一个实体类User。
class User
{
public $id;
public $firstname;
public $lastname;
public $email;
}
我可以让它由值对象Id
,FirstName
,LastName
,Email
和Password
组成,因为这些{{1}都不是属性相等是基于身份的,对吧?但话又说回来,我可能会更进一步,制作更多VO User
,Int
,String
(由Name
和FirstName
VO组成)等。
我在哪里画线以防止过度工程?
域包含那么多VO是否正常?
我对价值对象的理解是否正确?
答案 0 :(得分:4)
是的,如果您想要设置类型安全和表达性足够高的栏,那么域包含大量VO是正常的 - 这通常是一件好事。
无需重新定义Int
和String
,但确定无处不在的语言概念应该有自己的对象。
不可否认,在某些语言中,这样做比其他语言更自然,更轻松。这会影响您绘制线条的位置。在functional languages, for instance中,将type UserId = UserId of int
中的基本类型包装起来并不罕见。在OO语言中我不会这么做,课堂仪式就是这样。