首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DDD:所以标签。实体类型还是值类型?

DDD:所以标签。实体类型还是值类型?
EN

Stack Overflow用户
提问于 2009-03-24 20:07:42
回答 3查看 1.6K关注 0票数 11

在领域驱动设计的上下文中,是一个StackOverflow标签(即ddd )是值对象还是实体?

编辑:

想象一下,你必须建立这样的网站。你怎么看待“标签”?

EN

回答 3

Stack Overflow用户

发布于 2009-03-24 20:12:21

稍微扩展一下阿怀特的答案,标签是一种值类型,为什么?因为这没有任何意义

代码语言:javascript
复制
var tag1 = new Tag("DDD");
var tag2 = new Tag("DDD");
Assert.AreNotEqual(tag1, tag2);

显然,它们应该是相等的,因为标签除了标签之外没有任何标识。另一方面,问题和答案绝对是实体

票数 14
EN

Stack Overflow用户

发布于 2011-08-11 23:33:13

所以标签很可能是一个实体。可以创建、合并、删除和重命名标签。有类似标签,用户标签等功能,其中一些功能,特别是生命周期,将需要一个身份。经典的DDD示例中,更改姓名的人仍然是同一个人,同一个身份。标签也是一样,用户可以决定将“领域驱动设计”重命名为"DDD“,但它仍然是一样的。标签还需要额外的属性,如tag.Idtag.Nametag.CreatedOntag.CreatedBytag.Locked等。可能会有一个相应的标签存储库,可以强制执行名称唯一性规则。

总而言之,SO标记不是DDD值对象,因为它是可变的并且有生命周期。更重要的是,标签不仅仅是一个问题的特征(这是我认为被其他答案忽视的)。它参与的关系比这多得多。换句话说,标签不仅仅是它的属性的总和,它还具有“概念性同一性”。另一方面,TagName是一个很好的值对象的例子。它在生活中的唯一目的是描述另一个实体(标签)。TagName只不过是一个字符串,它可能有一些内置的规则,比如最大长度和不区分大小写的比较。简单地使用字符串也可能是有意义。

显示问题的代码可能使用类似以下内容:

代码语言:javascript
复制
IList<TagName> tags = question.GetTags();

标记问题的代码可能如下所示:

代码语言:javascript
复制
void TagQuestion(Question q, TagName tagName) {
    Tag tag = _tagsRepository.FindByName(tagName);
    if (tag == null) {
        tag = CreateNewTag( /* capture creator, date, other rules*/);
    }
    q.AddTag(tag);
}
票数 10
EN

Stack Overflow用户

发布于 2009-03-24 20:19:46

只有一些额外的注意事项:标记可以标准化,"DDD“应该等于"ddd”和"DdD",并且在大多数标记系统中,空格被替换为"_“下划线。此外,我猜创建者将被跟踪的徽章系统。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/679046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档