Котлин

мой язык продуктивности

Существует множество языков программирования, и я, например, люблю их изучать. Для меня изучение обычно - это чтение документации, следование разделу «Начало работы» и возня с некоторыми языковыми конструкциями. Иногда даже воссоздаю небольшую библиотеку, которую я недавно создал на каком-то другом языке.

Тем не менее, эти языки почти никогда не попадают в мой набор инструментов по умолчанию. Причины этого, естественно, разнообразны, но в то же время одни из этих причин проявляются чаще, чем другие. Размер и качество сообщества - одна из этих причин. Для меня очень важен тот факт, что существует множество библиотек и фреймворков, которые помогают мне решать общие проблемы, а также энтузиазм и энтузиазм людей, стоящих за этим программным обеспечением. Во-вторых, некоторые языки полностью меняют парадигму. Я не против изменить способ ведения дел, но нужно поддерживать других людей, а это не всегда вариант.

Так что в конце концов я склоняюсь к тому, что я уже знаю, а именно к Java, C # и JavaScript. Отличные сообщества с отличной поддержкой и множеством строительных блоков. Поэтому вполне логично, что я с повышенным интересом смотрю на языки, которые компилируются для этих платформ. Эти конкретные языки могут использовать уже большие сообщества.

Один из таких языков - Котлин. Этот язык разрабатывается JetBrains, компанией, стоящей за популярной IDE IntelliJ IDEA. Так что поддержка IDE действительно первоклассная. Kotlin нацелен в первую очередь на среду выполнения Java. С появлением версии 1.0 все усилия теперь идут на полировку языка. После этого уже поддерживаемая платформа JavaScript получит больше внимания.

Функции

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

Кажется, что многие языки родились из-за разочарования в каком-то другом языке. Хотя это может относиться и к Kotlin, я чувствую, что парни и девушки из JetBrains по-прежнему признают Java отличным языком. Но Java, как и любой другой язык, который стареет, становится сложнее добавлять функции и улучшать язык. Вы можете изменить язык только до определенной степени, чтобы сохранить обратную совместимость. Так что Java не ошибается, она просто стареет, и иногда это проявляется. Вино тоже стареет.

Что Kotlin делает, так это берет наш опыт работы с Java и другими языками и пытается улучшить полученные уроки. Вам нужно всего лишь пролистать пару сообщений на форуме или в блоге команды JetBrains, чтобы найти цитаты из «Эффективной Java» или тому подобное. Это реальность на языке, а не на академических кругах.

Одна из моих любимых жемчужин - это то, как Kotlin обрабатывает `null`. Да, он обрабатывает `null`, как и следовало ожидать от языка, который просто совместим с Java. Он просто справляется с этим более разумно. Возьмем, к примеру, типичный метод Java:

public void foo(Bar bar) { /*…*/ }

Теперь существует множество случаев, когда у нас нет абсолютно разумного способа обработки `null`, если это передано в этот метод. Итак, разумно проверить ввод:

public void foo(Bar bar) { 
  if (bar == null) 
    throw IllegalArgumentException(); /*…*/
}

Теперь так лучше. По крайней мере, мы получаем исключение с, надеюсь, информативным сообщением, которое говорит нам, что этот метод не может нормально обрабатывать `null` s. Но это всего лишь среда выполнения, так что мы еще не в зеленой зоне. Было бы даже лучше, если бы мы могли сообщить нашим коллегам о нашем намерении, что мы не хотим, чтобы там были какие-либо `null`. Итак, мы улучшаемся еще больше:

public void foo(@NotNull Bar bar) { 
  if (bar == null) 
    throw IllegalArgumentException() /*…*/
}

Мы еще больше улучшили наш пример, заявив, что недопустимы `null`. Такие инструменты, как IntelliJ IDEA, обнаруживают на сайте вызова, что вы можете передать `null` методу, который не может его обработать, и информируют вас об этом, отлично! В этом коде нет ничего плохого, он просто немного многословен для того намерения, которое мы пытались выразить.

Так появился Kotlin, который работает с `null` немного иначе. Kotlin делает различие между типами, допускающими значение NULL, и типами, не допускающими значения NULL. Каждый тип можно сделать допускающим значение NULL, просто поставив вопросительный знак в конце имени типа, поэтому `Bar` не допускает значения NULL, а ` Bar? ` прост. как. Наш предыдущий пример Java можно переписать на Kotlin следующим образом:

public fun foo(bar : Bar) { /*…*/ }

Честно говоря, этот пример не совсем тот же код, потому что в нем отсутствует проверка `null` варианта Java, которая могла бы вызвать исключение. Но дело в том, что нам не нужно. Компилятор Kotlin следит за тем, чтобы в этой функции не использовался `null`, поскольку такая попытка просто не будет компилироваться.

Теперь я могу рассказать обо всех умных вещах, которые происходят на сайте вызова в отношении `null` s, но, как я уже сказал ранее, я не занимаюсь сравнением некоторых функций. Мое намерение состояло в том, чтобы продемонстрировать, как Kotlin пытается улучшить уроки, извлеченные из многолетних реальных проектов.

Лаконичность

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

Для меня самое главное в выразительности, и, к счастью, именно так объясняют это большинство людей, которых я знаю, - это выражение намерения (единожды). Речь, конечно же, не идет о максимальной краткости, это просто положительный побочный эффект. Речь идет о удобочитаемости. Итак, насколько хорошо фрагмент кода объясняет другому разработчику цель кода?

У меня такое чувство, и я не могу это объективно сказать, что Kotlin находится в самом лучшем случае выразительности. Код остается достаточно читаемым для начинающего разработчика Kotlin, но достаточно мощным для опытного.

Совместимость

Как я уже говорил ранее, для меня важна возможность использовать работы существующего сообщества. Вот где действительно сияет Котлин. Совместимость с Java просто великолепна. Вы можете не только вызывать код Java без каких-либо фасадов или другой промежуточной логики, вы также можете вызывать код Kotlin из Java с такой же легкостью. Рискуя быть привлеченным к суду со стороны крупной фруктовой компании, я должен сказать: «Это просто работает».

Взаимодействие идет даже дальше, чем возможность вызова Java из Kotlin и наоборот. Файлы Kotlin и Java можно свободно смешивать. Таким образом, даже существующие проекты могут использовать Kotlin, это не обязательно должно быть решение «все или ничего». Так что этот хорошо протестированный и хорошо проинвестированный фрагмент основного кода может остаться прежним.

Kotlin работает на Java 6, и это отличная новость для разработчиков Android. Разработчики Android, похоже, упускают из виду все улучшения, которые Java претерпела за последние годы, и в первую очередь лямбда-выражения Java 8. С Kotlin разработчики Android прямо сейчас получают такие вещи, как лямбда-выражения!

Вот почему

Так что я почти не рассмотрел какую-либо особенность Kotlin, но если вам интересно, вы можете почитать документацию или поиграть в сети. В основном я хотел показать, почему мне нравится Kotlin, помимо простых языковых функций. Меня действительно волнует сосредоточенность на продуктивности. Никакой реальной смены парадигмы, а в основном совместимость. Котлин - мое новое любимое оружие.