Pull to refresh

Kotlin и Swift. Новая эпоха в мобильной разработке?

Reading time4 min
Views28K

Этот пост является вольным переводом статьи Kotlin and Swift. Is it a whole new era in Mobile Development? by Andrew Cherkashyn


Когда в Google объявили о том, что они теперь официально будут использовать Kotlin для разработки под Android, я, как и многие другие Android-разработчики, вздохнул с облегчением. Я еще раз зашел на официальный сайт Kotlin, чтобы перепроверить функционал/синтаксис и сравнить его с последней версией Swift, на котором сейчас пишу, и вдруг ощутил это: проходит одна эпоха и начинается новая, по крайней мере в мобильной разработке...



В Kotlin, как и в Swift довольно много синтаксического сахара, который снижает объемы обычной рутины (сравнение синтаксиса тут). Но что меня особенно радует — они оба, прям "из коробки", поддерживают новые парадигмы программирования. Особенно функциональное программирование.


Принципы функционального программирования, конечно, не являются чем-то новым в разработке, даже наоборот. Но теперь, когда есть официальная поддержка "из коробки" в разработке под 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).


Теперь же оба языка полностью поддерживают такой подход: в 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 и т.п. Но я верю, что доступность этих парадигм и принципов — будет побуждать новых разработчиков использовать именно их, что приведет нас к светлому будущему. :)


Спасибо за внимание! Я надеюсь вам было интересно или, как минимум, это пост дал вам свежие идеи. Я пытался написать коротко, но если вам нужны более конкретные примеры и/или у вас есть предложения/замечания — пожалуйста, напишите в комментариях!

Tags:
Hubs:
+6
Comments55

Articles

Change theme settings