SO тег - это, скорее всего, объект. Теги могут быть созданы, объединены, удалены и переименованы. Есть такие функции, как «похожие теги», пользовательские теги и т. Д. Некоторые из этих функций, особенно жизненный цикл, требуют идентификации. Классический пример DDD, где Человек, который меняет свое имя, остается тем же человеком, тем же лицом. То же самое с тегами, где пользователь может решить переименовать «доменный дизайн» в «DDD», и это будет то же самое. Для тегов также требуются дополнительные атрибуты, такие как tag.Id
, tag.Name
, tag.CreatedOn
, tag.CreatedBy
, tag.Locked
и т. Д. Вероятно, существует соответствующий репозиторий тегов, который может применять правило уникальности имен.
Подводя итог, можно сказать, что SO Tag не является объектом значения DDD, поскольку он изменчив и имеет жизненный цикл. Что еще более важно, тег - это не только характеристика вопроса (это то, что, я думаю, было упущено другими ответами). Он участвует в гораздо большем количестве отношений, чем это. Другими словами, Tag - это больше, чем просто сумма его атрибутов , он также имеет «концептуальную идентичность». С другой стороны, TagName является прекрасным примером объекта Value. Его единственная цель в жизни - описать другую сущность (Тэг). 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);
}