@oop_ru

Страница 430 из 785
Sergey
15.12.2017
10:01:11
Не микрсоервисы. Если на слабосвязанные бандлы например делить, которые в рамках одного приложения, я думаю тоже это можно назвать сервис ориентирвоанной архитектурой. Ну и сервисы м воспринимаем как "что то делающий деятель", то есть в процессе размышления ставим действия а не данные. Ну и пришел я к SOA vs ES потмоу что ты сказал что без событий не получается грамотный whole object. То есть еще раз, вопросполучается как с whole object создать бизнес транзакцию без событий. Т.е. например получаем фотку от юзера и если там порнуха, то отклоняем ее, заносим полььзователя в бан на месяц, и отсылаем емэй в ментовку например) 1.Анемичная модель: Сервис фотоприемщик, в которые инджектится фотоМодератор, в который инджектятся сервисФотореагировщик, и уже реализация этого реагирвоика содержит вызов сервисов отправки емайла, бана и т.д. Заметим, если всё делать через DI это будет ее все очень расширемо и легко кастомизируемо за счет полиморфизма в релализации интерфейса разными классами под каждую ситуацию(порно фотка, недостаточный размер фотки, мат на фотке и т.д) Все понятно, хорошо читается и расширяется. Если есть к вашей ide плагин для нормлаьной работы с di. 2. сОбытийна модель. ну вот произошло событие загрузки фотки(кстати кто его должен выбросить, фотка сама? или у нас какой то есть сущность для этого другая)? И далььше она обрабатывается всеми штуками. Тут у мнея опыта немного, так тчо не смогу подробно расписать, но идея мне понятна. 3. whole object без событий или то что я называл богатой доменной моделью. Вообще хз что куда пихать? вот дернули метод контроллера загрузить фотку, и дальше что опять нам нужен какой то фотоприемщик, но это насколько я понимаю плохое назваание для сущности(так как отглагольное, и по сути тот же сервис из пункта 1). Но вот допустим приняли мы фотку, и дальше какое ее взаимодествие и с кем? Я не могу понять как бить ответственности между сущностями предметной области, их вообще выделять? Если в анемичной или событийной модели я просто рассматирваю данные(объект фотки) котоырй проходит через разные фильтры/преобразоователи и с которым в итоге что то происходит - могу это ясно изобразить и в коде и на бумаге. Тот тут у меня ступор
ох.... я вечером почитаю

Roman
15.12.2017
10:01:30
доменный ивент - это факт. Разве у тебя SaveChanges не является коммитом и точкой завершения бизнес транзакции? и разве не только тогда ивенты превращаются в факты?
Нет. SaveChanges может быть несоклько. Фактом явзяется успешное сохранение данных и последующий успешный коммит транзакции после этого.

Sergey
15.12.2017
10:01:57
Нет. SaveChanges может быть несоклько. Фактом явзяется успешное сохранение данных и последующий успешный коммит транзакции после этого.
есть разница между транзакцией в базе и логической транзакцией. ТАм картинка есть с двумя агрегатами разными

каждый агрегат по сути - граница бизнес транзакции

Google
Roman
15.12.2017
10:02:25
есть разница между транзакцией в базе и логической транзакцией. ТАм картинка есть с двумя агрегатами разными
Вот фишка в том, что когда CQRS - то ты в один момент времени с одним агрегатом работаешь.

Sergey
15.12.2017
10:02:34
проблема в том что ты смешиваешь транзакции в базе и бизнес транзакции. Порой операция подразумевает процесс из нескольких бизнес транзакциц

Roman
15.12.2017
10:03:17
это не CQRS фишка, это в целом суть агрегата.
Ну если положить его на CQRS, То ровно это и получится)

Sergey
15.12.2017
10:03:17
но если у тебя с агрегатом что-то случилось, и это должно быть тригером для другого агрегата, в другом контексте - ивенты тут хорошо подходят

Ну если положить его на CQRS, То ровно это и получится)
из CQRS мы тут говорим только про команды. а потому нет смысла его сюда припихивать

ты можешь ивентами read model формировать - это да

но суть - в изоляции контектов

Enterpise
15.12.2017
10:04:02
Наилучшим решением в данном случае будет «заинлайнить» поля из таблицы Address в таблицу Person: http://www.pvsm.ru/c-2/109627

Sergey
15.12.2017
10:04:42
короч, доменные ивенты по коммиту транзакции это не зашквар

а так как я не настолько помню как entity framerork работает - то тут ничего не могу подсказать/расскзатьа

Enterpise
15.12.2017
10:05:38


Aleh
15.12.2017
10:05:40
Не микрсоервисы. Если на слабосвязанные бандлы например делить, которые в рамках одного приложения, я думаю тоже это можно назвать сервис ориентирвоанной архитектурой. Ну и сервисы м воспринимаем как "что то делающий деятель", то есть в процессе размышления ставим действия а не данные. Ну и пришел я к SOA vs ES потмоу что ты сказал что без событий не получается грамотный whole object. То есть еще раз, вопросполучается как с whole object создать бизнес транзакцию без событий. Т.е. например получаем фотку от юзера и если там порнуха, то отклоняем ее, заносим полььзователя в бан на месяц, и отсылаем емэй в ментовку например) 1.Анемичная модель: Сервис фотоприемщик, в которые инджектится фотоМодератор, в который инджектятся сервисФотореагировщик, и уже реализация этого реагирвоика содержит вызов сервисов отправки емайла, бана и т.д. Заметим, если всё делать через DI это будет ее все очень расширемо и легко кастомизируемо за счет полиморфизма в релализации интерфейса разными классами под каждую ситуацию(порно фотка, недостаточный размер фотки, мат на фотке и т.д) Все понятно, хорошо читается и расширяется. Если есть к вашей ide плагин для нормлаьной работы с di. 2. сОбытийна модель. ну вот произошло событие загрузки фотки(кстати кто его должен выбросить, фотка сама? или у нас какой то есть сущность для этого другая)? И далььше она обрабатывается всеми штуками. Тут у мнея опыта немного, так тчо не смогу подробно расписать, но идея мне понятна. 3. whole object без событий или то что я называл богатой доменной моделью. Вообще хз что куда пихать? вот дернули метод контроллера загрузить фотку, и дальше что опять нам нужен какой то фотоприемщик, но это насколько я понимаю плохое назваание для сущности(так как отглагольное, и по сути тот же сервис из пункта 1). Но вот допустим приняли мы фотку, и дальше какое ее взаимодествие и с кем? Я не могу понять как бить ответственности между сущностями предметной области, их вообще выделять? Если в анемичной или событийной модели я просто рассматирваю данные(объект фотки) котоырй проходит через разные фильтры/преобразоователи и с которым в итоге что то происходит - могу это ясно изобразить и в коде и на бумаге. Тот тут у меня ступор
возьми свой первый пункт и вместо сервиса фотоприемщика с одним метод принять фотку запихай этот весь метод в сущность юзера, а все нужные зависимости передай как аргументы

Google
Sergey
15.12.2017
10:05:40
зашквар - доменные ивенты как обычные "события" инфраструктурные или хуки

Roman
15.12.2017
10:06:58
но если у тебя с агрегатом что-то случилось, и это должно быть тригером для другого агрегата, в другом контексте - ивенты тут хорошо подходят
Я думал как сделать - есть команды/запросы и их обработчики (CQRS, не без ES). Прилетает мне команда - я резолвлю обработчик, вызываю его, передавая в него команду. Далее, в ней самой я вызываю доменные сервисы, которые в результате своих действий возвращают эвенты, которые я просто складываю в список. Далее, после успешного коммита транзакции - я пуляю список эвентов в медиатор, который уже будет уведомлять тех, кто эти эвенты ожидает получить. Что скажешь?

Артур Евгеньевич
15.12.2017
10:09:15
возьми свой первый пункт и вместо сервиса фотоприемщика с одним метод принять фотку запихай этот весь метод в сущность юзера, а все нужные зависимости передай как аргументы
Что значит сущность юзераа? Он же не сам себе ммодерирует, он пытается заагрузить плохую фотку, а кто то другой должен ему помешать. Ну или допустимм сделаю я метод uploadPhoto...и что мне в сущность инджектить разные валидаторы? и объекты реаагирующие на на разные итоги ваалидации?

Тут ее вопрос размазывании валидации по слоям? То есть инфраструктурная валидация и бинесс валидация?

Maksim (Ellrion)
15.12.2017
10:19:17
Я думал как сделать - есть команды/запросы и их обработчики (CQRS, не без ES). Прилетает мне команда - я резолвлю обработчик, вызываю его, передавая в него команду. Далее, в ней самой я вызываю доменные сервисы, которые в результате своих действий возвращают эвенты, которые я просто складываю в список. Далее, после успешного коммита транзакции - я пуляю список эвентов в медиатор, который уже будет уведомлять тех, кто эти эвенты ожидает получить. Что скажешь?
так у Сергея вроде нет доменных сервисов, и ты не можешь вызвать в одном месте действия разных сущнойстей (сущностей разного контекста?), так как вызов этих действий у него это реакция на эвент от других сущностей. а у тебя выходит что эвенты то вообщем и не нужны(не играют роли в построении бизнес процесса). нет?

Roman
15.12.2017
10:21:30
так у Сергея вроде нет доменных сервисов, и ты не можешь вызвать в одном месте действия разных сущнойстей (сущностей разного контекста?), так как вызов этих действий у него это реакция на эвент от других сущностей. а у тебя выходит что эвенты то вообщем и не нужны(не играют роли в построении бизнес процесса). нет?
Я в отрыве от всех дискусий вынес на обсуждение данный подход) Поэтому немного не в курсе треда про Сергея) Суть в том чтобы просто опубликовать событие, вида "Сущность пользователя такого-то изменилась" или "Создан заказ такой-то", чтобы отвязать обработчик конкретной команды от тех обработчиков, которые как-то должны реагировать на эти события.

Артур Евгеньевич
15.12.2017
10:31:55
да, передай их просто аргументами в метод
мне не нравится, почему юзер должен знать, что там с его фоткой будут мнипуляции...для него это просто как почтовый ящик должно быть, он кидает фотку и всё - хз что там с ней будет, ибо дойдет либо нет

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

и только потом когда все справки полученны кидаем в ящик

Aleh
15.12.2017
10:32:37
если не нравится, что это знает сам юзер, он может быть связан с объектом Photo, который знает только про саму фотку

Артур Евгеньевич
15.12.2017
10:33:17
Потому что ты заходишь в бар например, и ты должен показать пасспорт, то есть раскрыть свою инкапсуляцию чуть чуть.

Так что чтобы тебя контроллирвоать нужно тчо то знать о тебе

а кто должен это делать?
или сервис/контроллер который будет вызывать разные штуки, т.е будет обладать знанием о жиненном цикле фотки, либо , как вчра выяснили собтия

Google
Артур Евгеньевич
15.12.2017
10:35:03
что то мои слова напоминают мне то что я слышал о функциональшине - типо есть данные и хуяришь их по цеопчке йункция

Aleh
15.12.2017
10:35:10
чем же тебе так не нравится идея того, что объекты сами что-то делают, потому что обладают всей информацией для этого

информационный эксперт и вот это вот все

Артур Евгеньевич
15.12.2017
10:36:40
Потому что это противоречит разделению обязнностей. Пользователь не должен заниматсья саомконтроллем и тем более контроллем фотографии

И связанность сильная получается

И связанность сильная получается
Зачем яму знать что я собираюьс емайл отправлять из з атого что он загрузил фотку

Aleh
15.12.2017
10:37:24
что такое разделение обязанностей в твоем понимании?

почему пользователь не должен заниматься проверкой собственных инвариантов?

Mykola
15.12.2017
10:39:37
почему пользователь не должен заниматься проверкой собственных инвариантов?
потому что это днище, может он пусть и код сам пишет? :)

Aleh
15.12.2017
10:39:54
как вариант)

я бы не отказался от объекта, который вместо меня может код писать :3

Mykola
15.12.2017
10:41:14
я бы не отказался от объекта, который вместо меня может код писать :3
мы как-то сильно напились, и думали о будущем... в будущем нейронные сети будут вместо людей код писать

Артур Евгеньевич
15.12.2017
10:41:33
почему пользователь не должен заниматься проверкой собственных инвариантов?
Не собственных!! Кейс с фоткой, с точки зреня пользооваателя всё ок, он увидел возможность загрузить картинку он берет картинку и грузит. Если он будет проверять по каким то бизнесс правилам(порно не порно/ экстремизм не экстремизм) или инфраструтурным(формат jpeg/gif, минимлаьный размер) то получается чо он лезет кудаа не должен - в првила нашего приложения. И какого хрена он сам себя валидирует, где гранатия что валидция пройдет как надо. Давайте представим что вот пользователь просто грузит фотки, у него оодна обдяанность попытатьс язагрузить фотку - он не мент, не почтальон, не контроллер, он просто нажимает на субмит/кидает фотку в почтовый ящик и т.д. А ты предлагаешь его каким то год обджектом сделать который будет абсоютносамодостаточен и будет иметь доступ к львиной доил бизнесс логики

Mykola
15.12.2017
10:42:20
да это он набросил, не ведись)

Aleh
15.12.2017
10:42:34
Не собственных!! Кейс с фоткой, с точки зреня пользооваателя всё ок, он увидел возможность загрузить картинку он берет картинку и грузит. Если он будет проверять по каким то бизнесс правилам(порно не порно/ экстремизм не экстремизм) или инфраструтурным(формат jpeg/gif, минимлаьный размер) то получается чо он лезет кудаа не должен - в првила нашего приложения. И какого хрена он сам себя валидирует, где гранатия что валидция пройдет как надо. Давайте представим что вот пользователь просто грузит фотки, у него оодна обдяанность попытатьс язагрузить фотку - он не мент, не почтальон, не контроллер, он просто нажимает на субмит/кидает фотку в почтовый ящик и т.д. А ты предлагаешь его каким то год обджектом сделать который будет абсоютносамодостаточен и будет иметь доступ к львиной доил бизнесс логики
вот как раз если логика в объекте пользователя или там в объекте фотки, то у тебя есть гарантия, что валидация пройдет, если же кто угодно в этот объект может запилить что угодно и не вызвать какой-то там сервис, то вот где гарантии уж точно нет)

Не собственных!! Кейс с фоткой, с точки зреня пользооваателя всё ок, он увидел возможность загрузить картинку он берет картинку и грузит. Если он будет проверять по каким то бизнесс правилам(порно не порно/ экстремизм не экстремизм) или инфраструтурным(формат jpeg/gif, минимлаьный размер) то получается чо он лезет кудаа не должен - в првила нашего приложения. И какого хрена он сам себя валидирует, где гранатия что валидция пройдет как надо. Давайте представим что вот пользователь просто грузит фотки, у него оодна обдяанность попытатьс язагрузить фотку - он не мент, не почтальон, не контроллер, он просто нажимает на субмит/кидает фотку в почтовый ящик и т.д. А ты предлагаешь его каким то год обджектом сделать который будет абсоютносамодостаточен и будет иметь доступ к львиной доил бизнесс логики
не к львиной, только к той, к которой он причастен

ну не нравится тебе метод в юзере, сделай объект Photo и занеси это все туда

Google
Артур Евгеньевич
15.12.2017
10:43:48
У меня сайт знакомст, тут пользователь причастен абсолютно ко всем процессам)))

Aleh
15.12.2017
10:43:57
это проблема разделения

Артур Евгеньевич
15.12.2017
10:44:07
ну не нравится тебе метод в юзере, сделай объект Photo и занеси это все туда
Наверно мне не нравится идея саамовалидации как я понял

Aleh
15.12.2017
10:44:17
вообще User должен быть причастен только к блоку прав и авторизации, по-хорошему

Наверно мне не нравится идея саамовалидации как я понял
не люблю гарантии, люблю когда все можно поломать

вообще User должен быть причастен только к блоку прав и авторизации, по-хорошему
а дальше там уже какие-нибудь друзья должны быть и прочее, в красной книге на эту тему хороший пример

Артур Евгеньевич
15.12.2017
10:45:17
красная это Вернон?

Aleh
15.12.2017
10:45:54
да

Артур Евгеньевич
15.12.2017
11:02:08
Ну хз а допустим юзер грузит фотку а у меня может быть разные варианты с ней - определить в соответствующую категорию в зависимости от того что на ней, может отклонить и добавить юзера, а может вообще описать текстом ее содержимое. + для разных разделов сайта разныеправила модерации. Это что мне сколко классов фотко создавать? Или это все в одном классе, где фотка сама себя анализирует идентефицирует, валидирует и модерирует. Какая то слишком уж самостоятельная сущность и многогранная

Aleh
15.12.2017
11:03:44
а какая альтернатива? 10 разных процедур, которые кто будет вызывать?

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

а так, если у тебя есть куча разных типов фоток, так вырази это в коде

Aleh
15.12.2017
14:23:47
https://www.quora.com/Is-Alan-Kay-correct-that-building-software-is-still-like-the-design-and-construction-of-ancient-structures-like-the-Pyramids-in-the-era-before-architecture

там и ссылачка на статью и ответы Кея

Sergey
15.12.2017
21:53:00
Like
15.12.2017
23:17:49
Такой вопрос: правильно ли я понимаю, что ивенты нужно использовать тогда, когда то, что делает событие выходит за рамки контекста места где вызывается? А обращаться напрямую (заинжектить объект нужного класса и дергнуть метод) только когда все в одном контексте? Самый простой кейс: отправка имейла с подтверждением регистрации, так как это два разных сервиса (юзеры и сообщения) и они в принципе ничем не свзанны (кроме того, что юзер зависит от этого за счет того, что нужно отправлять сообщение), то здесь должно быть событие. Ну и в случае, если бы сервис сообщений существовал бы только для юзеров, то можно было бы дергнуть метод. Так?

Google
Like
15.12.2017
23:19:41
Или дело вкуса?

Mykola
15.12.2017
23:40:08
сами по себе ивенты ничем не отличаются от вызова асинхронной процедуры

Like
15.12.2017
23:40:34
Это понятно

Mykola
16.12.2017
00:04:38
ну а дальше же как и с процедурами, депенденси инвершн и т.д.

ioc

Like
16.12.2017
00:05:18
Ну, вопрос не про это :(

Mykola
16.12.2017
00:05:37
как же не про это?

просто предстявляешь, что вместо ивента ты процедурку вызваешь

и если это нормально - то ивенты тебе подходят

а если нет - то лучше другим способом

Like
16.12.2017
00:07:22
Вот теперь понял, спасибо)

Sergey
16.12.2017
08:24:37
просто предстявляешь, что вместо ивента ты процедурку вызваешь
меня смущает такая формулировка вопроса... мне кажется что это немного не корректно

Aleh
16.12.2017
10:05:18
Отличаются только наличием объекта, через который идет "вызов"

Sergey
16.12.2017
10:07:00
мне кажется что термин "вызов" в контексте событий не корректен

отличие как раз таки в том что при "вызове" ты должен знать кого вызывать, а ивенты - наоборот, тебе не интересно кто будет обрабатывать событие и будет ли вообще

Aleh
16.12.2017
10:07:42
Я не знаю другого

Кого именно я вызову - не знаю

С событием я тоже знаю интерфейс

Страница 430 из 785