КОНЦЕПЦІЯ РЕАКТИВНОГО ПРОГРАМУВАННЯ ПРИ РОЗРОБЦІ СУЧАСНИХ ВЕБ-РІШЕНЬ
11.09.2021 10:58
[1. Information systems and technologies]
Author: Соботник Е.Л., магістрант спеціальності інженерія програмного забезпечення, кафедра інженерії програмного забезпечення, Івано-Франківський національний технічний університет нафти і газу, м. Івано-Франківськ;
Бандура В.В., к.т.н, доцент, кафедра інженерії програмного забезпечення, Івано-Франківський національний технічний університет нафти і газу, м. Івано-Франківськ
Основними концепціями реактивного програмування займалися чимало науковців. Зокрема, Evan Czaplicki та Stephen Chong у своїй праці «Asynchronous functional reactive programming for GUIs» [1] висвітлили основні проблеми асинхронного реактивного програмування при створенні графічних інтерфейсів користувача, а також Paul Hudak та Zhanyong Wan описали принцип роботи функціонального реактивного програмування у праці «Functional reactive programming from first principles» [2]. Усі вони звертали увагу на загальні твердження та принципи створення реактивного програмного коду, проте галузі веб-рішень була приділена досить мала увага.
Термін «реактивне програмування» відноситься до парадигми, побудованої навколо реакції на зміни мережевих компонентів, що реагують на події вводу-виводу, контролерів інтерфейсу, що реагують на події графічного інтерфейсу тощо. Звідси випливає, що у мовах програмування має бути можливість легко виражати статичні чи динамічні потоки даних, а реалізована модель виконання буде автоматично розсилати зміни через певний потік даних. Сучасні мови програмування підтримують в основному концепт імперативного програмування. Імперативне програмування можна пояснити, використовуючи сценарій у реальному світі. Щоб перевірити нові електронні листи, користувач може увійти до поштового сервісу та продовжувати оновлювати сторінку, щоб перевірити, отримав він нові електронні листи чи ні. У такому підході пояснюється кожен крок, що займається досягненням результату. Він використовує явні операції для вираження змін у програмному стані. Тобто нехай у програмному коді є три змінні: a, b, c. Далі описується їхнє додавання та присвоєння змінній a (a = b + c). У такому випадку при імперативному підході після виконання даного оператора як тільки одна зі змінних змінюється, то інші не перераховуються. Це не є помилкою, проте сучасні веб-рішення потребують дещо іншого підходу. Їм необхідно відстежувати будь-які зміни стану, щоб відображати користувачеві завжди актуальний.
Реактивне програмування може бути статичним, де потоки даних встановлюються один раз за всю програму, або бути динамічним, де потоки даних можуть змінюватися під час виконання програми. Використання умовних переходів у графі потоків даних може деякою мірою змусити статичний граф потоку даних виглядати як динамічний, при цьому зменшуючи відмінність і вводячи інженерів програмного забезпечення в оману. Проте часто динамічне реактивне програмування може використовувати й імперативне програмування для реконструкції графа потоку даних.
Можна помітити, що реактивне програмування є достатньо схожим із шаблоном проектування «Спостерігач». У певному сенсі так, проте і не зовсім. Інтеграція концепцій потоку даних в мову програмування полегшить їх висловлення і таким чином може збільшити ступінь деталізації графа потоку даних. Наприклад, шаблон «Спостерігач» зазвичай описує потоки даних між цілими класами/об'єктами, в той час як об'єктно-орієнтоване реактивне програмування може націлюватися на членів об'єктів і класів. Далі буде розглянуто приклад реактивного коду, що дозволить краще зрозуміти різницю між «Спостерігачем» та принципом реактивності.
Загалом реактивні веб-додатки пишуть за допомогою мови JavaScript, а також з використанням уже готових бібліотек та фреймворків, таких як React, Angular, Vue, Ember, Meteor, Mithrill тощо. Проте у даній праці нами буде висвітлено базовий принцип створення реактивного коду засобами JavaScript [3].
Як бачимо з лістингу вище, засоби JavaScript дозволяють відстежувати читання та зміну значень атрибутів будь-яких об’єктів, оголошених звичайним способом. При читанні значення ми зберігаємо контекст виконання, а при зміні значень ми повідомляємо усім залежностям, що даний атрибут був змінений. За повідомлення зміни значень та прив’язування контексту відповідає наш самописний клас «Dependency», який містить у собі інформацію про можливих «слухачів» даного значення. Таким чином, якщо повернутися до прикладу зі змінними a, b, c, то при мутації змінних b чи c змінна а повинна автоматично перерахуватися, що і є основним концептом реактивного програмування.
Отже, реактивне програмування не є прив’язаним до конкретної мови програмування та не є залежним від інших технологій. При правильному розумінні даної архітектури її можна реалізувати, використовуючи будь-які високорівневі мови програмування, наприклад C#, Java, Python тощо. Загалом дійшли висновку, що такий концепт забезпечує актуальний стан веб-рішень, а також спрощує взаємодію потоків даних, проте іноді доводиться звертати увагу на статичні та динамічні потоки, адже саме від вибору типу потоків даних залежатиме подальша реалізація будь-якої інформаційної системи.
Список використаних джерел:
1. Evan Czaplicki and Stephen Chong. 2013. Asynchronous functional reactive programming for GUIs. SIGPLAN Not. 48, 6 (June 2013), 411–422. DOI: https://doi.org/10.1145/2499370.2462161
2. Zhanyong Wan and Paul Hudak. 2000. Functional reactive programming from first principles. In Proceedings of the ACM SIGPLAN 2000 conference on Programming language design and implementation (PLDI '00). Association for Computing Machinery, New York, NY, USA, 242–252. DOI: https://doi.org/10.1145/349299.349331
3. Pollack G. The Best Explanation of JavaScript Reactivity [Електронний ресурс] / Gregg Pollack – Режим доступу до ресурсу: https://medium.com/vue-mastery/the-best-explanation-of-javascript-reactivity-fea6112dd80d.