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

10 просмотров

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

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)

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

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

Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Чтобы перехватить все нажимания буков на форме, надо хук ставить? Пробовал на форме ОнКейДаун, оно ловит клаву если фокус не на компоненте с вводом текста
Serjone
15
лучше скажите, причём тут паскаль?
Alexey Kulakov
36
Всем привет! вывожу на общей стр дочерние ресурсыв каждом ресурсе галерея, и первая фотка должна выводиться на общей [!DocLister? &prepare=photo !]
Alekso
12
А можно вопрос? Мне сегодня сказали что у меня функция (которая просто заполняет массив значениями) не правильная void Full(double * arr, int n) { for (int i = 0; i < n; i...
† C E †
7
День добрый, подскажите пожалуйста, есть ли какой-то способ сказать ребару не компилировать определённое приложение? Всю доку их перечиатл ничего подобного не нашёл
Кирилл
14
Добрый вечер. Хочу чтобы у меня в классе поле было функцией, которая возвращает строку. Делаю так: interface ... TGetOutPath = function : String of object; ... protec...
Kirill Filippenok
12
Народ! Впервые клиенту пришло письмо от РКН, у вас, дескать, есть яндекс метрика, а нигде не написано, что вы ее юзаете. Никто не сталкивался?
Sasha Beep
10
Это может быть все-таки не флудвейт? у меня ботфазер принимает изменения и отображает даже что они изменились, на видео видно что он прислал якобы уже измененное описание, н...
OVERLINK
13
Здравствуйте, хочу сделать HelloWorld в консоли Дельфи, но функция API ничего не выводит, что я делаю не так? program Hello; {$APPTYPE CONSOLE} uses System.SysUtils, WinAPI.Wi...
Sergey Vinogradov
20
Карта сайта