注意:我正在使用PHP,但我认为这个问题将被视为与语言无关。我也在实施“lite DDD”,但我认为这也不会限制这个问题。
我有一个类(实体),可以设置很多属性(我在实体上也有很多行为,所以它不是一个贫血的域模型)。
例如,我有许多字符串属性,如下所示:
public function setFirstName($firstName)
{
// Removes all non-printable characters and extra spaces.
// Also converts all "look-a-like" quotes to the standard quote character.
$firstName = Helper::cleanName($firstName);
if(empty($firstName)){
throw new \Exception("first name is required");
}
$this->firstName = $firstName;
}
坚持DRY,我看到创建“干净名称”值对象的好处。但这会将我的几乎所有字符串属性转换为这些值对象。我还有其他属性是日期,我将变成Carbon日期值对象。最后,似乎几乎每个属性(将被持久化)都成为一个价值对象。我担心如果我过度使用这种方法,或者是否存在任何与内存相关的问题(尤其是在这些实体的较大集合中)。
如何判断一个类是否过度使用值对象? IE浏览器。要封装成值对象的逻辑量是否有最低标准?我是否通过使几乎每个属性(将被持久化)成为一个价值对象来炸毁内存?有没有人遇到过一个有30多个值对象的类的问题?
答案 0 :(得分:1)
根据Mathias Verraes'优秀的演讲Unbreakable Domain Models,他提到价值对象是"心灵和灵魂"编程。所以我认为最终的答案是在使用Value Objects 时不要害羞。
然而,在考虑了我在问题中提到的验证类型(清除这些名称中的字符等)后,我决定将其转换为表单输入处理程序类。在"应用程序级别进行一些清洁感觉好一点"在进入域名之前。当然,如果我开始进行任何需要域逻辑的验证,那么我应该始终在域级别执行此操作。我认为碳日期应该保留下来。我还有一个名为" urlSafeName" (或slug)我考虑制作一个价值对象(拿一个字符串并把它变成一个更好的网址和#34;形式)。
我仍然有点担心VO拥有数组并且可以替代数据库中的非常小的表。例如,职位名称的VO来自一系列职位(总裁,首席技术官,首席开发人员等)。我必须确保阵列将保持在一个可管理的大小,但这个大小当然是主观的。如果我有一个带有cityId,stateId和countryId的地址VO,那么我可能只想将它们存储为ID并且不存储VO中那些城市,州和国家的所有名称(但应该在查找表中)在数据库中)。