DDD: ТАКИЕ метки. Сущность или тип значения? - PullRequest
10 голосов
/ 24 марта 2009

В контексте доменного дизайна, является ли тег StackOverflow (т. Е. ddd ) ценным объектом или объектом?

EDIT:

Представь, что ты должен создать ТАК сайт. Как бы вы оценили тег?

Ответы [ 4 ]

13 голосов
/ 24 марта 2009

Чтобы немного расширить ответ от белого тег является типом значения Зачем? Потому что не имеет смысла иметь

var tag1 = new Tag("DDD");
var tag2 = new Tag("DDD");
Assert.AreNotEqual(tag1, tag2);

ясно, что они должны быть равны друг другу, поскольку у тега нет идентификатора, кроме его метки Вопросы и ответы, с другой стороны, безусловно, являются сущностями

7 голосов
/ 11 августа 2011

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);
}
2 голосов
/ 24 марта 2009

Только некоторые дополнительные соображения: теги можно нормализовать, «DDD» должен быть равен «ddd» и «DdD», а в большинстве систем тегов пробелы заменяются символами подчеркивания «_». Также я предполагаю, что создатель будет отслеживаться для системы значков.

1 голос
/ 24 марта 2009

тип значения

...