Size: a a a

Scala User Group

2020 November 30

VS

Vladimir Sapronov in Scala User Group
Kirill Shelopugin
В скасти Михаила всё хорошо, кроме того, что есть аллокация декодера каждый раз. Стандартным подходом для избавления от этого является трейт, от которого ты свой энум будешь наследовать и там будет инстанс тайпкласса один раз аллоцироваться.
Вот пример с двумя энумами. К каждому энуму просто достаточно будет добавлять with StringTheReader[<новый энум>] и получишь инстанс своего тайпкласса.
https://scastie.scala-lang.org/jhbaqic2SuqhMhRC84el6A
Но смотри, интуитивно - это плохо. Чтобы сделать какой-то тип сериализуемым, ты должен залезть в его определение.
источник

VS

Vladimir Sapronov in Scala User Group
Как бэ тогда и скала не нужна. Определяем toString fromString на каждом типе.....
источник

KS

Kirill Shelopugin in Scala User Group
А чем это плохо? Инстанс тайпкласса класть для discoverability в компаньон - стандартная практика. У тебя есть тип данных и сразу рядом с ним инстансы для него
источник

KS

Kirill Shelopugin in Scala User Group
Как минимум, у тебя инстансы в одном месте и не разбросаны по кодовой базе. Плюсом получаешь отсутствие необходимости импорты писать
источник

VS

Vladimir Sapronov in Scala User Group
Kirill Shelopugin
А чем это плохо? Инстанс тайпкласса класть для discoverability в компаньон - стандартная практика. У тебя есть тип данных и сразу рядом с ним инстансы для него
Нарушается ортогональность. Типы - это отражение какой-то там (бизнесс)логики, а их сериализуемость - чисто техническая лабуда для семантики кода не важная. Это две ортогональные вещи друг другу, но вдруг начали влиять друг на друга. Хотя и компилятор за этим присматривает (что есть конечно же плюс).
источник

KS

Kirill Shelopugin in Scala User Group
Мне такая логика не очень понятна. Где-то какие-то правила в камне высечены? Почему наличие инстансов к типу данных влияет на определение самих данных? Не влияет. От того, что ты поместишь в компаньон что-то, определение самого типа данных не изменится.
источник

AD

Apache DOG™ in Scala User Group
Vladimir Sapronov
Нарушается ортогональность. Типы - это отражение какой-то там (бизнесс)логики, а их сериализуемость - чисто техническая лабуда для семантики кода не важная. Это две ортогональные вещи друг другу, но вдруг начали влиять друг на друга. Хотя и компилятор за этим присматривает (что есть конечно же плюс).
Далеко не всегда не важная. Если вы продаете условный json rest, то сериализация это бизнес логика
источник

KS

Kirill Shelopugin in Scala User Group
Напротив, ты описываешь тип данных и сразу рядом с ним описываешь: как его можно превратить в JSON, как распарсить из HTTP-хедера, как положить в БД. И сразу эти инстансы автоматически цепляются. Лежат рядом, их удобно находить. Если не нравится или нужно переопределить локально - пожалуйста, локально они переопределяемы спокойно
источник

М

Михаил in Scala User Group
Vladimir Sapronov
Но смотри, интуитивно - это плохо. Чтобы сделать какой-то тип сериализуемым, ты должен залезть в его определение.
Ты же не «залезаешь» в определение типа с таким паттерном. От CirceEnum наследуется не сам тип, а его объект-компаньон
источник

M

Mikhail in Scala User Group
Vladimir Sapronov
Но смотри, интуитивно - это плохо. Чтобы сделать какой-то тип сериализуемым, ты должен залезть в его определение.
Твои рассуждения не лишены логики. Есть разные подходы, есть разные случаи, где-то их применение пересекается, где-то предпочтительнее конкретный вариант.  Это норм
источник

M

Mikhail in Scala User Group
Mikhail
Твои рассуждения не лишены логики. Есть разные подходы, есть разные случаи, где-то их применение пересекается, где-то предпочтительнее конкретный вариант.  Это норм
Главное понимать последствия того или иного выбора, тогда и вопросы как обычно - отпадут сами.
источник

М

Михаил in Scala User Group
Ну и это не обязательная, а рекомендуемая практика для тех случаев, когда у тебя есть доступ к компаньону. Если пишешь инстансы для типа из какой-то библиотеки, то их в любом случае придётся положить «сбоку»
источник

VS

Vladimir Sapronov in Scala User Group
Ну как-то сами варианты енама - это все-таки определние логики. Нельзя вот так вот сказать что trait отдельно, companion object  отдельно. Чисто в бизнесс-требованиях даже будет: принимает 3 различных значение. Ну ты пошел и в коде записал: один, два, три. И не забудть пометить, что они сериализуемы.... А при чем тут сериализация - хрен знает.
источник

KS

Kirill Shelopugin in Scala User Group
Философия самоотпадающих вопросов by @rudogma :D
источник

VS

Vladimir Sapronov in Scala User Group
Михаил
Ну и это не обязательная, а рекомендуемая практика для тех случаев, когда у тебя есть доступ к компаньону. Если пишешь инстансы для типа из какой-то библиотеки, то их в любом случае придётся положить «сбоку»
тут просто на сколько я понимаю отвязать в скале нельзя - где-то создать конкретный декодер придется чтобы не создавать его на каждый чих
источник

VS

Vladimir Sapronov in Scala User Group
это не вопрос выбора - потому что выбора нет
источник

KS

Kirill Shelopugin in Scala User Group
Vladimir Sapronov
Ну как-то сами варианты енама - это все-таки определние логики. Нельзя вот так вот сказать что trait отдельно, companion object  отдельно. Чисто в бизнесс-требованиях даже будет: принимает 3 различных значение. Ну ты пошел и в коде записал: один, два, три. И не забудть пометить, что они сериализуемы.... А при чем тут сериализация - хрен знает.
Выше правильно написали - нет истинно верных или неверных правил. Делай так, как тебе, твоим коллегам удобнее, более читаемо, как вам будет потом удобнее поддерживать. Просто подход, который мы описали и который используется в библиотеках - один из распространенных.
источник

λ

λoλegΥch in Scala User Group
Vladimir Sapronov
тут просто на сколько я понимаю отвязать в скале нельзя - где-то создать конкретный декодер придется чтобы не создавать его на каждый чих
гугли typeclass coherence и new types
источник

М

Михаил in Scala User Group
Vladimir Sapronov
это не вопрос выбора - потому что выбора нет
ну вот Михаил написал в скасти пример с альтернативным подходом, он компилируется и работает
источник

M

Mikhail in Scala User Group
Kirill Shelopugin
Философия самоотпадающих вопросов by @rudogma :D
I'm eating my own dog food every day 😝
источник