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 ответов

6 просмотров

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

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)

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

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

Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
75
База данных не поможет. Шифрование не поможет. Какие там ещё варианты? Накидывайте.
КТ315
20
А табстоп это сообщение от окна или от элемента управления?
The Bird of Hermes
18
А как лучше конвертировать физический адрес в виртуальный при маппинге? В случае ядра у меня, например, direct mapping, первые 768МБ я как есть мапплю в higher half, а остальн...
Evg Resh
26
Открыл свой двухкилобайтный экзешник в x32dbg, а тут какая-то хрень. Смущает кнопка "выполнить до пользовательского кода", а что ещё может быть в файле помимо него ?
НѣкъиⰘижєжєиꙁъвьсєсвѣтьноѣсѣтиѥсть•
11
Мне были интересны дишные хаки и я нашёл любопытный способ на форуме через __traits, что-то вроде int delegate(int) fac = (int n) => n == 0 ? 1 : n * __traits(parent, {})(n - ...
Constantin F.
1
Вопрос тем кто смотрит видео и слушает подкасты - как вы потом ищете нужную вам информацию? Вот статью я прочитал, потом могу искать нужную мне часть банальным поиском. Пропус...
Aleksandr Druzhinin
4
Всем привет, подскажите/посоветуйте пожалуйста. Фаердак компоненты, имею одно место где бизнес хочет видеть при открытии формы список всех клиентов, это порядка 30к. Мои дово...
Sasha Sch
14
Ребят, если кто в курсе - скажите, а в загранке такое же засилье маркетплейсов? или там простые сермяжные интернет-магазины живут попроще?
Андрей [aharito] Харитонов
14
Всем привет. Нужна платная консультация от тех, кто сталкивался с октябрём в кластере или шарит оч хорошо в цмс. Проблема следующая: после переноса в кластер октябрь начал ...
wl
8
Карта сайта