Этот пост является вольным переводом статьи Kotlin and Swift. Is it a whole new era in Mobile Development? by Andrew Cherkashyn
Когда в Google объявили о том, что они теперь официально будут использовать Kotlin для разработки под Android, я, как и многие другие Android-разработчики, вздохнул с облегчением. Я еще раз зашел на официальный сайт Kotlin, чтобы перепроверить функционал/синтаксис и сравнить его с последней версией Swift, на котором сейчас пишу, и вдруг ощутил это: проходит одна эпоха и начинается новая, по крайней мере в мобильной разработке…
В Kotlin, как и в Swift довольно много синтаксического сахара, который снижает объемы обычной рутины (сравнение синтаксиса тут: http://nilhcem.com/swift-is-like-kotlin/). Но что меня особенно радует — они оба, прям "из коробки", поддерживают новые парадигмы программирования. Особенно функциональное программирование.
Принципы функционального программирования, конечно, не являются чем-то новым в разработке, даже наоборот. Но теперь, когда есть официальная поддержка "из коробки" в разработке под iOS и Android — стоит пользоваться именно ими.
Когда я только начинал свою карьеру в мобильной разработке, все писали циклы как-то так:
Java:
String[] mixedArray = new String[] { "4", "5", "a", "-2", "Str" }; int results = 0; for (String element : mixedArray) { results += Integer.parseInt(element); }
Теперь же все используют функциональный подход, чтобы сделать все то же самое за один вызов, и этот подход намного лучше:
Kotlin:
val mixedArray = arrayOf("4", "5", "a", "-2", "Str") val results = mixedArray .filter { obj -> obj.toIntOrNull() != null } .map { x -> x.toInt() } .reduce { acc, x -> acc + x }
Swift:
let mixedArray = ["4", "5", "a", "-2", "Str"] let results = mixedArray .filter({ (obj) -> Bool in return Int(obj) != nil }) .map { (obj) -> Int in return Int(obj)! } .reduce(0, +)
Блоки были представлены Apple для Objective-C в 2010 году (iOS SDK 4.0), чтобы улучшить жизнь разработчиков и соответствовать анонимным классам в Java, которые могут быть использованы как коллбэки:
Пример блока в Objective-C:
void (^newBlock)(void) = ^{ NSLog(@"New block is called"); };
Пример анонимного класса в Java:
(new CallbackClass() { @Override public void call() { Log.i(StaticTag, "Callback is called"); } });
Лямбда-выражения в Java были представлены в 2014, как часть JDK 8, но к сожалению они не были доступны Android-разработчикам, потому что Android SDK поддерживает только JDK версии 7 (поэтому и есть такие библиотеки, как retrolambda: https://github.com/evant/gradle-retrolambda).
Теперь же оба языка полностью поддерживают такой подход: в Swift — "замыкания" (то же самое, что блоки в Objective-C), а у Kotlin есть поддержка "лямбд", которая работает в Android SDK:
Пример замыкания в Swift:
{ _ in print("Closure is called!") }
Пример лямбды в Kotlin:
{ println("lambda is called!") }
Начиная с Xcode 4, где-то с 2011, Objective-C предоставляет однострочную инициализацию для массивов и словарей:
Пример инициализация в Swift:
let numbersArray = [2, 4, 1] let dictionary = ["key1": "value1", "key2": "value2"
В JDK доступна только статическая инициализация, но нет способа инициализировать Map в одну строку. Функция Map.of которая позволяет это, была представлена только в JDK 9.
Пример статической инициализации в Java:
// Array private static final int[] numbersArray = new int[] {2, 4, 1}; // Map private static final Map<String, String> map; static { map = new HashMap<String, String>(); map.put("key1", "value1"); map.put("key2", "value2"); }
Но теперь Kotlin умеет делать так:
mapOf<String, String>("key1" to "value1", "key2" to "value2")
Еще одна вещь, которую я хочу выделить — Range операторы, которые делают вашу жизнь намного проще. Теперь вместо использования циклов for для простого обхода:
for (int i = 0; i < N; i++) { // Do something }
Вы можете делать в Kotlin так:
for (i in 0..N-1) { // Do something }
Или вот так в Swift:
for i in 0..<N { // Do Something }
Стоит еще упомянуть о кортежах (tuples). Они дают определенную свободу во взаимодействии с другими компонентами и помогают избегать создания дополнительных классов.
Итак, глядя на все эти новые "фичи" и многие-многие другие вещи, которые не упомянуты в этой статье — я бы предположил, что новая эпоха уже началась. Теперь всем новичкам, которые начинают свой путь в мобильной разработке, будут доступны все эти функции прямо "из коробки", и они смогут сократить затраты на рутинную разработку бизнес-логики и управление приложением. И это намного важнее, чем писать сотни строк для того чтоб сделать простой кусок работы. Конечно, раньше вы могли просто поставить и настроить дополнительную библиотеку, такую как PromiseKit, ReactiveCocoa, RxJava и т.п. Но я верю, что доступность этих парадигм и принципов — будет побуждать новых разработчиков использовать именно их, что приведет нас к светлому будущему. 🙂
Спасибо за внимание! Я надеюсь вам было интересно или, как минимум, это пост дал вам свежие идеи. Я пытался написать коротко, но если вам нужны более конкретные примеры и/или у вас есть предложения/замечания — пожалуйста, напишите в комментариях!
ссылка на оригинал статьи https://habrahabr.ru/post/329870/
Добавить комментарий