Сегмент мобильной разработки регулярно предлагает участникам рынка новый инструментарий. О том, стоит ли использовать такую новую для программирования под 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 июня в Санкт-Петербурге.
Поделиться с друзьями
-->

Комментарии (19)


  1. Evgeny42
    27.05.2016 17:25
    +17

    Ехал дженерик через дженерик…


  1. grossws
    27.05.2016 18:20
    +1

    В целом, swift выглядит довольно интересно и для десктопного софта, но пока стандартная библиотека довольно куцая, если говорить о linux. И не поддерживается windows, что является blocker'ом, если хочется кросс-платформенной разработки.


    Забавно видеть это в блоге java user group ,)


    1. phplamer
      27.05.2016 20:23
      -2

      Думаю, что причина в этом:
      geektimes.ru/post/276450


    1. macduck
      27.05.2016 20:23

      Swift так и будет оставаться в таком состоянии, пока Apple не доведет его разработку до какого-то более или менее стабильного состояния, когда язык перестанем постоянно меняться с каждой новой версией.


      1. grossws
        27.05.2016 20:25
        +1

        Они по сути ещё в 0.3.x что бы они не писали про 3.x. Тот же rust был куда более зрелым к 1.0.


        1. Makaveli
          28.05.2016 00:24
          -1

          В каждом посте про Swift такие комментарии. Способ нумерации версий это, конечно, очень важный аспект языка, как шашечки прям.


          1. grossws
            28.05.2016 20:50

            Разговор, в первую очередь, про стабильность API и стоимость сопровождения, как следствие этого.


            Неиспользование semver запутывает, давая ощущение что язык уже стабилен и пригоден для его полноценного использования.


  1. svistkovr
    27.05.2016 19:46

    в objective-c тоже есть дженерики.

    и в чем тогда отличие swift от objective-c, только лишь в этом?

    У Swift, безусловно, есть недостатки, в частности, связанные со средой разработки. Xcode время от времени падает, отключается подсветка синтаксиса или компилятор отказывается компилировать код

    В первую очередь мы понимаем, что Apple развивает и будет развивать Swift, тогда как Objective-C уже давно не получал существенных изменений (не будем учитывать изменения, связанные с совместимостью Swift ). Переход на Swift сейчас — это в какой-то степени шаг в будущее.


    единственное логическое применение swift это графические обертки над низкоуровневыми компонентами из objective-c.


    1. eugeneego
      27.05.2016 23:03

      В Obj-C дженерики — это лишь сахарок для лишней проверки компилятором, рантайм как принимал объекты, так и принимает.
      Так что нет нормальных дженериков в OC.


  1. tereznikov
    27.05.2016 20:23
    +6

    Понятнее не стало, стоит переходить, не стоит, хотя заголовок статьи, говорит нам о том, что эта статья поможет нам в этом разобраться. Зато за дженерики, больше половины вопросов было задано: где использовать дженерики, как использовать, и т.д. Я не думаю, что, именно дженерики являются решающим моментом перехода на swift. У swift есть много положительных моментов, и еще столько же отрицательных, о них же здесь ни слова.


    1. Smagold
      30.05.2016 00:11

      Такие статьи выходят регулярнее доброй половины дайджестов, и пока единственный верный вариант, на мой взгляд, писать старые проекты на obj c, а новые — на swift.


  1. Extro
    27.05.2016 20:24

    Конечно только лишь дженерик не повод переходить на Swift, ведь он есть и в Objective-C


  1. MeGaPk
    27.05.2016 23:03
    +1

    Так же не стоит забывать, что нет нормальной ИДЕ для swift. AppCode со Swift'ом работает отвратительно. А кодить в Xcode это еще та боль… Пожалуй лучше останусь на objc :) (и наблюдать, как бедные фанаты Swift будут страдать при выходе 3.0)


  1. house2008
    27.05.2016 23:04
    +2

    Причем тут вообще дженерики?) Они сейчас есть и в objc, хоть и кривые немного. Суть свифта, как эплы говорят, отказаться от наследования и всё делать через композицию на протоколах, то есть pop. К тому же protocol + associated type прикольная штука, правда мой мозг пока тяжело эту фичу осваивает.


  1. landan
    27.05.2016 23:26
    +2

    На свифт стоит переходить хотя бы потому, что на нем писать удобнее, быстрее и безопаснее. А еще есть куча всяких фич типа функционального стиля.


  1. 0xcffaedfe
    28.05.2016 04:25

    Единственно что отталкивает меня от swift так это отсутствие родного runtime точнее его зачатки, мосты в runtime objective-c для каждого чиха, таскание с приложением libswift*.dylib фреймворков, понятно что сделано чтобы не ломать совместимость при обновлении языка, но все же надеюсь что через пару лет apple таки поправит ситуацию. Стабилизирует язык и перенесет runtime в систему.


  1. dimakey
    28.05.2016 11:51
    +9

    Концепция дженериков — не нова. Давным-давно появились аналоги в других языках, да и идеи обобщенного программирования существуют десятки лет. Почему же, на ваш взгляд, разработчики далеко не всегда (когда это возможно) к ним обращаются?

    — Действительно, дженерики в том или ином виде присутствуют во множестве языков программирования уже десятки лет. И, да, разработчики далеко не всегда к ним обращаются.


    — Скажите, с самого начала увас была какая-то тактика и вы ее придерживались?

    — С самого начала у меня была какая-то тактика и я ее придерживался.


  1. Whiskas333
    28.05.2016 17:37

    Нужно больше дженериков!


  1. snowman647
    30.05.2016 00:11
    -1

    Очень не хватает поддержки рефакторинга со стороны Xcode. Преимущества языка над obj-c вполне оправдывают его применение уже сегодня.