
Aleh
03.11.2016
12:23:10
ну по факту это оно и есть
в AggregateRoot просто логика для ивентов

Anton
03.11.2016
12:23:34
хммм, этому точно место в домене?

Aleh
03.11.2016
12:23:37
при этом можешь сам это навелосипедить

Google

Aleh
03.11.2016
12:24:01
кто-то в жава community предлагал вариант класса EventStore со статическими методами, другой вариант трейты или вот наследование, что одно и тоже почти
можешь сам это реализовать у себя в домене, это жертва, которая скорее всего, стоит того)

Anton
03.11.2016
12:25:20
мне просто не нравится, что домен знает о ES что-то в принципе
в инфраструктурный уровень это вынести - плохая идея?

Sergey
03.11.2016
12:26:12
ES и есть домен

Aleh
03.11.2016
12:26:15
ну да
event sourcing это как раз домен
https://www.youtube.com/watch?v=8JKjvY4etTY
есть еще где он в шортах это же самое рассказывает

Anton
03.11.2016
12:27:44
сферический пример в вакууме - реализовал я для парочки агрегатов ES, поюзал, и понял ,что не прижилось - как быть тогда? с данными все просто - сделал снэпшот, и его воткнул в бд, которая уже не ES
а вот с кодом...

Aleh
03.11.2016
12:29:28
ну, смотри, твоя модель пушит куда-то ивенты и потом получает их, для изменения стейта

Google

Aleh
03.11.2016
12:29:54
когда ты решил, что es не, то тебе надо пересмотреть всю модель

Anton
03.11.2016
12:30:19
да, это понятно, что переделывать придется

Aleh
03.11.2016
12:31:12
ну, т.е. смотри, при es ты продумываешь, не что действия меняют, а какие есть действия
чем система живет
а что они меняют ты всегда успеешь добавить
т.е. типа event storming явно в код переносишь

Anton
03.11.2016
12:32:20
ну евенты можно оставить те же самые, просто в обработчиках не записывать евенты, а изменять сущности

Aleh
03.11.2016
12:32:24
ага, может добавлять покупки, может делать заказ
может делать срочный заказ
тогда почему не прижилось?)
если все можно оставить
если все можно оставить, тогда и париться не надо, лол)

Anton
03.11.2016
12:33:23
ну я говорю именно про переход от тру ес к псевдо ес

Aleh
03.11.2016
12:33:44
так а че, на твою модель это ж не влияет

Anton
03.11.2016
12:33:54
логично

Aleh
03.11.2016
12:33:57
хранишь ты эти ивенты или нет
ну да, этим уже инфраструктура занимается

Anton
03.11.2016
12:34:09
меня больше лишнее наследование напрянает)

Aleh
03.11.2016
12:34:15
но вот чтобы сами ивенты сохранить в модель
проще заюзать простой сниппет

Google

Aleh
03.11.2016
12:34:52
это даже не сохранение в модель их просто надо как-то из модели прокидывать, твой агрегат должен мочь сказать ВОТ ЭТО ВОТ ПРОИЗОШЛО

Anton
03.11.2016
12:36:48
ну крч да, тогда за основу возьму ес, для одного агрегата, которому важно восстановить сост я заюзаю трувэй, а для остальных - просто в обработчиках буду по старинке в бд пихать/изменять стейт сущностей
а, еще тонкий момент - у этого агрегата из другой системы приходят данные о его деятельности в третьей системе (лол, я знаю), их получается уже из агрегата лучше выкинуть, ибо в моем приложении на эти действия повлиять практически нельзя (максимум, заапрувить или отклонить у парочки)

Aleh
03.11.2016
12:46:38
не совсем понял
ну в смысле, какая разница откуда приходят апдейты?

Anton
03.11.2016
13:04:18
чтоб откатить эти действия - не достаточно лишь убрать эти записи - нужно делать запросы в другое приложение
https://rclayton.silvrback.com/do-you-really-need-a-uuid-guid блят :с
хрен переспорю чувака
придется нарушать принципы cqrs, по ходу, и ждать айдишник, и потом возвращать его из команды :с
ну или костылизировать как-то, чтоб команда не возвращала, но айдишник как-то по хитрому прокидывался
что тоже говно
стоп, я же могу юзать uuid, но оставить и автоинкрементное поле рядом, и индексы по нему строить

Anton
03.11.2016
13:08:06
но тогда выборка where uuid= :uuid будет медленной
сложные приколы

Sergey
03.11.2016
13:43:29
> Короче, я никакого конфликта в AC не вижу
ты ничего не нарушишь в принципе. Янг в одном из своих докладов говорил что смысл не в том что хэндлеры команд void, смысл в разделении ответственности
желательно что бы операции чтения и записи были максимально независимы

Aleh
03.11.2016
13:43:48

Sergey
03.11.2016
13:43:49
но это не условие

Aleh
03.11.2016
13:43:51
ивенты иммутабельны
если надо что-то отменить, то значит есть действие типа CancelSmth

Google

Aleh
03.11.2016
13:44:44

Anton
03.11.2016
13:46:14
хм, чтоб откатить до предыдущего состояния агрегат - мне нужно пролистать все действия от начала и до нужного евента/даты, но с действиями из другой системы так не получится

Aleh
03.11.2016
13:46:37
еще раз
ивенты имутабельны
ты их никогда не удаляешь

Anton
03.11.2016
13:47:14
я не про удаление говорю
смысл хранить всю истоию действий, если чтоб отменить три последних действия тебе нужно руками же их отменять, а не откатиться на три шага назад?)

Sergey
03.11.2016
13:51:33
я не про удаление говорю
вот вопрос, как ты отменяешь изменения в гите? например ты запушил что-то и хочешь от этого избавиться
ты ж не удаляешь коммит и git push --force
ты скорее всего сделаешь git revert

Admin
ERROR: S client not available

Sergey
03.11.2016
13:51:54
и создастся новый коммит (новый ивент)
который полностью инвертирует действие

Anton
03.11.2016
13:52:53
не точно выразился, сорян, просмотреть состояние систем на какое-то число, допустим

Sergey
03.11.2016
13:56:33

Sergey
03.11.2016
13:57:21
> просмотреть состояние систем на какое-то число, допустим
у тебя есть цепочка событий, ты можешь вычислить любой стэйт
на любое число)
но я хз чего ты вообще к event sourcing прицепился. Насколько я понял у тебя что-то типа агрегатора, нет?

Aleh
03.11.2016
14:10:04
пфф
ну, в дев-ветках треш и угар)

Anton
03.11.2016
14:26:27
@fes0r ну вообще, корневой сущности одного агрегата надо бы полноценный евент-сорсинг воткнуть, ибо часто бывает нужно узнать стэйт на определенную дату, ну и китайские менеджеры - те еще рукожопы, и без кнопочки "undo" в системе очень тяжко))

Google

Aleh
03.11.2016
16:29:44
Грег Янг что ли SICP читает https://github.com/gregoryyoung/cmal или чего это вдруг)

Sergey
03.11.2016
16:44:18
> @mkusher
так в CISP же ским, а не лисп

Aleh
03.11.2016
16:45:01
который диалект лиспа

Sergey
03.11.2016
16:45:11
ну да
но погодь, он тип делает свой лисп?

Aleh
03.11.2016
16:46:01
ну наверное
там ж просто в последней главе
пилят компилятор

Sergey
03.11.2016
16:46:27
а, ну да

Aleh
03.11.2016
16:46:32
только не на си конечно)
но может он сделает маленький компилятор лиспа, чтобы потом на лиспе сделать нормальный компилятор лиспа)

Sergey
03.11.2016
16:49:19
))))
теории теории

Алексей
03.11.2016
17:28:34
Слушайте)
еще вопрос)

Aleh
03.11.2016
17:28:52
https://getcomposer.org/

Алексей
03.11.2016
17:28:53
if(!in_array($result['category_name'], $categories_related)){
$categories_related[]= array(
'category_id' => $result['category_id'],
'category_name' => $result['category_name'],
'products' => array()
);
}
как потом products заполнить?
foreach ($categories_related AS $category_related){
foreach ($data['products'] AS $product){
if($category_related['category_id']==$product['category_id']){
$category_related['products'][]=$product;
}
}
}
так?

Aleh
03.11.2016
17:29:31
как тебе надо так и заполняй, лол)

Алексей
03.11.2016
17:29:40
так не получается..