214 похожих чатов

Всем привет. Вопрос такой, писали свой модуль для работы с

бэкендом по типу RPC, и встал момент того, как отправлять запросы (и, соответственно, получать данные и десериализовать их). Сделал вот функцию с такой сигнатурой
suspend fun <T: ResponsePayload> sendCall(
action: Events,
data: SocketRequest,
responseType: Type
): SuspendableResult<T, Exception> {
и с маркер интерфейсом для констрейнта дженерика для ответа, но т.к. маркер интерфейсы часто считается как анти-паттерн, может у кого-нибудь есть идеи, как реализовывать подобное? (У ответов нет ничего общего, от чего они могли бы наследоваться)

interface ResponsePayload

data class FetchUserProfileResponse(val profile: UserProfile): ResponsePayload
data class UpdateNotificationSettingsResponse(val userId: String): ResponsePayload

9 ответов

13 просмотров

На сколько я знаю вместо маркера используется анотация

Dmitry-Shamshurin Автор вопроса
Jorik Fat
На сколько я знаю вместо маркера используется анот...

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

Dmitry Shamshurin
Я, к сожалению, либо не понял, как работают аннота...

У Вас же вроде другая задача: ограничить входные аргументы

Dmitry-Shamshurin Автор вопроса
Jorik Fat
У Вас же вроде другая задача: ограничить входные а...

Конкретно в этом случае, да, я просто описал более общее, что мне нужно, на тот случай, если в целом мой подход не совсем оптимален

Dmitry Shamshurin
Конкретно в этом случае, да, я просто описал более...

А почему вам Any? в качестве аппер баунда не нравится?

Dmitry-Shamshurin Автор вопроса
(
А почему вам Any? в качестве аппер баунда не нрав...

Хотелось бы хотя бы на этапе компиляции иметь проверку/ограничение, что этот метод будет вызван только с теми типами, которые относятся к респонзам) например, чтобы точно быть уверенными, что все нормально распарсится, да и кажется такой подход логичным, выставить ограничение (например, так понятнее для другого разработчика может быть)

Dmitry Shamshurin
Хотелось бы хотя бы на этапе компиляции иметь пров...

ну, общее поведение у ваших респонсов здесь - это то, что их можно распарсить из жсона, т.е. контракт выглядит примерно fun parse(json: String): T, что и можно сделать объективным компайл-тайм ограничением. Потому что с маркер интерфейсами мне, как абстрактному дебилу, это не мешает написать что-нибудь вроде class MusorClass : ResponsePayload Немного сильнее с моей точки зрения было бы сделать что-то вроде interface PayloadParser<T> { fun parse(json: String): T } и изменить sendCall так, чтобы он ещё принимал инстанс этого пейлоад парсера и убрать маркер интерфейс совсем. Таким образом у вас получается, что этот метод действительно можно вызвать только с теми типами, которые можно распарсить Конечно, это приносит немного проблем в виде бойлерплейта на реализации, плюс нужно откуда-то брать инстансы Gson-а, но что делать, в котлине нет тайпклассов, плюс замусоривается апи этого метода В противном случае да, я не вижу лучше решения ограничить дтошки, кроме как маркер интерфейсом

(
ну, общее поведение у ваших респонсов здесь - это ...

т.е. поместить метод десериализации в каждый возвращаемый тип?

Jorik Fat
т.е. поместить метод десериализации в каждый возвр...

Примерно пример: data class FetchUserProfileResponse(val profile: UserProfile) class FetchUserProfileResponseParser(private val gson: Gson) : PayloadParser<FetchUserProfileResponse> { override fun parse(json: String): FetchUserProfileResponse = ... } val parser: FetchUserProfileResponseParser = ... val response: SuspendableResult<FetchUserProfileResponse, Exception> = sendCall(parser, action, data)

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта