Сегмент мобильной разработки регулярно предлагает участникам рынка новый инструментарий. О том, стоит ли использовать такую новую для программирования под iOS концепцию, как дженерики, а заодно о том, пора ли переходить на Swift, мы поговорили с Максимом Соколовым, специалистом по мобильной разработке компании Avito.
— Расскажите, пожалуйста, в двух словах о себе и своем опыте работы со Swift.
— На текущий момент я работаю в компании Avito разработчиком мобильных приложений для iOS. В мобильной разработке я около 5 лет, а до нее занимался различными направлениями, в частности, веб-сайтами, бэкэндом и desktop-приложениями.
Swift мы начали использовать в Avito больше полугода назад, когда вышла вторая версия языка, накопилась обратная связь от сообщества разработчиков. Ранее в работе мы использовали Objective-C, но теперь весь новый код пишем на Swift.
— Некоторые разработчики отзываются о Swift, как о весьма «сыром» языке, не подходящим пока для крупных проектов. Можете ли вы подтвердить или опровергнуть это мнение?
— У Swift, безусловно, есть недостатки, в частности, связанные со средой разработки. Xcode время от времени падает, отключается подсветка синтаксиса или компилятор отказывается компилировать код. Упомянутые недостатки нельзя назвать причиной отказа от разработки больших проектов на Swift. Сталкиваясь с проблемами — мы находили решение. И мы уже отправили в продакшн достаточно объемный проект, написанный на этом языке.
— Что же побудило вас, несмотря на эти сложности, перейти на Swift?
— В первую очередь мы понимаем, что Apple развивает и будет развивать Swift, тогда как Objective-C уже давно не получал существенных изменений (не будем учитывать изменения, связанные с совместимостью Swift ). Переход на Swift сейчас — это в какой-то степени шаг в будущее.
Мы в Avito, в качестве эксперимента, решили использовать Swift для одного из наших проектов. И в целом не столкнулись с непреодолимыми сложностями. Все стало получаться. Код читается и пишется легче чем на Objective-C. А главное, получается типизированным и безопасным, в том числе, за счет применения дженериков.
— Кстати, можно ли дженерики назвать одним из аргументов в пользу перехода на Swift?
— В общем случае да.
Но тут слишком многое зависит от бизнес-задач. Во-первых, разработчиков с богатым опытом работы со Swift не так много. Во-вторых, есть множество проектов, написанных ранее на Objective-C, их нужно поддерживать. А чтобы хорошо писать на Swift, его нужно изучать, тратить на это ресурсы. И эти факторы для бизнеса гораздо важнее. Соответственно, дженерики — это не какой-то однозначный аргумент, обуславливающий миграцию на Swift. Это просто удобный инструмент.
— Насколько активно вам приходится использовать дженерики в своей работе, и какие основные преимущества есть у этой концепции?
— Мы используем дженерики очень активно. Эта концепция помогает нам писать качественный, строго типизированный, предсказуемый код. Мы видим, на что влияют наши изменения, а это для нас важно, т.к. мы пишем одной командой сразу несколько проектов, и у нас множество переиспользуемых компонентов. Конечно, мы следим за версионированием, но когда в компонент вносятся очередные изменения, мы хотим знать, на чем они отразятся. Когда мы используем дженерики, у нас нет динамического приведения типов; мы видим, что изменилась какая-то модель, какие-то требования к модели, поменялись протоколы. А возможные проблемы с типизацией выплывают сразу в виде ошибок. Это очень удобно.
Поэтому дженерики используются повсеместно, учитывая, что концепция может применяться в самых разных сферах: и в работе с сетью, и с моделями данных, и даже с UI.
— Концепция дженериков — не нова. Давным-давно появились аналоги в других языках, да и идеи обобщенного программирования существуют десятки лет. Почему же, на ваш взгляд, разработчики далеко не всегда (когда это возможно) к ним обращаются?
— Действительно, дженерики в том или ином виде присутствуют во множестве языков программирования уже десятки лет. И, да, разработчики далеко не всегда к ним обращаются.
В контексте языка Swift, без дженериков в принципе можно обойтись: мы можем писать на Swift и не использовать дженерики хотя бы потому, что ранее годами использовали Objective-C, где нет подобных конструкций, а теперь пытаемся на Swift проецировать свой старый опыт. На мой взгляд, в этом и кроется основная причина — когда ты видишь новую для себя технологию (которой не было в Objective-C), ты подходишь к ней аккуратно, и порой, учитывая опыт, обходишь ее стороной. Однако если в нее погрузиться, будет гораздо легче писать код. Да и сам код будет намного качественнее.
— Для каких задач, на ваш взгляд, оптимальнее всего использовать дженерики (именно в рамках Swift)?
— Таких задач довольно много. Дженерики хорошо помогают там, где есть некий алгоритм, который может быть переиспользован за счет работы с разными типами данных. Очевидные примеры — сортировка вещественных и целых чисел при помощи одного алгоритма (без простого копирования кода).
Есть и более интересные примеры, в частности, работа с сетью или таблицами в iOS. Но без наглядных схем и конкретных примеров кода такие задачи разбирать довольно сложно. Эти примеры я как раз буду разбирать в рамках моего выступления на Мобиусе. Я расскажу, в каких местах подобные конструкции очень эффективно применять, и где они могут существенно сократить объем кода.
Наиболее интересный случай, на мой взгляд, — это контрол для работы с таблицами UITableView. При использовании таблиц, приходится заниматься тайп-кастингом, но в докладе я постараюсь показать, как все это может работать при помощи дженериков. Более того, в данном контексте дженерики помогают в разы сократить объем кода.
— Не порождает ли активное использование дженериков какие-либо проблемы приложения (с безопасностью и т.п.)?
— Мы с такими проблемами не сталкивались.
Какие тут могут быть сложности? Используя дженерики приходится тщательнее продумывать архитектуру, принимать решения, где использование дженериков оправдано, а где нет. Не стоит пытаться использовать данную технологию там, где от нее не будет выгоды. Но это не проблема конкретно дженериков. Это справедливо для любой технологии.
— Сталкивались ли вы в работе с неуместным использованием дженериков?
— Например, в случае если функция должна работать только с одним типом данных, а ее оформляют как дженерик, это несколько усложняет и запутывает код.
Но в большинстве случаев у нас скорее было наоборот — мы писали код, не используя дженериков, а потом осознавали, что здесь очень классно было бы как раз использовать дженерики.
— Есть ли какие-то ограничения использования дженериков именно в Swift?
— Основным ограничением я бы назвал совместимость Objective-C и Swift: написанный на Swift дженерик-код нельзя будет использовать в Objective-C.
Благодарим за беседу!
Как было отмечено выше, Максим Соколов поднимет практические вопросы эффективности использования инструментария, предложенного разработчиками языка Swift (а именно, дженериков), для построения более предсказуемого и безопасного кода в рамках своего доклада на конференции Mobius. Мероприятие пройдёт 4 июня в Санкт-Петербурге.
Автор: JUG.ru Group