Pull to refresh

Kotlin — язык программирования: для чего используется, плюсы и минусы

Level of difficultyEasy
Reading time6 min
Views14K

Узнайте больше о языке программирования Котлин. Я расскажу, где применяется Kotlin и почему он оптимален для приложений на Android. Подробнее в блоге CREAZARD.

Приветствую! Меня зовут Громова Алена и я основатель компании мобильной разработки. Этот материал в своем блоге решила посвятить языку Kotlin, как одному из “ходовых” языков программирования, с которыми давно работает моя команда. Написано в соавторстве с нашим Android разработчиком Евгением.

Немного копнем в истоки. Само свое название язык получил в честь острова Котлин, расположенного в Финском заливе, недалеко от Санкт-Петербурга. Разработчики из компании JetBrains, создававшие данный проект, в большинстве своем, также имеют русские корни. Идея разработки, очевидно, состояла в “рукотворной эволюции” для Java: сохранить совместимость с уже существующими библиотеками Java, но оптимизировать процессы, расширить функции, повысить безопасность кодирования и многое прочее. Официальная презентация прошла в 2011 году на конференции Google I/O.

Создавая новый язык, разработчики учли удачные решения своих коллег, а также распространенные проблемы или неудобства, с которыми обычно сталкиваются программисты. Неудивительно, что готовый продукт быстро заслужил признание у сообщества разработчиков, по сей день являясь официальным и самым популярным языком для приложений под Android. JetBrains также предусмотрели кроссплатформенную компиляцию, создали интегрированную среду разработки IntelliJ IDEA. Помимо нее Kotlin поддерживается многими другими популярными IDE:

  • Android Studio;

  • Eclipse (поддержка через плагин);

  • Visual Studio Code (поддержка через плагин).

Насколько и почему популярен Kotlin?

Со времен конференции Google I/O 2019, Гугл настоятельно рекомендует писать новые приложения для Android именно на Kotlin, тем более как раз на нем написана универсальная платформа Firebase, популярнейшие сервисы Google Maps/Places/Home, множество приложений Google Play, приложения и сервисы других известных компаний. Среди примеров, не нуждающихся в представлении:

  • Ozon (написано мобильное приложение);

  • Uber (написано мобильное приложение);

  • Pinterest (переписали код одними из первых);

  • Atlassian (облачные сервисы Jira);

  • Adobe (серверные решения).

Популярность языка во многом объясняется гибкостью и безопасностью работы с ним, относительно простым синтаксисом, совместимостью со старыми базами Java, возможностью кроссплатформенной компиляции, разработки серверных приложений. Кроме того, это бесплатный Open-Source продукт. Большое сообщество разработчиков с активной поддержкой от Гугл имеет тенденцию к росту. Новые расширения и библиотеки призваны облегчить разработку, повысить оптимизацию (со скоростью компиляции на больших проектах бывают проблемы даже по сравнению с Java).

Например, новый плагин KSP, пришедший на замену kapt, позволяет вам писать для компилятора свои оптимизирующие плагины. Используя аннотации, вы можете автоматизировать рутинные процессы, сократив время разработки, повысив качество и безопасность кода. По утверждениям создателей, в идеале KSP способен работать в 2 раза быстрее предшественника. С некоторыми библиотеками, такими как Room, мы и правда замечали рост производительности.

Преимущества программирования на Kotlin

Данный язык является объектно-ориентированным и статически типизированным в то же время. С этим уже связаны определенные преимущества. Статическая типизация подразумевает определение типов переменных на этапе компиляции. В процессе программирования тип переменной объявляется явно (smart casts упрощает этот процесс, автоматизируя приведение к типу) и вы получаете обратную связь о типах данных при компиляции. Такая инспекция упреждает ошибки, безопасность кода повышается.

Например, система типов позволяет избежать ошибки NullPointerException. Достигается это за счет введения nullable и non-nullable типов данных, явно указывающих, может ли значение быть null. Безопасный оператор “?” инициирует проверку и обработку null значений, может вызывать методы, обращаться к полям или выполнять другие операции на переменных, которые могут содержать null, без риска вызвать NullPointerException.

val str: String? = null
val length: Int? = str?.length // Если str равно null, то length будет равно null, и нет NPE
data class Person(val name: String?)

val person: Person? = getPerson()
val personName: String? = person?.name // Если person равно null, то personName будет равно null
val result: Int? = a?.b?.c?.d
// Если хотя бы одно из a, b, c равно null, то result будет равно null

А в объектно-ориентированном программировании действует концепция, где объект представляет собой экземпляр класса, объединяющий данные (поля) и методы, оперирующие этими данными. Такая парадигма обеспечивает принципы инкапсуляции, наследования и полиморфизма, что делает код более организованным, повторно используемым, легким в сопровождении.

К примеру, класс с модификатором “sealed”, объединяет все свои подклассы в рамках одной иерархии, исключая лишнее расширение классов в других частях кода. Если он уже используется с выражением “when”, а вы добавляете новый подкласс, компилятор предупредит вас, что новый класс в этом “when” не учтен.

sealed class Result {
    data class Success(val data: String) : Result()
    data class Error(val message: String) : Result()
    object Loading : Result()
}

fun processResult(result: Result) {
    when (result) {
        is Result.Success -> println("Success: ${result.data}")
        is Result.Error -> println("Error: ${result.message}")
        Result.Loading -> println("Loading...")
    }
}

К сильным сторонам следует отнести поддержку функционального программирования. Это: анонимные функции, в том числе с лямбда-выражениями, для простой передачи функции как аргумента; высшие функции, принимающие другие функции как аргумент или возвращающие их как результат; расширения для добавления новых функций к существующим классам без создания подклассов; иммутабельные (неизменяемые) коллекции, соответствующие функциональному стилю программирования. 

И конечно, Kotlin multiplatform (KMP) - разработанная все теми же JetBrains технология, позволяющая одному разработчику писать приложения под разные платформы (мобайл, веб, десктоп, серверная разработка). В контексте мобайла это позволяет программисту сразу писать общий код под Android и iOS. Есть интеграция с Android Studio и Xcode, платформо-специфичные модули для реализации возможностей разных платформ. 

Кратко перечислить основные плюсы можно так:

  • Мультиплатформенность (компиляция/транспиляция в Native/JS);

  • Безопасность типов;

  • Строковые шаблоны;

  • Многофункциональность;

  • Лаконичный, интуитивно понятный синтаксис;

  • Корутины, встроенные в сам язык, а не как библиотечная функция;

  • Удобная работа с исключениями и коллекциями;

  • Data-классы с автогенерацией стандартных методов;

  • Расширяемость классов без необходимости наследования;

  • Полная совместимость с Java.

Недостатки Kotlin

Минусы тоже в наличии. Как уже упоминалось, сообщество часто ругает Kotlin за низкую скорость компилляции в больших проектах. Кого-то это просто раздражает, а для кого-то задержки критичны. Не всегда плагин для компилятора покрывает проблему, но и не всегда дело в нем. Разные библиотеки показывают разную совместимость с плагином. Новые решения по оптимизации, хочется верить, будут, как это случилось при внедрении Kotlin в Android Studio, где проблемы производительности со временем были решены.  

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

Размер бинарных файлов, созданных в компиляторе обычно несколько больше, чем в Java, хотя это объясняется подключением дополнительных библиотек. Не столько недостаток, сколько фактор, который иногда нужно учесть.

Отложенная инициация переменной до первого обращения к ней (lateinit) может вызвать критические ошибки в программе. Обычно это используется для переменных с типами данных, которые нельзя инициализировать в конструкторе. Такая переменная не может быть null, иначе при попытке доступа к ней до инициации получим исключение UninitializedPropertyAccessException. Использовать следует осторожно — только если вы уверены, что переменная будет инициализирована перед использованием.

Где стоит применять Kotlin?

Конечно, первое, что приходит в голову — разработка приложений для Android, ведь это официальный язык программирования для этой платформы, но не Андроидом единым жив Котлин. Область его применения на самом деле гораздо шире — от написания скриптов до разработки игр.

Помимо написания Android-приложений, применять язык можно:

  • В создании iOS-приложений. Конечно, это чревато ограниченной поддержкой iOS-библиотек, проблемами интеграции с IDE XCode, но в целом такая возможность есть и реализовать ее бывает уместно, если глубокая интеграция с экосистемой iOS не нужна; 

  • В серверной разработке. Создать серверное приложение — выполнимая задача для Kotlin. Язык содержит библиотеки, полезные для обработки асинхронных операций на сервере, поддерживается известными фреймворками (Spring, Ktor, Vert);

  • В разработке Desktop-приложений. Можно создавать кроссплатформенные desktop-приложения с использованием библиотеки JavaFX;

  • В анализе данных, Data Science. Целесообразно применение и в этой области. Совместимость  с Java способствует работе в экосистеме инструментов для анализа данных, например, Apache Spark.

Подытожив, скажу, что хотя возможности Kotlin на данным момент актуальны в первую очередь для создания Android-приложений, его мультиплатформенность относит язык к категории универсальных, а синтаксический сахар, безопасность кодирования и богатый выбор функций часто мотивируют начинающего программиста изучать именно этот язык.

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

Tags:
Hubs:
Total votes 7: ↑2 and ↓5-3
Comments17

Articles