Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Почитал очереднюю статью про Moya.
И так не вижу вообще плюсов особых, вообще не убедительно.
Ну и реактивность тут еще и пру строк кода добавила. Зачем она? Потому-что модно?
Просто навязывает одно архитектурное решение.
Как говорится, не нравится — не ешьте. Я не евангелист этой библиотеки, моя задача — показать что такое решение есть и объяснить как с ним работать, использовать его или нет — дело Ваше.
Реактивность хорошо подходит для своих задач, например биндинг данных или избегание callback-hell при вызове двух и более сетевых запросов.
Я разработчик с многолетним стажемно при этом Вы в упор не видите преимуществ этой библиотеки. Что ж, придётся мне это сделать за Вас.
Специальные сетевые уровни, которые распространены в iOS, плохи по нескольким причинам:Из своего личного опыта могу сказать, что скорость интеграции сетевой части с помощью Moya лично в моей работе увеличилась в разы. И тесты стало писать гораздо приятней.
— Сложно писать новые приложения («С чего мне начать?»)
— Сложно поддерживать существующие приложения («О. Господи, такой беспорядок...»)
— Сложно писать unit-тесты («Как мне сделать это снова?»)
Итак, основная идея Moya заключается в том, что мы хотим, чтобы уровень сетевой абстракции был достаточно инкапсулирован, фактически вызывая Alamofire напрямую. Это должно быть достаточно простым, чтобы можно было легко сделать базовые вещи, но достаточно всеобъемлющим, чтобы сложные вещи также можно было легко сделать.
Если вы используете Alamofire для того, чтобы абстрагироваться отURLSession, то почему бы не использовать что-то, чтобы абстрагироваться от URL-адресов, параметров и т.д.?
Некоторые крутые фичи в Moya:
— Проверка при компиляции для корректного доступа к API endpoints (не знаю как лучше перевести «Compile-time checking for correct API endpoint accesses.», если есть более «русский» вариант — предлагайте)
— Позволяет определить четкое использование разных endpoints с соответствующими значениями enums.
— Обрабатывает тестовые заглушки как объекты первого класса, таким образом unit-тестирование становится очень лёгким.
По поводу навязанной архитектуры, я имел ввиду архитектуру построения Moya. Он жестко диктует условия построения API слояА в чём, собственно, заключается эта «жёсткость»? Вы можете свободно манипулировать роутами, параметрами, методами, задачами, модифицировать вход и выход запроса, создавать свои собственные stubs для тестирования, даже писать свои плагины и использовать уже готовые решения. Если Вы про то, что нужно создавать т.н. файл с запросами по определённым правилам, то позвольте спросить — а что в этом плохого? Как по мне, так архитектура выстроена очень здорово — ничего лишнего и все сделано очень удобно. Так что я искренне не понимаю почему Вы считаете что это минус, при том условии, что Вам выдаются все инструменты для манипуляций.
Да кто спорит, но мы же рассматриваем конкрентный случай. В вашем примере никаких абсолютно плюсов нетА Вы сами как думаете, если я создам ещё один запрос и захочу вызвать 2 запроса подряд, то как это будет выглядеть нереактивно и реактивно? Очевидно что в нереактивном случае будет callback-hell:
provider.request(.getRestaurants()) { result in
switch result {
case .success(let response):
let restaurantsResponse = try? response.mapObject(RestaurantsResponse.self)
// Do something with restaurantsResponse
provider.request(.getRestaurants()) { result in
switch result {
case .success(let response):
let restaurantsResponse = try? response.mapObject(RestaurantsResponse.self)
// Do something with restaurantsResponse
case .failure(let error):
print(error.errorDescription ?? "Unknown error")
}
case .failure(let error):
print(error.errorDescription ?? "Unknown error")
}
}
let provider = RxMoyaProvider<MoyaExampleService>()
provider.request(.getRestaurants())
.mapObject(RestaurantsResponse.self)
.flatMap {
return provider.request(.getRestaurants())
}
.mapObject(RestaurantsResponse.self)
.catchError { error in
// Do something with error
return Observable.error(error)
}
.subscribe(
onNext: { response in
self.restaurants = response.data
}
)
.addDisposableTo(disposeBag)
могу ответить в вашем духе: «Не нравится критика — не пишите публичные статьи»Критика должна быть обоснованной. Если бы вы написали «Я вот тут попробовал Moya, сравнил с Alamofire и не получил абсолютно никакого выигрыша ни в скорости интеграции сетевой части, ни в скорости написания unit-тестов», то для меня это была бы интересная дискуссия. А по Вашим комментариям складывается такое чувство, что Вы пробежались по статье, не нашли того что искали — неопровержимых доказательств необходимости немедленного перехода на Moya — и принялись критиковать. Проблема в том, что статью я писал не для того, чтобы кому-то что-то доказать, а для того, чтобы показать что есть такой инструмент, который лично мне очень сильно помогает в работе.
Вообще то вы утверждаете первым предложением: «Moya — как перестать беспокоиться о сетевой части и начать жить». Потом не привели ни одного убедительного доказательства того, что беспокоится больше не нужно.
В вашем примере никаких абсолютно плюсов нет, а читатель же должен перестать беспокоится почему-то.
Из своего личного опыта могу сказать, что скорость интеграции сетевой части с помощью Moya лично в моей работе увеличилась в разы. И тесты стало писать гораздо приятней.
Вам больше какой вариант нравится? Я предпочитаю реактивный вариант.
Проблема в том, что статью я писал не для того, чтобы кому-то что-то доказать, а для того, чтобы показать что есть такой инструмент, который лично мне очень сильно помогает в работе.
Так это может вы просто плохо без Maya писали.Вот это уже звучит как переход на личности — если моя точка зрения не совпадает с Вашей, то упрекать меня в непрофессионализме как минимум не этично.
Все достопремичательности что вы привели — это бла, бла, бла, смотрте как надо. А я не вижу в упор что именно это улучшает.
Вы так много написали и ни одного доказательства, кроме двух ужасных связанных запросов.По существу, Moya — просто один из подходов к созданию сетевой части в приложении. Мне этот подход нравится и я его использую, все преимущества я уже расписал. Если Вам этого мало — увы.
Навязанное архитектурное решение — это жестко следовать предолженному протоколу и организации коду, который сваливает в кучу все запросы, а если у меня не монолитный сервис и всё таки нжуно поддержать зависимости между вызовами вся эта структура рушится.Букву I из SOLID никто не отменял. Ничего не мешает Вам создать несколько сервисов, я сам против того чтобы все запросы сваливать в одну кучу. Совсем не вижу проблемы, которую Вы описали.
Есть альтернативные подходы, типа NSOperation для каждого запроса с зависимостями ( и не реактивность не понадобится и лапши с колбэками не будет).Вы можете привести пример кода? Если Вы утверждаете, что можно интегрировать сетевую часть так же быстро и просто, а также легко протестировать, и всё это с помощью стандартных средств — я буду только рад узнать что-то новое.
Или просто самому Enum написать с запросами в Alamofiore? Что решает Moya не понятно, то что. у них написано в примерах можно с такими-же усилиями и стандартными средствами сделать.
Ну тогда ей место в личном бложике. На хабре вроде принято остаивать свою точку зрения и техническое решение.Давайте вы не будете указывать мне, где мне публиковать свои статьи. Я взрослый человек и сам в состоянии решить этот вопрос. То, что для меня звучит убедительно, для Вас звучит неубедительно — это нормальная ситуация. Всё, что я смог — я сказал, убеждать Вас в мои обязанности не входит — мне за это не платят.
Вот это уже звучит как переход на личности
Из своего личного опыта могу сказать, что скорость интеграции сетевой части с помощью Moya лично в моей работе увеличилась в разы. И тесты стало писать гораздо приятней.
все преимущества я уже расписал.
Давайте вы не будете указывать мне, где мне публиковать свои статьи.
В этой статье я хотел дать читателям базовое представление о мощной сетевой библиотеке Moya, .
намеренно опустив нюансы для того, чтобы вы самостоятельно смогли исследовать её и насладиться развитым инструментарием,
который позволяет решать широкий спектр задач при выстраивании сетевого слоя в iOS разработке.
Ну и слова выстраивание вроде нет в русском языкеА вот это вообще самый последний аргумент. Я старался спокойно относиться к Вашим ошибкам, но Вы сами напросились. Разберём Ваш первый комментарий:
Почитал очереднюю статью про Moya.
И так не вижу вообще плюсов особых, вообще не убедительно. Ну и реактивность тут еще и пру строк кода добавила. Зачем она? Потому-что модно?
Просто навязывает одно архитектурное решение.
Moya — как перестать беспокоиться о сетевой части и начать жить