Бързо въведение във функционалното реактивно програмиране (FRP)

FRP представлява пресечна точка на две програмни парадигми. Но преди да се разровим по-дълбоко в понятията, трябва да знаем малко повече за някои основни термини.

FRP: реагиране на събитията

Наложително програмиране

Традиционно пишем код, който описва как трябва да реши проблем. Всеки ред код се изпълнява последователно, за да доведе до желания резултат, който е известен като императивно програмиране. Наложителната парадигма принуждава програмистите да напишат „как“ дадена програма ще реши определена задача. Обърнете внимание, че в предишното изявление ключовата дума е „как“.

Ето пример:

нека числата са [1, 2, 3, 4, 5, 6, 7, 8, 9]
var numbersLessThanFive = [Int] ()
за индекс в 0 .. <числа.брой
    {
    ако числа [индекс] <5
        {
        numbersLessThanFive.append (номера [индекс])
        }
    }

Както можете да видите, ние последователно изпълняваме серия от инструкции, за да произведем желания изход.

Функционално програмиране

Функционалното програмиране е парадигма за програмиране, при която моделирате всичко в резултат на функция, която избягва промяна на състоянието и мутиране на данни. Ще обсъдим понятия като изменяемост на състоянието и данните и тяхното значение в следващите раздели, но за справка:

  • разглеждайте състоянието като една от различните пермутации и комбинации, които вашата програма може да има във всеки даден момент по време на нейното изпълнение
  • мутабилност на данните е концепцията, при която даден набор от данни може да се промени за определен период от време по време на изпълнение на програмата.

Същият пример, който беше даден с помощта на императивно програмиране, може да се използва по следния начин, използвайки функционалния подход:

нека числата са [1, 2, 3, 4, 5, 6, 7, 8, 9]
нека numbersLessThanFive = numbers.filter {$ 0 <5}

Функцията за филтриране се захранва със затваряне, съдържащо определен критерий. След това този критерий се прилага към всеки елемент от масива от числа и полученият масив съдържа елементи, които отговарят на нашите критерии.

Забележете декларирането на двата масива и в двата примера.

В първия пример масивът numberLessThanFive е деклариран като var, докато във втория пример същият масив е деклариран като let.

Звъни ли на някакви камбани?

Кой подход е по-добър, с кой масив е по-безопасно да се работи?

Ами ако повече от една нишка се опитва да работи с един и същ масив и неговите елементи?

Не е ли постоянният масив по-надежден?

Реактивно програмиране

Реактивното програмиране е практиката на програмиране с асинхронни потоци данни или потоци от събития. Потокът от събития може да бъде всичко като въвеждане на клавиатура, подслушвания на бутони, жестове, актуализации на местоположението на GPS, акселерометър и iBeacon. Можете да слушате поток и да реагирате на него съответно.

Може би сте чували за реактивното програмиране, но може да ви звучи твърде плашещо, страшно или загадъчно, за да се опитате дори. Може би сте виждали нещо подобно:

var twoDimensionsArray = [[1, 2], [3, 4], [5, 6]]
нека flatArray = twoDimensionsArray.flatMap {масив в
    върнете array.map {цяло число в
        връщане на цяло число * 2
    }
}

отпечатате (flatArray)

Изход: [2, 4, 6, 8, 10, 12]

На пръв поглед предходният код може да се почувства малко неясен и това може да е причината да обърнете гръб на този стил на програмиране. Реактивното програмиране, както споменахме по-рано, е програмиране с потоци от събития.

По-големият въпрос обаче остава без отговор. Какво е функционално реактивно програмиране (FRP)?

FRP е комбинацията от функционални и реактивни парадигми. С други думи, той реагира на потоци от данни, използвайки функционалната парадигма. FRP не е помощна програма или библиотека - тя променя начина, по който архитектирате приложенията си и начина, по който мислите за вашите приложения.

В следващия блог ще говоря за основните градивни елементи на реактивното програмиране - дотогава следете и се наслаждавайте на четенето :)

За да се запознаете добре с реактивните концепции и да пишете приложения за iOS в RxSwift, можете да прочетете моята книга: Реактивно програмиране в Swift 4.

Повече от моите проекти и код за изтегляне са в моите публични репозитори на github

Можете да прочетете повече по темата тук

Благодаря за четенето, моля, споделете го, ако намерихте за полезно :)