Size: a a a

Scala User Group

2020 April 28

M

Mikhail in Scala User Group
Λнтон Войцишевский
С этим согласен, меня пока беспокоит производительность, но чёт люди говорят не о ней
Производительность тебя беспокоит правильно. Когда мы лепим монадки - у них зачастую нет альтернатив и потому мы жертвуем производительностью в угоду всем фишкам, которые получаем. Но с ЭниВал приходится жертвовать производительностью на ровном месте ничего не получая взамен и эта потеря в большом проекте весьма ощутима (и оверхед не только в процессе оборачивания, но и сопутствующая нагрузка двойных указателей на менеджмент обьектов в памяти внутри жвм) - спрашивается зачем нам энивал, который ничего не дает, но забирает?
источник

ΛВ

Λнтон Войцишевский in Scala User Group
Ещё раз
источник

ΛВ

Λнтон Войцишевский in Scala User Group
Переслано от Λнтон Войцишевский
Рефайнед не только проверяет литералы. Он предоставляет во-первых функцию refineV, а во-вторых синтаксис специальный, который даёт вещи типа RefinedType.from(underlying):Either[...]
источник

ΛВ

Λнтон Войцишевский in Scala User Group
Mikhail
99% времени ты получаешь данные извне, а не из статик данных в коде. Поэтому компайл тайм фича с литералами оказывается бесполезной. А реализовать рефайнды - а оставшаяся часть в либе scala-refined крайне убогая, которая на 100% покрывается тегами, ньютайпами - да еще и удобства и свободы действий поболе будет)
Вот сюда^
источник

ЮБ

Юрий Бадальянц in Scala User Group
Погоди, и вот ты везде, где создаёшь инстанс какой-нибудь Width пишешь вот так:
RefinedType.from(underlying)

Вместо того, чтобы по боярски писать вот так:
Width(underlying)

???
источник

M

Mikhail in Scala User Group
Юрий Бадальянц
Погоди, и вот ты везде, где создаёшь инстанс какой-нибудь Width пишешь вот так:
RefinedType.from(underlying)

Вместо того, чтобы по боярски писать вот так:
Width(underlying)

???
@funfunfine Вот, вот ^^ )
источник

ЮБ

Юрий Бадальянц in Scala User Group
У нас в коде всё использование refined либы в итоге свелось вот к такому:
object ExtractedAttributeUnit extends TaggedType[String Refined NonEmpty] {
     def from(s: String): Either[String, ExtractedAttributeUnit] = refineV[NonEmpty](s).map(ExtractedAttributeUnit(_))
     def unsafeFrom(s: String): ExtractedAttributeUnit = from(s).fold(e => throw new IllegalArgumentException(e), identity)
   }
   type ExtractedAttributeUnit = ExtractedAttributeUnit.Type

Это реальный код из проекта. Ну так и нахера мне тут Refined, когда я всё равно конструкторы описываю?
источник

ΛВ

Λнтон Войцишевский in Scala User Group
Юрий Бадальянц
Погоди, и вот ты везде, где создаёшь инстанс какой-нибудь Width пишешь вот так:
RefinedType.from(underlying)

Вместо того, чтобы по боярски писать вот так:
Width(underlying)

???
Ну да
источник

ЮБ

Юрий Бадальянц in Scala User Group
Это же нифига не читабельно
источник

ΛВ

Λнтон Войцишевский in Scala User Group
Юрий Бадальянц
Это же нифига не читабельно
Да вроде нет, лишняя вербозность никого ещё не убила
источник

ΛВ

Λнтон Войцишевский in Scala User Group
На вкус и цвет
источник

M

Mikhail in Scala User Group
Но можно и from, вместо apply использовать. Да еще и either[String,] заменить на бизнесовые ошибки.
источник

M

Mikhail in Scala User Group
Вобщем, чем глубже вникать - тем больше минусов можно найти в прибитой гвоздями реализации в либе рефайнд
источник

ЮБ

Юрий Бадальянц in Scala User Group
Λнтон Войцишевский
Да вроде нет, лишняя вербозность никого ещё не убила
Но ведь намного читабельнее писать Width(...). А с вот этой конструкцией `
RefinedType.from(...)
` ты смешиваешь бизнес логику с какими-то техническими деталями. Это отвратительно читается. Плюс, чтобы создать какой-то тип, ты должен откуда-то из библиотеки что-то взять и дёрнуть. Получается, тип какой-то не самодостаточный — у него нет нормального конструктора.
источник

ΛВ

Λнтон Войцишевский in Scala User Group
Юрий Бадальянц
Но ведь намного читабельнее писать Width(...). А с вот этой конструкцией `
RefinedType.from(...)
` ты смешиваешь бизнес логику с какими-то техническими деталями. Это отвратительно читается. Плюс, чтобы создать какой-то тип, ты должен откуда-то из библиотеки что-то взять и дёрнуть. Получается, тип какой-то не самодостаточный — у него нет нормального конструктора.
Почему фром - не нормальный конструктор?
источник

ΛВ

Λнтон Войцишевский in Scala User Group
Может тогда уж new Width писать?
источник

ЮБ

Юрий Бадальянц in Scala User Group
А погоди, RefinedType — это типа и есть Width?
источник

M

Mikhail in Scala User Group
Λнтон Войцишевский
Почему фром - не нормальный конструктор?
Если хочется - нормальный, но теги и не мешают тебе писать from. Хочешь так, хочешь сяк.
источник

M

Mikhail in Scala User Group
Юрий Бадальянц
А погоди, RefinedType — это типа и есть Width?
Да, да
источник

ЮБ

Юрий Бадальянц in Scala User Group
А, тогда я неправильно понял
источник