发布于 2009-03-24 20:12:21
稍微扩展一下阿怀特的答案,标签是一种值类型,为什么?因为这没有任何意义
var tag1 = new Tag("DDD");
var tag2 = new Tag("DDD");
Assert.AreNotEqual(tag1, tag2);显然,它们应该是相等的,因为标签除了标签之外没有任何标识。另一方面,问题和答案绝对是实体
发布于 2011-08-11 23:33:13
所以标签很可能是一个实体。可以创建、合并、删除和重命名标签。有类似标签,用户标签等功能,其中一些功能,特别是生命周期,将需要一个身份。经典的DDD示例中,更改姓名的人仍然是同一个人,同一个身份。标签也是一样,用户可以决定将“领域驱动设计”重命名为"DDD“,但它仍然是一样的。标签还需要额外的属性,如tag.Id、tag.Name、tag.CreatedOn、tag.CreatedBy、tag.Locked等。可能会有一个相应的标签存储库,可以强制执行名称唯一性规则。
总而言之,SO标记不是DDD值对象,因为它是可变的并且有生命周期。更重要的是,标签不仅仅是一个问题的特征(这是我认为被其他答案忽视的)。它参与的关系比这多得多。换句话说,标签不仅仅是它的属性的总和,它还具有“概念性同一性”。另一方面,TagName是一个很好的值对象的例子。它在生活中的唯一目的是描述另一个实体(标签)。TagName只不过是一个字符串,它可能有一些内置的规则,比如最大长度和不区分大小写的比较。简单地使用字符串也可能是有意义。
显示问题的代码可能使用类似以下内容:
IList<TagName> tags = question.GetTags();标记问题的代码可能如下所示:
void TagQuestion(Question q, TagName tagName) {
Tag tag = _tagsRepository.FindByName(tagName);
if (tag == null) {
tag = CreateNewTag( /* capture creator, date, other rules*/);
}
q.AddTag(tag);
}发布于 2009-03-24 20:19:46
只有一些额外的注意事项:标记可以标准化,"DDD“应该等于"ddd”和"DdD",并且在大多数标记系统中,空格被替换为"_“下划线。此外,我猜创建者将被跟踪的徽章系统。
https://stackoverflow.com/questions/679046
复制相似问题