@oop_ru

Страница 339 из 785
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
Прочитал, сравнил ещё с active record как я понял row date gateway это прокачанная версия active record, AR подразумевает что весь код который отвечает за сохранение обьекта в БД и код который отвечает за что то другое в обьекте находятся в одном классе. RDG уже как бы рефакторит AR и убирает ответственность за сохранение обьекта в другой обьект, теперь условный User делегирует своё сохранение. Что предлагаю я, рефакторить Dao и Dto в RDG только инстанс dao будет один для всех экземпляров юзера. Ничего не поменяется вместо того чтобы где то держать в одной руке юзера, в другой dao мы будет говорить юзерю "сохрани себя в базу" и всё, обьект снова станет полноценным.
> Прочитал, сравнил ещё с active record как я понял row date gateway это прокачанная версия active record скорее active record это сильно упрощенная row data gateway. Я не уверен что появилось раньше но вроде как не AR. > только инстанс dao будет один для всех экземпляров юзера. ну так оно как бы и в оригинале так же. Для всех инстансов один гейтвей.

или ты о том что будет лже-репрезентация "рядов"?

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
она отвечает за персист. Ты же предлагаешь сделать... еще большее разделение
я хочу сделать dao деталью реализации crud методов User например

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
модель ничего не должна знать о том как происходит загрузка файлов

от слова совсем

более того, сервисы "модели" НИЧЕГО не должны знать о сервисах приложения. Если надо попользоваться инфраструктурой - используем инверсию зависимостей

ну и да, "сервисы приложения" - это по сути и есть юзкейсы. А вот сервисы модели могут реализовывать отдельные бизнес рулы, калькуляции и т.д.

короч почитай про архитектуру портов и адаптеров

там хорошо с точки зрения разделения на слои

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
хорошо, у тебя есть система, которая подразумевает некое вычисление стоимости товара. Система должна иметь возможность выбирать нужную стратегию пересчета стоимости в зависимости от конфигурации. Твои действия.
Несколько агрегатов "калькулятор цен" каждый со своим набором "правила расчета" как первое что приходит на ум. Но вброс слишком общий как по мне. Однозначного ответа нет и не будет.

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
мне всегда казалось что dao это просто table gateway
Ну это в терминологии реляционной модели, а мы в обьектной находимся, поэтому более правильное data access object, но всё равно при этом есть dto обьекты без поведения

Sergey
20.09.2017
20:36:49
Я на самом деле тоже не вижу. Но мнение такое в DDD сообществе есть.
ну я бы сказал что это "повод задуматься" но не еще не факт что есть проблема

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

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

ибо я чет подозреваю что я это делаю неправильно

как минимум потому что никак не могу объяснить даже себе почему я разбил так а не иначе)

Alexey
20.09.2017
20:39:45
да и у Эванса похоже.... но у меня в последнее время все меньше возникает желание писать подобные сервисы...
Как вы разделяете их между собой в рамках фичи. У вас есть папка Service и Infrastructure?

Sergey
20.09.2017
20:40:35
Как вы разделяете их между собой в рамках фичи. У вас есть папка Service и Infrastructure?
у меня есть модуль, например Orders. В рамках него есть Handlers (это и есть юзкейсы) и Infrastructure

и есть 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
Могу порекомендовать почитать / посмотреть Udi Dahan
сколько раз слышал (а может даже и читал) но все никак не доберусь основательно почитать

оке, займусь

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

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

а не тому кто имплементит

иначе никакой инверсии не произошло

Alexey
20.09.2017
20:47:52
иначе никакой инверсии не произошло
То бишь в рамках вашей структуры он лежит в handlers?

Sergey
20.09.2017
20:50:52
То бишь в рамках вашей структуры он лежит в handlers?
нет, мне не нужен этот сервис) мне в хэндлеры приходит уже готовый FileReference

то есть файл уже загружен на момент когда вызывается хэндлер

так что мне проще)

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
Хмм. А вариант с очередью не пробовали? то бишь создаем модель но без референса на файл и кадаем в очередь задание на загрузку

Правда бывает, что модель без референса не является валидной

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