Без необходимости отмечайте функции как приостановленные в пользу общей абстракции.

Я работаю над проектом с API, работающим в JVM, и JS-клиентом для доступа к этому API из браузера. Классы данных этих объектов, которые преобразуются в/из JSON, находятся в мультиплатформенном модуле, поэтому я могу повторно использовать код на обеих платформах и случайно не получить несовпадающие атрибуты. На этом этапе было бы неплохо также иметь интерфейс API в этом мультиплатформенном модуле, который затем будет реализован и размещен в JVM, а также реализован и представлен в браузере. Однако все методы этого интерфейса должны быть приостановлены в браузере, поскольку запросы (по крайней мере, с клиентом Ktor, который я использую), в то время как они не должны быть приостановлены в JVM.

Есть ли веская причина против приостановки всех этих методов, даже если я не использую их в JVM? Я знаю, что методы обычно должны приостанавливаться, только если это действительно необходимо, но тогда я буду писать все те же интерфейсы (кроме ключевого слова suspend) дважды, что кажется мне большим количеством ненужного шаблонного кода. Методы, которые без необходимости помечаются как приостанавливаемые, вызываются из контекстов приостановки (я также использую Ktor в JVM), поэтому ограниченное использование не будет проблемой.


person Marvin    schedule 22.01.2021    source источник


Ответы (3)


Это похоже на вопрос предпочтений, на самом деле. Как с использованием suspend, так и без него есть недостатки, поэтому вам придется выбирать, что весит меньше.

Из того, что вы пишете, кажется, что преимущества использования suspend (написать код только один раз) перевешивают недостаток засорения интерфейса ненужным модификатором. Я не знаю о возможных накладных расходах времени выполнения здесь. Лично я бы выбрал с suspend.

person Michael Piefel    schedule 23.01.2021
comment
suspend функции быстро необходимы, когда задействован браузер... - person Claude Brisson; 25.01.2021

Методы, которые без необходимости помечаются как приостанавливаемые, вызываются из контекстов приостановки (я также использую Ktor в JVM), поэтому ограниченное использование не будет проблемой.

Это ключевой момент: самая большая проблема ненужного suspend — запуск сопрограммы. Если вы уже находитесь внутри сопрограммы, накладные расходы только на одну функцию на пути вызова, являющуюся ненужной suspend, очень малы: один дополнительный объект, выделенный для каждого вызова.

person Marko Topolnik    schedule 23.01.2021

Хотя это правда, что с одним интерфейсом вы избегаете шаблонного кода и у вас возникают проблемы с запуском сопрограммы на JVM, я бы рассмотрел другую точку зрения:

При разработке вашей абстракции IMO вы не должны слишком вдаваться в детали реализации, вместо того, чтобы думать, как jvm и/или js обрабатывают связь с API, я бы задал вопрос Хочу ли я оставить место для обработки платформами это общение асинхронным/приостановленным способом?. Я считаю, что таким образом вы придете к более масштабируемому решению, но правда, вы потеряете некоторые микрооптимизации.

person Róbert Nagy    schedule 24.01.2021