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

Bar*_*bat 10 domain-driven-design

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

编辑:

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

Geo*_*uer 13

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

var tag1 = new Tag("DDD");
var tag2 = new Tag("DDD");
Assert.AreNotEqual(tag1, tag2);
Run Code Online (Sandbox Code Playgroud)

显然它们应该彼此相等,因为标签除了标签外没有任何标识.另一方面,问题和答案肯定是实体

  • 缺少这个答案的主要观点是对环境的依赖.因此,在特定的上下文中 - 比如说`Questions`上下文 - 它是一种价值类型.但也可以创建,合并,删除标签等; 在这种情况下(我们可以称之为"标签管理"上下文),它是一个实体. (4认同)

Dmi*_*try 8

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

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

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

IList<TagName> tags = question.GetTags();
Run Code Online (Sandbox Code Playgroud)

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

void TagQuestion(Question q, TagName tagName) {
    Tag tag = _tagsRepository.FindByName(tagName);
    if (tag == null) {
        tag = CreateNewTag( /* capture creator, date, other rules*/);
    }
    q.AddTag(tag);
}
Run Code Online (Sandbox Code Playgroud)

  • 更不用说在SO标签上有摘要和与它们相关的整个wiki ...... (2认同)