DDD:SO标签。实体或值类型?

时间:2009-03-24 20:07:42

标签: domain-driven-design

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

编辑:

想象一下,你必须建立SO网站。您如何看待'标签'?

4 个答案:

答案 0 :(得分:13)

在awhite的答案上稍微扩展一下 标签是值类型 为什么? 因为没有意义

var tag1 = new Tag("DDD");
var tag2 = new Tag("DDD");
Assert.AreNotEqual(tag1, tag2);
显然它们应该彼此相等,因为标签除了标签外没有任何标识。另一方面,问题和答案肯定是实体

答案 1 :(得分:7)

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

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

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

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);
}

答案 2 :(得分:2)

只是一些额外的考虑因素:标签可以标准化,“DDD”应该等于“ddd”和“DdD”,并且在大多数标签系统中,空格被替换为“_”下划线。此外,我猜想将为徽章系统跟踪创建者。

答案 3 :(得分:1)

值类型