
Sergey
20.09.2017
20:09:22
потому как у меня есть сервисы уровня "модели" а есть сервисы уровня приложения

Sergei
20.09.2017
20:10:56
ну ты описание глянь лучше, ибо я не уверен что правильно тебя понял
Прочитал, сравнил ещё с active record как я понял row date gateway это прокачанная версия active record, AR подразумевает что весь код который отвечает за сохранение обьекта в БД и код который отвечает за что то другое в обьекте находятся в одном классе. RDG уже как бы рефакторит AR и убирает ответственность за сохранение обьекта в другой обьект, теперь условный User делегирует своё сохранение. Что предлагаю я, рефакторить Dao и Dto в RDG только инстанс dao будет один для всех экземпляров юзера. Ничего не поменяется вместо того чтобы где то держать в одной руке юзера, в другой dao мы будет говорить юзерю "сохрани себя в базу" и всё, обьект снова станет полноценным.

Sergey
20.09.2017
20:12:18
или ты о том что будет лже-репрезентация "рядов"?

Google

Sergey
20.09.2017
20:12:44
я плохо понимаю зачем это надо...

Sergei
20.09.2017
20:15:32

Sergey
20.09.2017
20:16:16
ну там идея что "гейтвей" это все же модель данных
она отвечает за персист. Ты же предлагаешь сделать... еще большее разделение
и у меня вопрос - зачем?
оно и так неплохо тестируется


Alexey
20.09.2017
20:17:12
потому как у меня есть сервисы уровня "модели" а есть сервисы уровня приложения
Ну значит. У меня есть сервисы которые могуть отвечать за выборку. Сервисы, которые отвечают за какой-либо юзкейс (Создание пользователя, запроса восстановления пароля и т.д) и есть сервисы каторые связаны с работой над файлами (та же ава пользователя, уменьшить ее, вотермарки всякие и т.д.). Просто я думаю, что все что связано с самой сущность (event которая они генерирует, dto, которые из нее собираются, exception, которые может кидать ну и репозиторий, с помощью которого мы получаем выборки ) относится к модели. Так же думаю, что сервисы, которые завязаны на юзкейсы, так же относятся к модели и должны лежать там, но их работа может зависеть от сервисов уровня приложения. Получается если я использую сервис приложения, он кидает exception, должен ли я его преобразовывать в exception уровня модели


Sergey
20.09.2017
20:18:38
> Так же думаю, что сервисы, которые завязаны на юзкейсы, так же относятся к модели и должны лежать там, но их работа может зависеть от сервисов уровня приложения.
направление зависимостей должно быть строго от сервисов уровня приложения (юзкейсы) к модели. Но никак не наоборот.

Sergei
20.09.2017
20:18:39

Sergey
20.09.2017
20:19:02

Alexey
20.09.2017
20:20:58
То бишь есть у меня загрузка фото. Сервис модели просит сервис приложения загрузить фото и дать путь к нему.


Sergei
20.09.2017
20:22:58
всеравно не понимаю)
Ну допустим я получаю из фабрики User (передав фабрике все параметры name, age,gender) у меня этот инстанс юзера пока висит в памяти, он не персистентый, теперь я хочу его сохранить, я беру DAO передаю в этот dao User мне нужно сделать эту операцию руками условно говоря. При моём подходе я просто скажу юзеру save(); и юзер делегирует своё сохранение DAO который будет его полем. А я ничего про это DAO могу и не знать. Я скрыл реализацию.

Google

Sergey
20.09.2017
20:23:28
модель ничего не должна знать о том как происходит загрузка файлов
от слова совсем
более того, сервисы "модели" НИЧЕГО не должны знать о сервисах приложения. Если надо попользоваться инфраструктурой - используем инверсию зависимостей
ну и да, "сервисы приложения" - это по сути и есть юзкейсы. А вот сервисы модели могут реализовывать отдельные бизнес рулы, калькуляции и т.д.
короч почитай про архитектуру портов и адаптеров
там хорошо с точки зрения разделения на слои

Sergei
20.09.2017
20:25:31

Anton
20.09.2017
20:26:17
Бытует мнение что наличие "сервисов модели" признак того что модель спроектирована неправильно

Sergey
20.09.2017
20:27:28
причем сама суть одинаковая у всех стратегий, это "стоимость заявленная у продукта умножить на какой-то коэффициент"
а вот каким образом выбираются коэффициенты - это уже в зависимости от конфигурации
как быть?

Alexey
20.09.2017
20:29:33

Sergey
20.09.2017
20:30:47
Хмм. Сервисы уровня приложения не относятся к модели, так?
я выделяю три уровня:
- модель - низкий уровень. бизнес правила и ограничения.
- приложение - высокий уровень. Юзкейсы, цельные сценарии.
- инфраструктура - все что не относится к логике приложения, всякие инфраструктурные штуки вроде роутеров, абстракций для работы с файловой системой... фреймворк короч
на счет "уровня приложения" - я не особо уверен насколько оно часть или не часть "модели", я это просто разделяю ибо уж сильно по разному это все выглядит и действует. Ты по сути в них собираешь юзкейсы из кирпичиков.
да и у Эванса похоже.... но у меня в последнее время все меньше возникает желание писать подобные сервисы...

Anton
20.09.2017
20:33:29

Sergey
20.09.2017
20:33:59

Google

Sergey
20.09.2017
20:34:07
тебе нужно подменять очень маленькую штуку
я не уверен как это делать если честно) просто у меня такая вот ситуация и то как я это разрулил мне не нравится)

Anton
20.09.2017
20:34:35
Дублирование проблема локальная и есть множество паттернов для ее решения, не?

Sergey
20.09.2017
20:34:46
и выделение этого всего в отдельный класс
и приходим к сервисам
я не вижу проблемы, мой сервис никак не нарушает инкапсуляции сущностей
передаю я его через дабл диспатч
тестируется удобненько

Anton
20.09.2017
20:36:22
Я на самом деле тоже не вижу. Но мнение такое в DDD сообществе есть.

Sergei
20.09.2017
20:36:32

Sergey
20.09.2017
20:36:49

Anton
20.09.2017
20:37:35
Потому и написал что это только признак

Sergey
20.09.2017
20:38:25
как убедиться что ты более-менее понимаешь как выбирать агрегаты?
ибо я чет подозреваю что я это делаю неправильно
как минимум потому что никак не могу объяснить даже себе почему я разбил так а не иначе)

Alexey
20.09.2017
20:39:45

Sergey
20.09.2017
20:40:35
и есть Model
там дальше тоже разделение по "фичам" просто чуть более мелкое

Google

Sergey
20.09.2017
20:41:21
но честно скажу - не сказать что я в восторге)
просто лучше ничего не придумал и в целом как показывает практика особо проблем не создает

Anton
20.09.2017
20:42:46
Могу порекомендовать почитать / посмотреть Udi Dahan
Для себя очень много у него почерпнул

Sergey
20.09.2017
20:43:25
оке, займусь

Alexey
20.09.2017
20:46:12
оке, займусь
Еще под инверсией, имеету ввиду, что например мой юзкейс нуждается в сервисе загрузки файлов. Он должен зависеть от интерфейса, а сервис загрузки его должен реализовать. Правильно я понимаю?

Sergey
20.09.2017
20:46:34
и интерфейс этот принадлежит тому модулю который его юзает
а не тому кто имплементит
иначе никакой инверсии не произошло

Alexey
20.09.2017
20:47:52

Sergey
20.09.2017
20:50:52
то есть файл уже загружен на момент когда вызывается хэндлер
так что мне проще)

Alexey
20.09.2017
20:53:13

Sergey
20.09.2017
20:54:04
ну это никак к бизнес логике не относится)
я вообще сторонник подходов когда загрузка файлов должна происходить вообще отдельно от дальнейших манипуляций
типа сначала залили аватарку и потом уже создали юзера. Ну или наоброт.
2 запроса, 1 запрос тупо инфраструктура

Google

Sergey
20.09.2017
20:55:35
конечно если наша предметная область не загрузка файлов (дропбокс например)

Alexey
20.09.2017
20:57:49

Sergey
20.09.2017
20:58:25
вопрос в том что у тебя появляются сущности вроде "файла" или "директории"
просто они не совсем относятся к "файловой системе"

Alexey
20.09.2017
21:00:49
и это интерфейс будет лежать рядом, в папке модели

Sergey
20.09.2017
21:03:07
не, интерфейс он будет получать свой же если вообще будет получать
вообще все от логики зависит
можно просто совершенно по разному разруливать разные штуки
+ я бы все же сам процесс создания/загрузки файлов делал бы отдельно
никак не привязанным к бизнес логике.
инфраструктура может у приложения спросить "а можно я сюда залью?" и в целом этого должно хватать

Alexey
20.09.2017
21:06:52
Я так понимаю такой флоу выглядит намного лучше: есть отдельный ендпоинт чисто для загрузки файлов, который возращает сслыку, а вторым запросом мы создаем создаем свою модель.

Sergey
20.09.2017
21:07:43
именно так. Ссылку, идентификатор или еще чего. Еще может быть так что ты сначала создаешь что-то и получаешь токен или подписанный урл для загрузки файла. Можно хоть сразу напрямую на s3 например
тут весь вопрос как и что тебе делать надо)
заодно появляются всякие плюшки вроде догрузки файлов
и т.д.
просто иногда так не выйдет сделать... хотя я лично не припомню такого

Alexey
20.09.2017
21:09:01
Хмм. А вариант с очередью не пробовали? то бишь создаем модель но без референса на файл и кадаем в очередь задание на загрузку
Правда бывает, что модель без референса не является валидной

Sergey
20.09.2017
21:09:46