Редактирование набора (например, тегов) в источнике событий - PullRequest
0 голосов
/ 25 мая 2019

Скажем, у нас есть простая "концептуальная" машина с этими свойствами (используя псевдокод, этот вопрос не зависит от языка):

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

Как мне поступить?

  • Вариант а)

    • Теги отредактированы, новые теги = "зеленый кухонный металл"
  • Опция б)

    • Метка kitcheeeen удалена
    • Метка высотой убрана
    • Метка убрана деревом
    • Метка кухонная добавлена ​​
    • Метка металлическая добавлена ​​
    • Метка мягкая добавлена ​​
  • Вариант c) (возможно, не делает форму, но дает пользователю крестики для удаления и карандаши для редактирования текста)

    • Метка kitcheeeen изменена для кухни
    • Высокий тег удален
    • Дерево меток изменено для металла
    • Добавлен мягкий тег

Я не вхожу в вопрос, если эти изменения должныбыть "атомным" все в одну ночьнет, или «распространился» на отдельные события ... Что меня интересует, так это:

Для меня вариант C - это еще один пурист и тот, который передает больше «смысла» событию ... ноэто является излишним в программировании пользовательского интерфейса, чтобы позволить пользователю различать, если

  1. текстовое изменение является изданием (как дерево для металла, поскольку это кажется существенным изменением, вероятно, пользователь будет редактироватьтег в поле) или
  2. изменение текста - это просто удаление и отдельное добавление (например, сброс высоты и добавление софта, возможно, пользователь нажмет x на высоте, а нажатие + приведет кпустое текстовое поле для ввода нового тега.

Подкрепите идею, что теги "означают семантику", вариант C кажется "единственным".Но это излишнее преимущество, если мне не хватает хорошего, хотя и более простого решения.

Как определить событие CarEdited?

1 Ответ

0 голосов
/ 25 мая 2019

На мой взгляд, это зависит от вопроса: «Отслеживает ли это ценность бизнеса?»

Если вы видите бизнес-ценность в том, чтобы знать, редактировал ли пользователь тег напрямую или удалял / переписывал его, если вы считаете, что вам понадобится узнать это в будущем, тогда вариант С - это путь.

Но в большинстве случаев просто прекрасно сохранить событие CarEdited { newBrand, newTags }.


Примечания:

Я никогда не использовал это, но читал, что полезно иметь обратимые события, может быть, вы хотите сохранить событие CarEdited { oldBrand, newBrand, oldTags, newTags }.

Кроме того, одна из замечательных особенностей Event Sourcing заключается в том, что он освобождает вас от языка CRUD и заменяет его на деловой язык. Полагаю, ваш пользователь не создал автомобиль, он просто зарегистрировал его в вашей системе, возможно, вы хотите вызвать первое событие CarRegistered вместо CarCreated.

Надеюсь, это поможет!

...