Size: a a a

Scala User Group

2020 April 30

Oℕ

Oleg ℕizhnik in Scala User Group
Λнтон Войцишевский
какое преимущество имплиситов по сравнению с передачей аргументов явно?
не писать явно
источник

NV

Nikita Vilunov in Scala User Group
Λнтон Войцишевский
у тебя может быть логгинг, который смотрит в контекст
В таком случае ты инициализируешь свой логгинг через Logs.withContext[Task, ConcreteEnv] и пробрасываешь его, в твоём сервисе не нужно знать о контексте для того, чтобы логгировать логгером с контекстом
источник

ΛВ

Λнтон Войцишевский... in Scala User Group
Oleg ℕizhnik
не писать явно
это был вопрос-нападение для Никиты
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Λнтон Войцишевский
это был вопрос-нападение для Никиты
но ответ очевиден
источник

ΛВ

Λнтон Войцишевский... in Scala User Group
а получился френдли-фаер
источник

NV

Nikita Vilunov in Scala User Group
Λнтон Войцишевский
это был вопрос-нападение для Никиты
Не надо на меня нападать, я тебя не затролить пришёл
источник

NV

Nikita Vilunov in Scala User Group
Λнтон Войцишевский
а получился френдли-фаер
Будет выглядеть как-то так: def apply[I[_] : Functor, F[_]](delegate: Repository[F])(implicit logs: Logs[I, F]): I[Repository[F]], при этом логгинг может быть как с контекстом, так и без, и сервису об этом необязательно ничего знать
источник

ИО

Илья Оськин... in Scala User Group
С логгерами и прочими зависимостями которые надо протаскивать сразу до нескольких модулей всё ясно, а так чтобы таскать через контекст все зависимости — репозитории, сервисы никто не практикует?
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Илья Оськин
С логгерами и прочими зависимостями которые надо протаскивать сразу до нескольких модулей всё ясно, а так чтобы таскать через контекст все зависимости — репозитории, сервисы никто не практикует?
практикует
источник

ИО

Илья Оськин... in Scala User Group
Oleg ℕizhnik
практикует
Почему ты предпочёл это обычному подходу с явной передачей через аргументы?
источник

ИО

Илья Оськин... in Scala User Group
И кстати, ты создаёшь какой то глобальный контекст в самом корне дерева зависимостей?
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Илья Оськин
Почему ты предпочёл это обычному подходу с явной передачей через аргументы?
явная передача предполагает гигантский фор
когда-то я так и написал приложение - гигантский фор, разбитый на инициализацию слоёв, потом с использованием implicit0, когда он вышел

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

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

Oℕ

Oleg ℕizhnik in Scala User Group
таким образом если у тебя есть Foo[F], Bar[F] и Baz[F] ты их можешь сложить полями в AppCtx, а дальше получить автоматически
Foo[Env[AppCtx, *]], Bar[Env[AppCtx, *]] и т.п. (поставь вместо Env ReaderT или ZIO)
самое классное в этом, что если эти реализации этих компонент зависимы между собой с помощью имплиситов, тебе не нужно заботиться о том, чтобы в правильном порядке эти зависимости передать
мало того, зависимости вполне могут быть цикличными
в итоге ты вообще избавляешься от прокидывания большей части параметров и рассуждения об их порядке, инициализируешь то, что нужно, автоматизируешь инициализацию 80%, остальное (пока) руками
источник

ЮБ

Юрий Бадальянц... in Scala User Group
Oleg ℕizhnik
таким образом если у тебя есть Foo[F], Bar[F] и Baz[F] ты их можешь сложить полями в AppCtx, а дальше получить автоматически
Foo[Env[AppCtx, *]], Bar[Env[AppCtx, *]] и т.п. (поставь вместо Env ReaderT или ZIO)
самое классное в этом, что если эти реализации этих компонент зависимы между собой с помощью имплиситов, тебе не нужно заботиться о том, чтобы в правильном порядке эти зависимости передать
мало того, зависимости вполне могут быть цикличными
в итоге ты вообще избавляешься от прокидывания большей части параметров и рассуждения об их порядке, инициализируешь то, что нужно, автоматизируешь инициализацию 80%, остальное (пока) руками
Есть пример?
источник

DM

Daniel Matveev in Scala User Group
Юрий Бадальянц
Есть пример?
тебе не понравится

в боте для понва с закрытыми сорцами
источник

ЮБ

Юрий Бадальянц... in Scala User Group
Oleg ℕizhnik
таким образом если у тебя есть Foo[F], Bar[F] и Baz[F] ты их можешь сложить полями в AppCtx, а дальше получить автоматически
Foo[Env[AppCtx, *]], Bar[Env[AppCtx, *]] и т.п. (поставь вместо Env ReaderT или ZIO)
самое классное в этом, что если эти реализации этих компонент зависимы между собой с помощью имплиситов, тебе не нужно заботиться о том, чтобы в правильном порядке эти зависимости передать
мало того, зависимости вполне могут быть цикличными
в итоге ты вообще избавляешься от прокидывания большей части параметров и рассуждения об их порядке, инициализируешь то, что нужно, автоматизируешь инициализацию 80%, остальное (пока) руками
И ведь всё равно для создания Foo, Bar и Baz тебе нужны какие-то зависимости. Как минимум конфиг. И они все равно выстраиваются в какое-то дерево, в котором компоненты друг от друга зависят. Не понимаю, как без форика в начале
источник

ЮБ

Юрий Бадальянц... in Scala User Group
Daniel Matveev
тебе не понравится

в боте для понва с закрытыми сорцами
Всегда можно открыть 😉
источник

DM

Daniel Matveev in Scala User Group
Юрий Бадальянц
Всегда можно открыть 😉
это к @aleksei_t
источник

GP

Grigory Pomadchin in Scala User Group
Юрий Бадальянц
Всегда можно открыть 😉
можешь стать патроном, и всем патронам они достуны
источник

ИО

Илья Оськин... in Scala User Group
В боте слишком тривиальный граф зависимостей, поэтому на его примере сложно понять насколько удобно это использовать когда один слой компонент зависит на другой и так далее
источник