
Sergei
08.10.2018
16:39:18


Gennadiy
08.10.2018
19:03:07
Всем привет, помогите прозреть. Есть легаси код, нужно как то грамотно переписать. Собственно интернет магазин, есть заказы, заказ по сути корневой агрегат, содержит в себе ряд других агрегатов, таких как клиент, адрес доставки, и еще по мелочи.
Сейчас в общем выглядит так, фреймворк yii2:
Прилетает запрос с данными, создаются несколько форм.
создается новый класс, не знаю даже как его правильно назвать, принимает в конструкторе все эти формы
у класса вызывается метод create - который готовит DTO для заказа
потом вызывается save у него же, который через сервис создает entity и через репозиторий сохраняет
1. Собственно ряд вопросов, кто должен отвечать за dto для создания дочерних агрегатов, корневого?
2. Должен ли dto для корневого агрегата содержать сущности или же должен так же содержать dto для этих сущностей, которые в свою очередь будут созданы при создании сущности корневого. Может ли корневой агрегат внутри себя создавать дочерние?
3. Как это вообще грамотно организовать?
Сильно не пинайте, хочется разобраться.


Aleh
08.10.2018
19:06:24
Всем привет, помогите прозреть. Есть легаси код, нужно как то грамотно переписать. Собственно интернет магазин, есть заказы, заказ по сути корневой агрегат, содержит в себе ряд других агрегатов, таких как клиент, адрес доставки, и еще по мелочи.
Сейчас в общем выглядит так, фреймворк yii2:
Прилетает запрос с данными, создаются несколько форм.
создается новый класс, не знаю даже как его правильно назвать, принимает в конструкторе все эти формы
у класса вызывается метод create - который готовит DTO для заказа
потом вызывается save у него же, который через сервис создает entity и через репозиторий сохраняет
1. Собственно ряд вопросов, кто должен отвечать за dto для создания дочерних агрегатов, корневого?
2. Должен ли dto для корневого агрегата содержать сущности или же должен так же содержать dto для этих сущностей, которые в свою очередь будут созданы при создании сущности корневого. Может ли корневой агрегат внутри себя создавать дочерние?
3. Как это вообще грамотно организовать?
Сильно не пинайте, хочется разобраться.
1. что значит создаются несколько форм? Валидаторы какие-то
2. что значит создается класс, может объект создается?
3. что значит у класса метод вызывается, методы же у объектов О.о
4. агрегат в себе не может содержать другие агрегаты, только хранить ссылки(id в идеале) на другие. Агрегат это граница бизнес транзакции, т.е. в одну транзакцию вовлечен(меняется) один агрегат
5. зачем класс создает dto, entity, вызывает save, идет в репозиторий и чето еще сохраняет? Это какой-то мрак
6. зачем вам вообще dto? DTO не содержит в себе других сущностей, ведь они не transfer objects(обычно)

Google


Gennadiy
08.10.2018
19:29:19
1. что значит создаются несколько форм? Валидаторы какие-то
2. что значит создается класс, может объект создается?
3. что значит у класса метод вызывается, методы же у объектов О.о
4. агрегат в себе не может содержать другие агрегаты, только хранить ссылки(id в идеале) на другие. Агрегат это граница бизнес транзакции, т.е. в одну транзакцию вовлечен(меняется) один агрегат
5. зачем класс создает dto, entity, вызывает save, идет в репозиторий и чето еще сохраняет? Это какой-то мрак
6. зачем вам вообще dto? DTO не содержит в себе других сущностей, ведь они не transfer objects(обычно)
1. Ну по сути да, только для валидации.
2. Да, объект, прошу прощения)
3. Та же беда.
4. Ну вероятнее я не совсем корректно использую терминологию. Пример такой, есть заказ у которого есть адрес доставки, но адрес доставки это другая сущность, которая не имеет смысла без заказа, но может быть изменена. Является ли адрес доставки агрегатом?
5. Еще какой мрак, поэтому и переписывается.
6. на основе dto создаются сущности. только наверное для этого и используются
То есть есть агрегат, который содержит в себе сущности, вот так пожалуй правильно будет.


Aleh
08.10.2018
19:50:36
6. попробуйте убрать dto совсем, используйте структуры полученные после валидации далее

Gennadiy
08.10.2018
19:59:29
Я попробую, но не это самое страшное)
в каком слое должен быть создан агрегат? Могу я передать формы в сервисный слой?
кто отвечает за создание сущностей, таких как адрес доставки.

Aleh
08.10.2018
20:09:16
а что если корень агрегата вызывается/создается прямо из контроллера?)

Gennadiy
08.10.2018
20:10:12
ну как вариант

Артур Евгеньевич
09.10.2018
09:29:06
Здравствуйте уважаемые ооп разработчики
Исполльзуете ли вы суффикс Listener для листенеров?

Aleh
09.10.2018
09:30:07
а он точно листенер?
может главная задача твоего объекта какая-то другая?

f4rt~
09.10.2018
09:31:12
всм суффикс, а чего не постфикс?

Артур Евгеньевич
09.10.2018
09:34:13
точнее было замечание что надо листенеры называть не по тому что они слушают, а по тому что они делают

Google

Yury
09.10.2018
09:34:37

Артур Евгеньевич
09.10.2018
09:35:35
вот есть событие показа витрины, я пишу сервис /слушатель который запишет статистику в кликхаус
ShowcaseAbTestStatWriter
пока так назвал
ну типо а то что это слушатель будет ясно по наличию метода onShowcaseWasShown и тайпхинту

Evgeniy
09.10.2018
09:40:56
а почему не как то так ?
class ClickHouseStatUpdater
__invoke(ShowcaseShownEvent event)
примерно

Sergey
09.10.2018
09:42:51
Дык может а этот кликхаус 100500 событий летит
Из разных листенеров

Evgeniy
09.10.2018
09:43:19
ну имхо пусть каждый класс на каждое событие будет заявязан
единствоответственности все дела

Артур Евгеньевич
09.10.2018
09:45:24
причем раньше было что то типо ClickHouseRequestManager который напрямую дергался в нужный момент
а щас переделывается на события

Evgeniy
09.10.2018
09:46:28
каждый класс слушатель просто на входе получает евент нужного типа
например будут классы ClickHouseShowcaseOpenUpdater, ClickHouserShowcaseCloseUpdater и тд
получается 1 листенер работает с одним типом события

Aleh
09.10.2018
09:47:33
Updater и Listener разницы немного

Evgeniy
09.10.2018
09:47:40
при открытие или закрытия окна свои типы евентов идут

Google

Evgeniy
09.10.2018
09:48:07
ну пусть будет листенер что в этом такова запрященного

Артур Евгеньевич
09.10.2018
09:48:08
я не понял зачем через invoke это делать

Evgeniy
09.10.2018
09:48:26
потому что один класс обрабатывает только один тип эвентов
и есть класс который получает цепочку обработчиков для каждого эвента
например при открытие окна надо обновить статистику в кликхаусе и например записать в лог или еще что обновить
грубо говоря есть событие есть обработчики (один или несколько или неодно, описано в конфиге)

Артур Евгеньевич
09.10.2018
09:51:09
чето я мысль вообще потерял
щас у меня есть событие что витрина открылась
у нее дохуя может быть обработчиков,
какой то может забанить пользователя, какой то записать чтото в статистику, какйо то запретить открывать ее

Evgeniy
09.10.2018
09:52:01
вот

Артур Евгеньевич
09.10.2018
09:52:03
эт событие просто в бас кидается и обработчики никак не связаны между собой

Evgeniy
09.10.2018
09:52:13
у тебя есть цепочка обработчиков этого события
каждый обрабочтик это отдельный класс

Артур Евгеньевич
09.10.2018
09:52:48
конечно отдельный, они в разных модулях/контекстах все лежат

Maksim
09.10.2018
09:53:54
Извините за оффтоп, а у вас много на работе коллеги матерятся?
Чет меня иногда триггерит от того, как коллега бомбит, я осознаю, что сам начинаю находиться в напряжении от этого, хотя его агрессия направлена чисто на код/рабочие процессы, а не на коллег.

Bohdan
09.10.2018
09:55:45
матерятся иногда, но заковыристо, меня не колышет
если тебя колышет - наушники/беруши
был у меня период, когда отвлекало все подряд - беруши помогали

Yury
09.10.2018
09:57:41

Bohdan
09.10.2018
09:57:56

Google

Dmitriy
09.10.2018
09:58:11
пиши тесты и матерись

Evgeniy
09.10.2018
09:58:13
еще раз у тебя есть vo с данными евента, на каждый евент свой тип например ShowcaseOpenEvent
далее есть интерфейс обработчиков ShowCaseOpenListenerInterface
далее есть непосредственно обработчики:
ClickHouseStatUpdater implements ShowCaseOpenListenerInterface
UserBan implements ShowCaseOpenListenerInterface
и тд
и есть место конфигурации что при событие ShowcaseOpenEvent нужно запустить следующие обработчики [ClickHouseStatUpdater::class, UserBan::class] (эта штука настрайвается как раз)
и соответственно есть обработчик эвентов который на входе получает event опеределяет конфигурации и по тем классам его передает
по крайне мере я как то так вижу обработчик эвентов
соответственно пишется любой класс реализующий интерфейс, далее добавляется его вызов в конфиг.

Bohdan
09.10.2018
09:59:17

Yury
09.10.2018
10:00:36

Bohdan
09.10.2018
10:01:29

Артур Евгеньевич
09.10.2018
10:02:58
еще раз у тебя есть vo с данными евента - ну это дтошка а не во
далее есть интерфейс обработчиков нет нету, это вообещ не понимаю зачем может быть нужно
То что ты описал вообще на какой то Chain of responsibility
У меня просто обычные реакции на событие, котоыре вообще асинхронными могут быть и в теории не в этом запрсое выполнятся

Evgeniy
09.10.2018
10:04:47

Артур Евгеньевич
09.10.2018
10:05:12
нет всё не так

Arky
09.10.2018
10:05:40

Evgeniy
09.10.2018
10:05:41
ну я понимаю что ты просто сейчас пишешь листенер в систему которая уже написана и работает
и тогда единственный вариант это делать единообразно, посмотри как сделаны другие листенеры
и сделай также

Артур Евгеньевич
09.10.2018
10:06:09
он вообще не на листенерах
это просто сахарок, который sql формирует грубо говоря

Evgeniy
09.10.2018
10:06:26
ну вот я предлагаю каждый метод сделать классом

Артур Евгеньевич
09.10.2018
10:06:33
он ничего не слушает а просто дергается

Evgeniy
09.10.2018
10:06:46
чтобы класс делал только это (единство ответственности)

Артур Евгеньевич
09.10.2018
10:06:51

Google

Артур Евгеньевич
09.10.2018
10:07:13
я в своем пакете подписываюсь на событие другого, и вопрос был номрлаьно ли использовать слово Listener или нет

Evgeniy
09.10.2018
10:07:27
что за AbTest и тд)
куда он пишет и тд

Пидорас
09.10.2018
10:08:59
Привет. Кто-нибудь может объяснить некоторые особенности цикла событий (event loop)?

Anton
09.10.2018
10:09:43

Артур Евгеньевич
09.10.2018
10:10:08
что за AbTest и тд)
ShowcaseAbTest - аб тест витрины. ПОлностью вот так звучит DemandsElasticityShowcaseAbTest
куда пишет знать и не надо, так как это application и писать он будет туда, какой whiter заинджектим в него

Пидорас
09.10.2018
10:11:10

Anton
09.10.2018
10:11:45

Пидорас
09.10.2018
10:12:08

Anton
09.10.2018
10:12:37
В документации той реализации которую ты используешь.

Evgeniy
09.10.2018
10:12:46

Пидорас
09.10.2018
10:12:55
Браузерного
Chrome, например

Anton
09.10.2018
10:14:02
В контексте JS
https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop