我刚刚读到关于不可变的值对象的描述:
一个简单的小对象,如货币或日期范围,其相等性不是基于同一性。
看看我目前存在的实体,我想我可以把几乎所有不是实体的东西都变成值对象。
假设我有一个实体类User
class User
{
public $id;
public $firstname;
public $lastname;
public $email;
}
我可以让它由值对象Id
, FirstName
, LastName
, Email
和Password
组成,因为这些User
属性相等都不是基于恒等的,对吗?但是,我可能还可以更进一步,制作更多的VOs Int
, String
, Name
(由FirstName
和LastName
VOs组成),等等。
我应该在哪里划一条线来防止过度设计?
一个域包含这么多VOs是正常的吗?
我对值对象的理解正确吗?
是的,如果您想将类型安全和表达性的标准设置得足够高,那么域包含大量VO是正常的——这通常是一件好事。
不需要重新定义Int
和String
,但是确定的泛在语言概念应该有自己的对象。
type UserId = UserId of int
那样包装原语类型并不少见。我不会在面向对象语言中这么做,类仪式就是这样。