Size: a a a

Scala User Group

2020 February 21

KS

Kirill Shelopugin in Scala User Group
Критерии стандартности и минимальности, конечно, субъективны, но в целом я согласен - чем меньше возможностей в целом, тем меньше возможностей накосячить, прямо как в голанге :) Разве что здесь нас никто не ограничивает снаружи, мы сами себе устанавливаем ограничения, сами решаем, где граница и двигаем её при необходимости.
Ничего ужасного я тоже не вижу в конкретных эффектах для маленьких кусков, это не догма и не религия, где либо следуешь всему либо вон на мороз. Особенно это проявляется на границах интеропа, где уже ни о каком абстрагировании речи не идёт
источник

V

Vλadimir in Scala User Group
Kirill Shelopugin
Да, я согласен с тем, что иерархия не такая сложная, и достаточно запомнить пару паттернов, навроде - если что-то надо запустить посреди поля то это, скорее всего, что-то с effect, если нужно паралельное исполнение - что-то с concurrent, но всё равно лишняя нагрузка, иерархию эту помнить
Если рассматривать только с этой точки зрения - тофу ничем не лучше. Да - нету иерархии, но помнить что откуда все равно надо.
источник

V

Vλadimir in Scala User Group
Проблема не в запоминании иерархии, а в ее наличие
источник

KS

Kirill Shelopugin in Scala User Group
λλ
ето все круто модульность там размышления про чистоту рефакторинг кода, но это все отниимает кучу времении и заставляет писать кучу ненужного бойлер плейта особенно когда система меняется каждый день
Модульность заставляет писать кучу бойлерплейта? Интересные у тебя понятия, мне всегда казалось, что модульность как принцип призван решить бойлерплейт
источник

V

Vλadimir in Scala User Group
И да, таргет ефект в плане найти метод - куда проще
источник

DM

Daniel Matveev in Scala User Group
λλ
какие кирпичики мне нужно втащить чтобы делая мердж на фс2 стримах не иметь канкарентеффекта в скоупе?
Олег все обещает показать как это можно сделать с unlift
источник

KS

Kirill Shelopugin in Scala User Group
Vλadimir
Если рассматривать только с этой точки зрения - тофу ничем не лучше. Да - нету иерархии, но помнить что откуда все равно надо.
.race находится в Race, .fire в Fire, даже .timeout и тот в Timeout. Выглядит, будто это запомнить проще, чем иерархию
источник

V

Vλadimir in Scala User Group
Kirill Shelopugin
.race находится в Race, .fire в Fire, даже .timeout и тот в Timeout. Выглядит, будто это запомнить проще, чем иерархию
Зачем тебе помнить иерархию
источник

V

Vλadimir in Scala User Group
Дядя
источник

V

Vλadimir in Scala User Group
Kirill Shelopugin
.race находится в Race, .fire в Fire, даже .timeout и тот в Timeout. Выглядит, будто это запомнить проще, чем иерархию
Тебе нужно помнить что это вообще все есть
источник

V

Vλadimir in Scala User Group
Ты от этого никуда не уйдешь
источник

KS

Kirill Shelopugin in Scala User Group
Точно так же, как нужно помнить сотни методов внутри конкретного эффекта, только там они ещё и в одном файле
источник

V

Vλadimir in Scala User Group
Как и сказал Отц
источник

KS

Kirill Shelopugin in Scala User Group
И не разбиты по функциональности
источник

V

Vλadimir in Scala User Group
Kirill Shelopugin
Точно так же, как нужно помнить сотни методов внутри конкретного эффекта, только там они ещё и в одном файле
Зачем
источник

KS

Kirill Shelopugin in Scala User Group
Зачем что?
источник

V

Vλadimir in Scala User Group
Ты из крайности в крайность ходишь
источник

λ

λoλdog in Scala User Group
О чем вообще спор?
источник

KS

Kirill Shelopugin in Scala User Group
Помнить, почему в Monix delay, а в ZIO - effect, почему они называются по-разному, отличается ли их поведение чем-то - это всё усложняет задачу чтения. Найти метод по названию, который тебе нужен, примерно представляя, что он делает, сложнее - мало того, что они везде названы по-разному, так они еще и не сгруппированы ни по каким признакам, все методы внутри god-object, будь то IO/Monix/ZIO одним сплошным списком
источник

АК

Анатолий Кот in Scala User Group
Kirill Shelopugin
Я с автором не согласен по ряду причин.
Первое: используя конкретные реализации IO-монады, мы сразу резко расширяем наш "лексикон", т.е. количество доступных действий в коде. Это усложняет как написание кода (листать сорцы либо скаладоки IO/Monix/ZIO в поисках нужной функции это занятие медитативное), так и ревью (чем больше действий разрешено, тем больше когнитивная нагрузка и тем сложнее анализировать код, написанный другим человеком).
Второе: TF - это всё-таки не про один Sync[F] и не про сайд-эффекты, как может показаться из прочтения, автор делает упор только на них. Если в бизнес-коде приложения нет сайд-эффектов, написанных юзером, то Sync там может и не быть. TF же про выражение подъязыка, на элементах которого строятся программы. Лексикон этого подъязыка расширяется по необходимости, когда нужно добавить какую-то новую функциональность.
Третье: касательно даже Sync - да, его, как и его наследников, еще более сильных, по возможности должно быть в бизнес-коде как можно меньше, чем его меньше - тем меньше вероятность выстрелить в ногу. Использования сильных котоэффектовых тайпклассов желательно изолировать как можно тщательнее, оставим сам бизнес-код чистым.
В чем я с автором согласен: использовать TF с целью "а вдруг перейдем на другой эффект" - это нерационально, существующие популярные решения и так предлагают более-менее схожий api, что касается контроля эффектов.
Проблема, которую автор описывает, по большей части вызвана плохой иерархией тайпклассов в котоэффектах, но никак не тем, что TF плохо подходит для написания бизнес-кода. Многие считают, и я с ними согласен, что для вэлью-кода важно ограничить домен, в котором оперирует писатель кода, будь то фримонады как инишл представление или тф как финальное, любой вариант неплох
>TF же про выражение подъязыка, на элементах которого строятся программы. Лексикон этого подъязыка расширяется по необходимости, когда нужно добавить какую-то новую функциональность.

Я совсем далек от фп, но чем это отличается от дефолтного commit to the interface и что мешает применять подобную технику с конкретной эффект монадой?
источник