Скажем, у нас есть простая "концептуальная" машина с этими свойствами (используя псевдокод, этот вопрос не зависит от языка):
Car
{
string Brand;
string[] Tags;
}
Обратите внимание, что я не говорил, что это класс кода, ни этотэто объект базы данных или что-то еще ... это просто «концепция» в нашем домене.
В этом примере мы будем предполагать, что теги являются свободным текстом, а не выбираются из закрытой коллекции тегов, как это происходитв переполнении стека, где теги «ссылаются» на «реальную сущность тега».В этом примере это всего лишь строки.
Давайте предположим, что мы используем CQRS + Event Sourcing для этого приложения, поэтому мы сможем отслеживать, когда была создана машина, кто ее редактировал и т. Д.
Наши первые требования к приложениям требуют от нас «создавать автомобили», а не редактировать их.Естественно, событие создания можно легко увидеть следующим образом:
CarCreated( string Brand, string[] Tags );
Через месяц они просят нас отредактировать автомобили.Они хотят редактировать марку и теги.
Конечно, автомобильная редакция марки или тегов независима, и у нас может быть 2 подхода:
Approach 1) There are 2 events, one for each thing:
CarBrandEdited( [pass here the brand info] )
CarTagsEdited( [pass here the tags info] )
или
Approach 2) There is a single atomic edition event
that may touch one or the other or both:
CarEdited( [pass here the edition definition] )
Определите тот или иной подход, я чувствую, что он скорее «основан на домене» ... Вы не можете изменить дату, изменив ее «день» и затем «месяц», так как между ними есть микровторой разрыв, где дата неверна.
Либо это «4-го июля» или «18-го августа», но никогда не «18-го июля», как это было бы, если бы мы сначала обновили день, а затем месяц,Это означает «сделать эти 2 изменения атомарными».
Мой вопрос в особенности возникает вокруг вещи TAGS ...
Если у меня есть этот набор тегов для объекта:
green kitcheeeen tall wood
и я даю форму пользователю и пользовательским данным:
green kitchen metal soft
Как мне поступить?
Я не вхожу в вопрос, если эти изменения должныбыть "атомным" все в одну ночьнет, или «распространился» на отдельные события ... Что меня интересует, так это:
Для меня вариант C - это еще один пурист и тот, который передает больше «смысла» событию ... ноэто является излишним в программировании пользовательского интерфейса, чтобы позволить пользователю различать, если
- текстовое изменение является изданием (как дерево для металла, поскольку это кажется существенным изменением, вероятно, пользователь будет редактироватьтег в поле) или
- изменение текста - это просто удаление и отдельное добавление (например, сброс высоты и добавление софта, возможно, пользователь нажмет
x
на высоте, а нажатие +
приведет кпустое текстовое поле для ввода нового тега.
Подкрепите идею, что теги "означают семантику", вариант C кажется "единственным".Но это излишнее преимущество, если мне не хватает хорошего, хотя и более простого решения.
Как определить событие CarEdited
?