Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / SCALA: trait+case class inheritance / 15 сообщений из 15, страница 1 из 1
27.12.2018, 12:34
    #39753849
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCALA: trait+case class inheritance
столкнуля с вроде бы банальной задачей (для джавы конечно же банальной).

есть мешок кейсклассов. надо их все расширить одним полем показывающем их версию которая берется из одного места. следом объект кейскласса улетает в яхон сериализатор и отдается клиенту.

я как джавист посмотрел как делается наследование - сделал через трейт там добавил поле.

создаю инстанс кейскласса - обращаюсь к полю вер - возвращает. делаю тустринг - НЕТУ. кидаю инстанс класса в сериализатор - он пережевывает всё кроме этого поля.

что за фигня.
как такая задача решается в скале?
...
Рейтинг: 0 / 0
27.12.2018, 12:53
    #39753852
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCALA: trait+case class inheritance
andreykaT,
...
Рейтинг: 0 / 0
27.12.2018, 13:00
    #39753855
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCALA: trait+case class inheritance
озверел?
...
Рейтинг: 0 / 0
27.12.2018, 13:59
    #39753904
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCALA: trait+case class inheritance
andreykaT,
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
trait Versioned {
  val version:Int
}
case class User(name:String, age:Int, version:Int) extends Versioned
case class Employer(name:String, age:Int, version:Int) extends Versioned
object test extends App{

  println(User("a", 24, 1))
  println(Employer("a", 24, 1))
}



User(a,24,1)
Employer(a,24,1)

ЧЯДНТ? Код приведи
...
Рейтинг: 0 / 0
27.12.2018, 14:16
    #39753912
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCALA: trait+case class inheritance
Я понял, типо такого?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
trait Versioned {
  val version:Int = 0
}
case class User(name:String, age:Int) extends Versioned
case class Employer(name:String, age:Int) extends Versioned
object test extends App{

  println(User("a", 24))
  println(Employer("a", 24))
}



Ну так вся магия кейс класса завязана на аргументах конструктора, toString equals ashCode берут в расчет только их.

1) Либо передавать версию в конструктор,
2) Либо сделать typeclass Versioned, написать generic shapeless сериализатор.десериализатор для case class с логикой для version? тогда она получится в одном месте.
3) Либо юзать обчные классы
...
Рейтинг: 0 / 0
27.12.2018, 16:13
    #39754000
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCALA: trait+case class inheritance
забыл никandreykaT,
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
trait Versioned {
  val version:Int
}
case class User(name:String, age:Int, version:Int) extends Versioned
case class Employer(name:String, age:Int, version:Int) extends Versioned
object test extends App{

  println(User("a", 24, 1))
  println(Employer("a", 24, 1))
}



User(a,24,1)
Employer(a,24,1)

ЧЯДНТ? Код приведи
тебе надо явно передавать в конструкторе версию. во всех конструкторах. помимо этого ты повторяешь это поле в каждом классе (нажуя тогда этот трайт в кейсклассе сдался? кейскласс - это поля. опция "о оно передает дефы" кейсклассу как собаке пятое колесо).
...
Рейтинг: 0 / 0
27.12.2018, 16:18
    #39754002
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCALA: trait+case class inheritance
забыл никЯ понял, типо такого?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
trait Versioned {
  val version:Int = 0
}
case class User(name:String, age:Int) extends Versioned
case class Employer(name:String, age:Int) extends Versioned
object test extends App{

  println(User("a", 24))
  println(Employer("a", 24))
}



Ну так вся магия кейс класса завязана на аргументах конструктора, toString equals ashCode берут в расчет только их.

1) Либо передавать версию в конструктор,
2) Либо сделать typeclass Versioned, написать generic shapeless сериализатор.десериализатор для case class с логикой для version? тогда она получится в одном месте.
3) Либо юзать обчные классы
вся магия кайскласса в том что это какой-то функциональный кастрат непонятно для чего прикрученный, по полям (количество полей=таплу) ограничение, по наследованию ограничение.. по чем там еще ограничение видимо, предстоит узнать в будущем. класс-инвалид. джава с ломбоком своим не так то уж и плоха оказывается.
по 2. да вот копаю. пока что-то не очень выкопать получается, к сожалению. :( самый тупой вариант - просто сделать обёртку сериализатору и самому внутри обёртки привинчивать это поле к любому объекту что в него попадает).
тупой вариант номер два -- это вебсервис и еще можно прикручивать это поле в интерцепторе при аутпуте из сервлета :))
...
Рейтинг: 0 / 0
27.12.2018, 16:40
    #39754020
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCALA: trait+case class inheritance
andreykaTвся магия кайскласса в том что это какой-то функциональный кастрат непонятно для чего прикрученный, по полям (количество полей=таплу) ограничение, по наследованию ограничение.. по чем там еще ограничение видимо, предстоит узнать в будущем. класс-инвалид. джава с ломбоком своим не так то уж и плоха оказывается.


Ну так кейс класс не для наследования создавался:) А как value-object для паттерн-матчинга и великолепно выполняет свои задачи. Для расширения функциональности в случае better-java используются обычные абстрактные классы либо typeclass pattern в случае ФП. Костыли это как раз методы hashCode toString и equals обьявленные в Object. Неимоверное количество багов из-за этого. Написать корректный equals в иерархии классов - дело вообще практически невозможное. Ну и в целом при переходе на scala придется переходить на специфичные либы для сериализации, http-роутинга и работы с базой. Использовать скалу но подходы и с java - действительно контрпродуктивно и мозговзрывательно.
Ну по поводу кейс коассов и т.п - ну поломает тебя немного, но пройдет, меня тоже ломало и бесило, сейчас понимаю почему решения приняты именно такие
...
Рейтинг: 0 / 0
27.12.2018, 19:09
    #39754144
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCALA: trait+case class inheritance
...и да хорошо это всё хорошо. но выходит, что нет простого способа в скале нормально добавить поле всем классам?
...
Рейтинг: 0 / 0
27.12.2018, 19:19
    #39754152
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCALA: trait+case class inheritance
да.. )) слик это убийство мозга (). еще и бойлерплейта дофига. в сравнении с тем же богомерзским хибером. ну оно и понятно наверное. сколько лет хиберу и спринг дате и сколько лет слику.
...
Рейтинг: 0 / 0
27.12.2018, 19:42
    #39754164
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCALA: trait+case class inheritance
andreykaT...и да хорошо это всё хорошо. но выходит, что нет простого способа в скале нормально добавить поле всем CASE- классам?
...
Рейтинг: 0 / 0
27.12.2018, 19:49
    #39754169
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCALA: trait+case class inheritance
Случайно отправилось. Да, нельзя, потому что как я уже сказал case классы для другого предназначены. А про slick немного не понял, нету там дикого бойлерплейта, или ты про то что надо описывать типы и названия всех полей? Ну так зато все типобезопасно. Со slick я мучался пока не понял концепцию DBIO (по привычке все время хотелось сделать блокирующий Await.result вместо композиции фьючеров). Теперь на хибернейт даже и смотреть не хочется без рези в глазах
...
Рейтинг: 0 / 0
27.12.2018, 20:01
    #39754179
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCALA: trait+case class inheritance
вроде хибер тоже теперь может футуры возвращать. это для ценителей матрёшек

я конечно подозреваю что я еще не до конца разобрался или вообще не разобрался. но эти вырвиглазные апсерты через фор компрехенжн это какой то разрыв здравого смысла.

опять же транзакшнл который откатывает в случае ексепшена который может пройти и не по причине бд я так и не понял как сделать со сликом без смешивания репозитория и сервис-слоя.
...
Рейтинг: 0 / 0
28.12.2018, 01:11
    #39754274
dimonz80
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCALA: trait+case class inheritance
andreykaTстолкнуля с вроде бы банальной задачей (для джавы конечно же банальной).

есть мешок кейсклассов. надо их все расширить одним полем показывающем их версию которая берется из одного места. следом объект кейскласса улетает в яхон сериализатор и отдается клиенту.

я как джавист посмотрел как делается наследование - сделал через трейт там добавил поле.

создаю инстанс кейскласса - обращаюсь к полю вер - возвращает. делаю тустринг - НЕТУ. кидаю инстанс класса в сериализатор - он пережевывает всё кроме этого поля.

что за фигня.
как такая задача решается в скале?

Кейс-классы надо рассматривать просто как именованные кортежи и все. Они не для развесистых иерархий.
Если версия - атрибут объекта, то объявляй ее явно в каждом кейс-классе. Если одна для пачки классов (ну типа версии API) - то просто приклеивай к уже готовому JSON объекту.
...
Рейтинг: 0 / 0
28.12.2018, 10:52
    #39754404
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCALA: trait+case class inheritance
в контексте версии я думаю что скорее всего буду прям хедер модифицировать на выхлопе и баста.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / SCALA: trait+case class inheritance / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]